Docker的数据卷是可以绕过文件系统的,而且数据卷是可以共享,可重用的
查看数据卷:
<code>[root@docker ~]</code><code># docker inspect -f ``.`Volumes` volume-test1</code>
<code>map[</code><code>/data</code><code>:</code><code>/var/lib/docker/volumes/9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5/_data</code><code>]</code>
<code>[root@docker ~]</code><code># cd /var/lib/docker/</code>
<code>[root@docker docker]</code><code># ls</code>
<code>containers devicemapper graph init linkgraph.db repositories-devicemapper tmp trust volumes</code>
<code>[root@docker docker]</code><code># cd volumes/</code>
<code>[root@docker volumes]</code><code># ls -lrt</code>
<code>total 8</code>
<code>drwxr-xr-x 3 root root 4096 Feb 24 09:29 63ccf5d524567c835c6d542cfc74d1a28d28fdf48a0bca0c517cb8dedf46b632</code>
<code>drwxr-xr-x 3 root root 4096 Feb 24 09:30 9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5</code>
<code>[root@docker volumes]</code><code># cd 9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5/</code>
<code>[root@docker 9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5]</code><code># </code>
<code>[root@docker ~]</code><code># docker run -it --name volume-test1 -h nginx -v /data centos</code>
<code>[root@nginx /]</code><code># ls /data</code>
测试:
1、系统随机生成的目录,进行挂载
<code>容器的宿主机:</code>
<code>[root@docker 9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5]</code><code># ls</code>
<code>_data</code>
<code>[root@docker 9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5]</code><code># cd _data/</code>
<code>[root@docker _data]</code><code># ls</code>
<code>passwd</code>
<code>[root@docker _data]</code><code># dd if=/dev/zero of=test.iso bs=1M count=10</code>
<code>10+0 records </code><code>in</code>
<code>10+0 records out</code>
<code>10485760 bytes (10 MB) copied, 0.00956288 s, 1.1 GB</code><code>/s</code>
<code>passwd</code> <code>test</code><code>.iso</code>
<code>容器内:</code>
<code>[root@nginx /]</code><code># cd /data/</code>
<code>[root@nginx data]</code><code># ls</code>
<code>[root@nginx data]</code><code># cp /etc/passwd .</code>
<code>说明:容器的宿主机的目录已共享给容器使用(删除容器后,原有的数据卷目录中的文件仍旧是存在的)</code>
2、系统指定的目录,进行挂载
<code>宿主机的操作:</code>
<code>[root@docker ~]</code><code># mkdir -p /volume-test2-data</code>
<code>[root@docker ~]</code><code># docker run -it -d --name volume-test2 -h centos7 --restart=always -v /volume-test2-data:/centos-data centos</code>
<code>29e9a41e563d514c8b9f14d14a0426af955651b28109c4851cfec40a186244d0</code>
<code>[root@docker ~]</code><code># docker ps -l</code>
<code>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</code>
<code>29e9a41e563d centos </code><code>"/bin/bash"</code> <code>7 seconds ago Up 5 seconds volume-test2 </code>
<code>[root@docker ~]</code><code># cp -r /usr/share/doc/abrt-2.0.8/ /volume-test2-data/</code>
<code>[root@docker ~]</code><code># ls -l /volume-test2-data/</code>
<code>total 4</code>
<code>drwxr-xr-x 2 root root 4096 Feb 24 09:58 abrt-2.0.8</code>
<code>容器内的操作:</code>
<code>[root@docker ~]</code><code># ./in.sh 29e9a41e563d</code>
<code>[root@centos7 /]</code><code># df -h</code>
<code>Filesystem Size Used Avail Use% Mounted on</code>
<code>/dev/mapper/docker-8</code><code>:3-8388750-29e9a41e563d514c8b9f14d14a0426af955651b28109c4851cfec40a186244d0 9.8G 230M 9.0G 3% /</code>
<code>tmpfs 1.9G 0 1.9G 0% </code><code>/dev</code>
<code>shm 64M 0 64M 0% </code><code>/dev/shm</code>
<code>/dev/sda3</code> <code>193G 11G 173G 6% </code><code>/etc/hosts</code>
<code>[root@centos7 /]</code><code># cd /centos-data/</code>
<code>[root@centos7 centos-data]</code><code># ls</code>
<code>abrt-2.0.8</code>
<code>[root@centos7 centos-data]</code><code># cp /etc/passwd .</code>
<code>abrt-2.0.8 </code><code>passwd</code>
<code>[root@docker _data]</code><code># ls /volume-test2-data/</code>
3、系统指定的目录,进行挂载(可挂载多个,并设置权限,默认为rw权限)
<code>先删除原有的容器</code>
<code>[root@docker ~]</code><code># docker ps</code>
<code>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</code>
<code>29e9a41e563d centos </code><code>"/bin/bash"</code> <code>11 minutes ago Up 11 minutes volume-test2 </code>
<code>8884fc392971 nginx "nginx -g 'daemon of 13 hours ago Up 51 minutes 80</code><code>/tcp</code><code>, 443</code><code>/tcp</code> <code>nginxdocker </code>
<code>14caa9ab03a9 dockerui</code><code>/dockerui</code> <code>"/dockerui"</code> <code>46 hours ago Up 51 minutes 0.0.0.0:9000->9000</code><code>/tcp</code> <code>dockerui_qinwen </code>
<code>e278cabec91e centos </code><code>"/bin/bash"</code> <code>47 hours ago Up 51 minutes centos_aways </code>
<code>删除正在允许的容器时,会有报错信息:</code>
<code> </code>
<code>[root@docker ~]</code><code># docker rm 29e9a41e563d -f</code>
<code>Error response from daemon: Cannot destroy container 29e9a41e563d: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f</code>
<code>Error response from daemon: no such </code><code>id</code><code>: -f</code>
<code>Error: failed to remove containers: [29e9a41e563d -f]</code>
<code>8884fc392971 nginx "nginx -g 'daemon of 13 hours ago Up 52 minutes 80</code><code>/tcp</code><code>, 443</code><code>/tcp</code> <code>nginxdocker </code>
<code>14caa9ab03a9 dockerui</code><code>/dockerui</code> <code>"/dockerui"</code> <code>46 hours ago Up 52 minutes 0.0.0.0:9000->9000</code><code>/tcp</code> <code>dockerui_qinwen </code>
<code>e278cabec91e centos </code><code>"/bin/bash"</code> <code>47 hours ago Up 52 minutes centos_aways </code>
<code>先停止容器,然后再进行删除: </code>
<code>[root@docker ~]</code><code># docker stop 29e9a41e563d</code>
<code>29e9a41e563d</code>
<code>[root@docker ~]</code><code># docker rm 29e9a41e563d</code>
<code>[root@docker ~]</code><code># docker ps </code>
<code>e278cabec91e centos </code><code>"/bin/bash"</code> <code>47 hours ago Up 52 minutes centos_aways </code>
<code>运行一个基于centos镜像的容器,容器名称为volume-test2,并设置容器中的主机名为centos7(仅对容器有效),挂载本地的</code><code>/volume-test2-data</code><code>以及</code><code>/opt</code><code>目录,并且指定</code><code>/opt</code><code>目录对容器是只读的</code>
<code>[root@docker ~]</code><code># docker run -it -d --name volume-test2 -h centos7 --restart=always -v /volume-test2-data:/centos-data -v /opt:/opt:ro centos</code>
<code>37652d4601948fe8421c0371278e9bee8c5cbb35f16c7bf755764d56ddafa304</code>
<code>37652d460194 centos </code><code>"/bin/bash"</code> <code>16 seconds ago Up 15 seconds volume-test2 </code>
<code>[root@docker ~]</code><code># ./in.sh 37652d460194</code>
<code>[root@centos7 /]</code><code># cd /opt/</code>
<code>[root@centos7 opt]</code><code># ls</code>
<code>rh</code>
<code>opt.iso rh</code>
<code>[root@centos7 opt]</code><code># touch 123.txt</code>
<code>touch</code><code>: cannot </code><code>touch</code> <code>‘123.txt’: Read-only </code><code>file</code> <code>system</code>
<code>--volume-from:</code>
<code>继承容器数据卷的操作:</code>
<code>[root@docker ~]</code><code># docker run -it -d --restart=always --name volume-test04 --volumes-from volume-test2 centos</code>
<code>94ea720a2c418286d26068d126df35523742e2f910685863f876c3ba9c09638c</code>
<code>94ea720a2c41 centos </code><code>"/bin/bash"</code> <code>6 seconds ago Up 4 seconds volume-test04 </code>
<code>[root@docker ~]</code><code># ./in.sh 94ea720a2c41</code>
<code>[root@94ea720a2c41 /]</code><code># ls /</code>
<code>anaconda-post.log centos-data etc lib lost+found mnt proc run srv tmp var</code>
<code>bin dev home lib64 media opt root sbin sys usr</code>
<code>[root@94ea720a2c41 /]</code><code># cd /opt/</code>
<code>[root@94ea720a2c41 opt]</code><code># ls</code>
<code>[root@94ea720a2c41 opt]</code><code># cd /centos-data/</code>
<code>[root@94ea720a2c41 centos-data]</code><code># ls</code>
<code>[root@94ea720a2c41 centos-data]</code><code># touch 12345.txt</code>
<code>[root@94ea720a2c41 centos-data]</code><code># cd /opt</code>
<code>[root@94ea720a2c41 opt]</code><code># touch 111</code>
<code>touch</code><code>: cannot </code><code>touch</code> <code>‘111’: Read-only </code><code>file</code> <code>system</code>
<code>拥有volume-test2的容器的操作:</code>
<code>94ea720a2c41 centos </code><code>"/bin/bash"</code> <code>45 seconds ago Up 43 seconds volume-test04 </code>
<code>37652d460194 centos </code><code>"/bin/bash"</code> <code>About an hour ago Up About an hour volume-test2 </code>
<code>8884fc392971 nginx "nginx -g 'daemon of 14 hours ago Up About an hour 80</code><code>/tcp</code><code>, 443</code><code>/tcp</code> <code>nginxdocker </code>
<code>14caa9ab03a9 dockerui</code><code>/dockerui</code> <code>"/dockerui"</code> <code>47 hours ago Up About an hour 0.0.0.0:9000->9000</code><code>/tcp</code> <code>dockerui_qinwen </code>
<code>e278cabec91e centos </code><code>"/bin/bash"</code> <code>2 days ago Up About an hour centos_aways </code>
<code>[root@centos7 /]</code><code># ls</code>
<code>12345.txt abrt-2.0.8 </code><code>passwd</code>
进一步进行测试:
<code>宿主机上的操作:</code>
<code>94ea720a2c41 centos </code><code>"/bin/bash"</code> <code>14 minutes ago Up 14 minutes volume-test04 </code>
<code>8884fc392971 nginx "nginx -g 'daemon of 14 hours ago Up 2 hours 80</code><code>/tcp</code><code>, 443</code><code>/tcp</code> <code>nginxdocker </code>
<code>14caa9ab03a9 dockerui</code><code>/dockerui</code> <code>"/dockerui"</code> <code>47 hours ago Up 2 hours 0.0.0.0:9000->9000</code><code>/tcp</code> <code>dockerui_qinwen </code>
<code>e278cabec91e centos </code><code>"/bin/bash"</code> <code>2 days ago Up 2 hours </code>
<code>[root@docker ~]</code><code># docker stop 37652d460194</code>
<code>37652d460194 </code>
<code>e278cabec91e centos </code><code>"/bin/bash"</code> <code>2 days ago Up 2 hours centos_aways </code>
<code>[root@docker _data]</code><code># cd /volume-test2-data</code>
<code>[root@docker volume-test2-data]</code><code># ls</code>
<code>[root@docker volume-test2-data]</code><code># ls -lrt</code>
<code>-rw-r--r-- 1 root root 692 Feb 24 10:01 </code><code>passwd</code>
<code>-rw-r--r-- 1 root root 0 Feb 24 11:16 12345.txt</code>
<code>[root@94ea720a2c41 centos-data]</code><code># ls -lrt</code>
<code>drwxr-xr-x 2 root root 4096 Feb 24 01:58 abrt-2.0.8</code>
<code>-rw-r--r-- 1 root root 692 Feb 24 02:01 </code><code>passwd</code>
<code>-rw-r--r-- 1 root root 0 Feb 24 03:16 12345.txt</code>
<code>[root@94ea720a2c41 centos-data]</code><code>#</code>
说明:
1、验证后可以发现,ro权限是正常的
2、这种映射在Dockerfile里面是没法使用的
3、这里我们不管volume-test2 所属的容器是否正在允许,在新主机中均能够继承
本文转自 冰冻vs西瓜 51CTO博客,原文链接:http://blog.51cto.com/molewan/1744570,如需转载请自行联系原作者