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学习之数据卷的主要内容,如果未能解决你的问题,请参考以下文章