版本:19.03.5
数据卷是一种特殊的目录或文件,可以实现宿主主机和容器数据共享,这个目录或文件是存在于宿主主机上的。
当容器停止运行并删除后,容器所产生的数据将会丢失,数据卷可以用来保存持久化容器在运行过程中产生的数据,也可以用来当做恢复容器运行所需数据的源。
数据前是独立于容器生命周期,并且可以在被多个容器共享的。
当一个数据圈被多个容器挂载时,则该容器被称为数据容器卷。
数据卷的常用操作:
① 创建容器tomcat-v-1,直接指定数据卷目录 (-v 或 --volume)
# docker run -d --name tomcat-v-1 -v /usr/local/tomcat/webapps/hellodocker -p 9090:8080 tomcat 2aaa2aef9ed14770ffd11fc77f95e360bd8d6b323c7a9b173578a544f2665686 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2aaa2aef9ed1 tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:9090->8080/tcp tomcat-v-1查看数据卷信息
# docker volume ls DRIVER VOLUME NAME local f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f # docker volume inspect f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f [ { "CreatedAt": "2019-12-27T13:45:25-05:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f/_data", "Name": "f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f", "Options": null, "Scope": "local" } ]可以看到数据卷被创建,并生成默认名称是64位字符串。
数据卷默认存放位置(宿主主机)是 /var/lib/docker/volumes/
# ll /var/lib/docker/volumes/ total 24 drwxr-xr-x. 3 root root 19 Dec 27 13:45 f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f -rw-------. 1 root root 32768 Dec 27 13:45 metadata.db进入自动命名数据卷宿主主机对应文件夹
# pwd /var/lib/docker/volumes/f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f/_data # vim index.html <h1>Hello Docker -1</h1>
验证数据卷(使用宿主主机IP或宿主直接回环测试地址访问)
# curl http://192.168.31.200:9090/hellodocker/index.html <h1>Hello Docker -1</h1>
② 创建容器tomcat-v-2 并 指定数据卷名称 hellodocker2
# docker run -d --name tomcat-v-2 -v hellodocker2:/usr/local/tomcat/webapps/hellodocker -p 9092:8080 tomcat 40df5037e1bf20ff2db7d3e0d9e3d8a460d39a60f52ed9e0af8e5672dcddb77b [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 40df5037e1bf tomcat "catalina.sh run" 13 seconds ago Up 11 seconds 0.0.0.0:9092->8080/tcp tomcat-v-2 2aaa2aef9ed1 tomcat "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:9090->8080/tcp tomcat-v-1查看数据卷信息
# docker volume ls DRIVER VOLUME NAME local f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f local hellodocker2 # docker volume inspect hellodocker2 [ { "CreatedAt": "2019-12-27T13:49:23-05:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/hellodocker2/_data", "Name": "hellodocker2", "Options": null, "Scope": "local" } ] # ll /var/lib/docker/volumes/ total 24 drwxr-xr-x. 3 root root 19 Dec 27 13:45 f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f drwxr-xr-x. 3 root root 19 Dec 27 13:49 hellodocker2 -rw-------. 1 root root 32768 Dec 27 13:49 metadata.db进入创建的数据卷hellodocker2宿主主机对应文件夹,创建 index.html
# pwd /var/lib/docker/volumes/hellodocker2/_data # vim index.html <h1>Hello Docker -2</h1>验证数据卷
# curl http://192.168.31.200:9092/hellodocker/index.html <h1>Hello Docker -2</h1>
③ 直接创建数据卷 tomcat-volume-1
# docker volume create tomcat-volume-1 tomcat-volume-1 # docker volume ls DRIVER VOLUME NAME local f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f local hellodocker2 local tomcat-volume-1 # docker volume inspect tomcat-volume-1 [ { "CreatedAt": "2019-12-27T13:55:32-05:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/tomcat-volume-1/_data", "Name": "tomcat-volume-1", "Options": {}, "Scope": "local" } ]进入创建的数据卷tomcat-volume-1宿主主机对应文件夹,创建 index.html
# pwd /var/lib/docker/volumes/tomcat-volume-1/_data # vim index.html <h1>Hello Docker -tomcat-volume-1</h1>新创建容器tomcat-v-3,使用已创建的数据卷tomcat-volume-1
# docker run -d --name tomcat-v-3 -v tomcat-volume-1:/usr/local/tomcat/webapps/hellodocker -p 9093:8080 tomcat 621eca4ae45313049aeb4ba9871c1d643e4da7c1fa9c33ff9ff8716f6a9a6a35 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 621eca4ae453 tomcat "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:9093->8080/tcp tomcat-v-3 40df5037e1bf tomcat "catalina.sh run" 9 minutes ago Up 9 minutes 0.0.0.0:9092->8080/tcp tomcat-v-2 2aaa2aef9ed1 tomcat "catalina.sh run" 13 minutes ago Up 13 minutes 0.0.0.0:9090->8080/tcp tomcat-v-1验证数据卷
# curl http://127.0.0.1:9093/hellodocker/index.html <h1>Hello Docker -tomcat-volume-1</h1>
验证数据卷的持久化,删除容器,查看对所挂载的数据卷的影响
# docker run -d --name tomcat-v-4 -v tomcat-volume-2:/usr/local/tomcat/webapps/hellodocker -p 9094:8080 tomcat 01cea30d23f562e4f5a64fbce8df68bef66e712e1aaf0038a9a22c1526a1a11d [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 01cea30d23f5 tomcat "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:9094->8080/tcp tomcat-v-4 621eca4ae453 tomcat "catalina.sh run" 8 minutes ago Up 8 minutes 0.0.0.0:9093->8080/tcp tomcat-v-3 40df5037e1bf tomcat "catalina.sh run" 17 minutes ago Up 17 minutes 0.0.0.0:9092->8080/tcp tomcat-v-2 2aaa2aef9ed1 tomcat "catalina.sh run" 21 minutes ago Up 21 minutes 0.0.0.0:9090->8080/tcp tomcat-v-1 [root@localhost ~]# docker rm -f 01cea30d23f5 01cea30d23f5 [root@localhost ~]# docker volume ls DRIVER VOLUME NAME local f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f local hellodocker2 local tomcat-volume-1 local tomcat-volume-2
从上面的操作可以看出,当删除数据卷挂载的容器时,数据卷依然存在。
删除数据卷
# docker volume rm tomcat-volume-2 tomcat-volume-2 [root@localhost ~]# docker volume ls DRIVER VOLUME NAME local f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f local hellodocker2 local tomcat-volume-1
数据容器卷
新创建容器挂载其他容器已挂载的数据卷 --volumes-from
# docker run -d --name tomcat-v-5 --volumes-from tomcat-v-2 -p 9095:8080 tomcat 59b142bd5325a745e14ee1074016ba386b186451e8f725ca0ff4addf0abc7ff7 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59b142bd5325 tomcat "catalina.sh run" 6 seconds ago Up 5 seconds 0.0.0.0:9095->8080/tcp tomcat-v-5 621eca4ae453 tomcat "catalina.sh run" 32 minutes ago Up 32 minutes 0.0.0.0:9093->8080/tcp tomcat-v-3 40df5037e1bf tomcat "catalina.sh run" 41 minutes ago Up 41 minutes 0.0.0.0:9092->8080/tcp tomcat-v-2 2aaa2aef9ed1 tomcat "catalina.sh run" 45 minutes ago Up 45 minutes 0.0.0.0:9090->8080/tcp tomcat-v-1 [root@localhost ~]# docker volume ls DRIVER VOLUME NAME local f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f local hellodocker2 local tomcat-volume-1上面操作为:新创建容器tomcat-v-5,使用tomcat-v-2已挂载的数据卷 hellodocker2。验证:
# curl http://127.0.0.1:9095/hellodocker/index.html <h1>Hello Docker -2</h1>
此时,容器tomcat-v-2就成为数据容器卷
接下来,停止、删除 容器tomcat-v-2,查看对新创建容器tomcat-v-5的影响:
# docker stop 40df5037e1bf 40df5037e1bf # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59b142bd5325 tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:9095->8080/tcp tomcat-v-5 621eca4ae453 tomcat "catalina.sh run" 35 minutes ago Up 35 minutes 0.0.0.0:9093->8080/tcp tomcat-v-3 40df5037e1bf tomcat "catalina.sh run" 45 minutes ago Exited (143) 3 seconds ago tomcat-v-2 2aaa2aef9ed1 tomcat "catalina.sh run" 48 minutes ago Up 48 minutes 0.0.0.0:9090->8080/tcp tomcat-v-1 # curl http://127.0.0.1:9095/hellodocker/index.html <h1>Hello Docker -2</h1> # docker rm -f 40df5037e1bf 40df5037e1bf # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 59b142bd5325 tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:9095->8080/tcp tomcat-v-5 621eca4ae453 tomcat "catalina.sh run" 36 minutes ago Up 36 minutes 0.0.0.0:9093->8080/tcp tomcat-v-3 2aaa2aef9ed1 tomcat "catalina.sh run" 49 minutes ago Up 49 minutes 0.0.0.0:9090->8080/tcp tomcat-v-1 # curl http://127.0.0.1:9095/hellodocker/index.html <h1>Hello Docker -2</h1>从上面操作中可以看出,数据容器卷的状态并不影响其他容器对该数据卷的使用。
直接指定宿主主机目录/datavolumes/hellodocker/挂载到容器tomcat-v-6中目录/usr/local/tomcat/webapps/hellodocker
# docker run -d --name tomcat-v-6 -v /datavolumes/hellodocker/:/usr/local/tomcat/webapps/hellodocker -p 9096:8080 tomcat e7dbeb9cf1db66fcb258b06f3c9574b66e82361f2fadcd46f2e5c005cb9456a4 [root@localhost hellodocker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e7dbeb9cf1db tomcat "catalina.sh run" 8 seconds ago Up 8 seconds 0.0.0.0:9096->8080/tcp tomcat-v-6 59b142bd5325 tomcat "catalina.sh run" 21 minutes ago Up 21 minutes 0.0.0.0:9095->8080/tcp tomcat-v-5 621eca4ae453 tomcat "catalina.sh run" 54 minutes ago Up 54 minutes 0.0.0.0:9093->8080/tcp tomcat-v-3 2aaa2aef9ed1 tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:9090->8080/tcp tomcat-v-1 [root@localhost hellodocker]# docker volume ls DRIVER VOLUME NAME local f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f local hellodocker2 local tomcat-volume-1 [root@localhost hellodocker]# curl http://127.0.0.1:9096/hellodocker/index.html <h1>Hello Docker - /datavolume/hellodocker/index.html</h1>从上面操作中看出,可以挂载成功,但#docker volume list指令无法显示该数据卷