Linux学习-Docker学习之数据卷

Posted 丢爸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习-Docker学习之数据卷相关的知识,希望对你有一定的参考价值。

Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。
如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,即“写时复制(COW)”机制。
Docker容器关闭或重启,其数据不受影响,但删除Docker容器,则其更改将会全部丢失。

存在的问题:

  • 存储于联合文件系统中,不易于宿主机访问
  • 容器间数据共享不便
  • 删除容器其数据会丢失

解决方案:卷(Volume)

“卷”是容器上的一个或多个目录,此类目录可绕过联合文件系统,与宿主机上的某目录绑定(关联)。
卷的初衷是独立于容器的生命周期实现数据持久化,因此删除容器之时不会删除卷,也不会对哪怕未被引用的卷做垃圾回收操作。
卷为docker提供了独立于容器的数据管理机制。

  • 可以把镜像想像成静态文件,把卷类比为动态内容,镜像可以重用,卷可以共享
  • 卷实现了程序(镜像)和数据(卷)分离,以及镜像和制作镜像的主机分离,用户制作镜像时无须再考虑镜像运行的容器所在的主机的环境。
docker -managed volume
[root@docker ~]# docker container run -d --name b1 -v /data tye/busybox:v1.0
0b140ff8f9fe561d7e992e218de82d2b411989af9b12c541d9c06ba856eb6b06
[root@docker ~]# docker container ls
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS         PORTS     NAMES
0b140ff8f9fe   tye/busybox:v1.0   "/bin/httpd -f -h /d…"   10 seconds ago   Up 7 seconds             b1
#在Mounts中可以查看宿主机上的绑定的目录
[root@docker ~]# docker container inspect b1
[
    {
        "Mounts": [
            {
                "Type": "volume",
                "Name": "dfd4248faff65067546fa2a5830a46e7b9e215da81be76c044cfffc5bd421dc9",
                "Source": "/var/lib/docker/volumes/dfd4248faff65067546fa2a5830a46e7b9e215da81be76c044cfffc5bd421dc9/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]
    }
]
#在容器的/data目录下创建一个文件,在宿主机上查看
[root@docker ~]# docker container exec -it 0b140ff8f9fe /bin/sh
/ # cd /data
/data # echo "hello datavolume!!!" > test.html
#在宿主机上查看
[root@docker _data]# pwd
/var/lib/docker/volumes/dfd4248faff65067546fa2a5830a46e7b9e215da81be76c044cfffc5bd421dc9/_data
[root@docker _data]# ls
html  test.html
[root@docker _data]# cat test.html
hello datavolume!!!
Bind -Mount Volume
#启动一个容器并绑定数据卷,如数据卷不存在,则会自动创建
[root@docker _data]# docker container run -it --name b4 --volume /data/volume/b4:/data busybox
/ # cd /data
/data # echo "hello ,tye" >test.html
#在宿主机的/data/volume/b4目录中查看
[root@docker ~]# cd /data/volume/b4
[root@docker b4]# cat test.html
hello ,tye
共享容器卷
#1.多个容器使用宿主机同一目录
[root@docker2 ~]# docker container run -it --name b1 --rm --volume /data/volume/b:/data busybox
[root@docker2 ~]# docker container run -it --name b2 --rm --volume /data/volume/b:/data busybox
#在/data/volume/b目录下创建一个文件
[root@docker2 ~]# cd /data/volume/b
[root@docker2 b]# echo "share volumes between containers" >index.html
#在容器对应的/data目录下查看
/ # cat /data/index.html
share volumes between containers
#2.复制使用其它容器的卷--volumes-from选项
#--启动基础容器
[root@docker2 ~]# docker container run --name infracon -it --volume /data/infracon/volume:/data/web/html busybox
#--启动下一个容器共享基础容器的网络名称空间,挂载相同的数据卷目录
[root@docker2 ~]# docker container run --name nginx -it --rm --volumes-from infracon --network container:infracon busybox
#查看容器信息
[root@docker2 b]# docker container inspect infracon
[        "Mounts": [
            {
                "Type": "bind",
                "Source": "/data/infracon/volume",
                "Destination": "/data/web/html",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "721d877e68bc4e780ed1c403d63af2787c8d50e70d3e2a2a7b7a2e7884d7ad90",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/721d877e68bc",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "e8802f05f11775f68096ee9d2dd807d636bd68a96f0c2d910e55541bee45e986",
            "Gateway": "10.0.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "10.0.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:0a:00:00:02"
        }
    }
]
#查看容器nginx信息
[root@docker2 b]# docker container inspect -f {{.Mounts}} nginx
[{bind  /data/infracon/volume /data/web/html   true rprivate}]
#---网络信息需要进入容器中查看,通过inspect无法查看到
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:00:02  
          inet addr:10.0.0.2  Bcast:10.0.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:0 (0.0 B)


以上是关于Linux学习-Docker学习之数据卷的主要内容,如果未能解决你的问题,请参考以下文章

轻松学透docker数据卷

Linux学习-Docker学习之私有Registry

Linux学习-Docker学习之Dockerfile

从零开始学 Docker-容器数据卷实战

运维学习之lvm(逻辑卷管理)

docker学习之---安装