• Docker 第六章 存储卷


    Docker volume 的几种形态

    有状态容器都有数据持久化需求。前一篇文章中提到过,Docker 采用分层文件系统时,文件系统的改动都是发生在最上面的容器层。在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。
    

      不使用 Docker volume

    默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。
    

      

      Data volume (数据卷)

    一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。有如下几种方式来使用 data volume:
    

      (1)使用 “-v 容器内目录” 形式

    [root@localhost ~]# docker run -dit --name v1 -v /test_data busybox
    ca436842125042039399e9b8c5854d1e45e27c9798f4f4547749f6f07593643e
    [root@localhost ~]# 
    

      

      "Mounts": [           -v /test_data 在docker 容器中创建一个 test_data 目录并且通过联合文件系统将docker 自动创建的目录挂在到一起,我理解相当于容器和宿主机文件目录的互相映射
                {
                    "Type": "volume",
                    "Name": "16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45",
                    "Source": "/var/lib/docker/volumes/16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45/_data",
                    "Destination": "/test_data",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    

      

    [root@localhost ~]# docker exec -it ca4368421250 sh
    
    / # ls
    bin        etc        proc       sys        tmp        var
    dev        home       root       test_data  usr
    / # 
    其实,在busybox  容器被删除后,/var/lib/docker/volumes/16eebb552f650fe30b7e896bd7d1b30b530e8ec566809f133c7e277665316f45/_data目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了 
    

      

    使用 -v 来挂载一个主机上的目录到容器的目录  

    #format :    -v host_file:docker_faile
     
    [root@localhost /]# docker run -it --name v2 -v /boot:/boot busybox / # ls bin boot dev etc home proc root sys tmp usr var / # cd boot /boot # ls System.map-3.10.0-957.el7.x86_64 config-3.10.0-957.el7.x86_64 efi grub grub2 initramfs-0-rescue-3e3864368ff04293b38d71342d1cb389.img initramfs-3.10.0-957.el7.x86_64.img initramfs-3.10.0-957.el7.x86_64kdump.img symvers-3.10.0-957.el7.x86_64.gz vmlinuz-0-rescue-3e3864368ff04293b38d71342d1cb389 vmlinuz-3.10.0-957.el7.x86_64

      

    使用 data container

    如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。比如:
    
    创建一个 data container:
    
    #format  :  --volumes-from v2   #继承某个容器的卷文件

    [root@localhost boot]# docker run -it --name v3 --volumes-from v2 busybox / # / # ls bin boot dev etc home proc root sys tmp usr var / # ls /boot System.map-3.10.0-957.el7.x86_64 config-3.10.0-957.el7.x86_64 efi grub grub2 initramfs-0-rescue-3e3864368ff04293b38d71342d1cb389.img initramfs-3.10.0-957.el7.x86_64.img initramfs-3.10.0-957.el7.x86_64kdump.img symvers-3.10.0-957.el7.x86_64.gz vmlinuz-0-rescue-3e3864368ff04293b38d71342d1cb389 vmlinuz-3.10.0-957.el7.x86_64

      

    使用 docker volume 命令

    [root@localhost boot]# docker volume --help
    
    Usage:	docker volume COMMAND
    
    Manage volumes
    
    Commands:
      create      Create a volume
      inspect     Display detailed information on one or more volumes
      ls          List volumes
      prune       Remove all unused local volumes
      rm          Remove one or more volumes
    
    Run 'docker volume COMMAND --help' for more information on a command.
    [root@localhost boot]# 
    

    Docker 新版本中引入了 docker volume 命令来管理 Docker volume。

    (1)使用默认的 ‘local’ driver 创建一个 volume

    [root@localhost boot]# docker volume create --name voll
    voll
    [root@localhost boot]# docker volume inspect voll
    [
        {
            "CreatedAt": "2019-06-12T22:58:45-04:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/voll/_data",
            "Name": "voll",
            "Options": {},
            "Scope": "local"
        }
    ]
    [root@localhost boot]# 
    

    使用这个 volume

    [root@localhost _data]# docker run -it --name v6 -v voll:/volume busybox
    / # ls
    bin     dev     etc     home    proc    root    sys     tmp     usr     var     volume
    / # cd volume/
    /volume # ls
    1qaz
    /volume # 
    

      

    可以使用 docker rm -vf 命令在删除容器时删除该容器的卷。
    

     

    [root@localhost /]# docker volume ls   #强制删除容器和卷文件
    DRIVER              VOLUME NAME
    local               d8a9ddb3f7ce482f170b88485b1f5802a9437c0921daf5e77ab170a18bf4ad4e
    [root@localhost /]# docker rm -vf v1
    v1
    [root@localhost /]# docker volume ls
    DRIVER              VOLUME NAME
    [root@localhost /]# docker container ls -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [root@localhost /]# 
    

      

     

    github 上有很多脚本可以自动化地清理孤单卷,比如:

      

      

      

      

  • 相关阅读:
    Flutter竟然发布了1.5版本!!!!
    微软最爽命令行工具发布!
    被忽略的CSS规则
    代码精进之路读后感(六-结束篇)
    深入解析QML引擎, 第4部分: 自定义解析器
    深入解析QML引擎, 第3部分: 绑定类型
    深入解析QML引擎, 第2部分: 绑定(Bindings)
    编译V8过程全纪录
    面试总结
    Qt网络编程
  • 原文地址:https://www.cnblogs.com/zy09/p/11015035.html
Copyright © 2020-2023  润新知