一、概念
1.数据卷
概念:是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会直接生效
- 对数据卷的更新,不会影响镜像
- 数据卷会一直存在,直到没有容器使用
- 数据卷可以独立于容器存在
作用:
- 容器的持久化
- 容器间继承和数据共享
2. 数据卷容器
概念:其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的
图1-2 数据卷容器
- 数据卷容器没有直接管理或控制数据卷,只是其它容器使用数据卷的桥梁(提供数据卷信息)。
- 如果删除了挂载的容器,数据卷并不会被自动删除。
- 如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。
- 可以使用数据卷容器来备份、恢复和迁移数据卷。
- 数据卷容器的运行与否,并不影响其他容器对数据卷的使用
作用:
- 对数据卷进行归类和汇总
- 管理容器与数据卷之间的对应关系
- 合理地控制数据卷的生命周期
二、操作方法
1. 添加数据卷
- 通过
docker -v
命令添加数据卷:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
- 添加数据卷并查看容器是否启动
[root@localhost ~]# docker run -d --name tomcat -p 8080:8080 -v /opt/infosec/webapps:/usr/local/tomcat/webapps tomcat d3ff98bb54c00f6f177469cc165319483997400ee382a870b06ca4353168db6b [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3ff98bb54c0 tomcat "catalina.sh run" 5 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp tomcat
- 检查宿主机中是否创建webapps目录,并添加一个host.txt文件
[root@localhost ~]# ls /opt/infosec/ webapps [root@localhost ~]# cd /opt/infosec/webapps/ [root@localhost webapps]# ll total 0 [root@localhost webapps]# touch host.txt [root@localhost webapps]# ll total 0 -rw-r--r--. 1 root root 0 Jun 29 11:03 host.txt
- 进入到容器目录,检查host.txt文件是否存在,容器中创建container.txt检查宿主机是否存在
[root@localhost webapps]# docker exec -it tomcat /bin/bash root@d3ff98bb54c0:/usr/local/tomcat# ls -l total 132 -rw-r--r--. 1 root root 18982 Jun 3 17:13 BUILDING.txt -rw-r--r--. 1 root root 5409 Jun 3 17:13 CONTRIBUTING.md -rw-r--r--. 1 root root 57092 Jun 3 17:13 LICENSE -rw-r--r--. 1 root root 2333 Jun 3 17:13 NOTICE -rw-r--r--. 1 root root 3255 Jun 3 17:13 README.md -rw-r--r--. 1 root root 6898 Jun 3 17:13 RELEASE-NOTES -rw-r--r--. 1 root root 16262 Jun 3 17:13 RUNNING.txt drwxr-xr-x. 2 root root 4096 Jun 10 08:17 bin drwxr-xr-x. 1 root root 21 Jun 29 15:02 conf drwxr-xr-x. 2 root root 4096 Jun 10 08:17 lib drwxrwxrwx. 1 root root 4096 Jun 29 15:02 logs drwxr-xr-x. 2 root root 4096 Jun 10 08:17 native-jni-lib drwxrwxrwx. 2 root root 29 Jun 10 08:17 temp drwxr-xr-x. 2 root root 21 Jun 29 15:03 webapps drwxr-xr-x. 7 root root 76 Jun 3 17:11 webapps.dist drwxrwxrwx. 2 root root 6 Jun 3 17:10 work root@d3ff98bb54c0:/usr/local/tomcat# cd webapps root@d3ff98bb54c0:/usr/local/tomcat/webapps# ls -l total 0 -rw-r--r--. 1 root root 0 Jun 29 15:03 host.txt root@d3ff98bb54c0:/usr/local/tomcat/webapps# touch container.txt root@d3ff98bb54c0:/usr/local/tomcat/webapps# ls -l total 0 -rw-r--r--. 1 root root 0 Jun 29 15:04 container.txt -rw-r--r--. 1 root root 0 Jun 29 15:03 host.txt
- 检查主机文件夹是否存在container.txt
[root@localhost opt]# ls /opt/infosec/webapps/ container.txt host.txt
- 小结:
- 数据卷确实达到了容器和宿主机之间的数据共享
- 容器重要数据的持久化(移除tomcat容器,数据卷依然存在)
- tomcat的webapp目录文件经常需要变动,软件开发文笔需要打成war包部署在tomcat里面,可以立即生效(也可以是配置文件,方便维护)
- 通过dockerfile添加数据卷
- 在宿主机目录上创建dokcerfile,内容如下:
FROM tomcat VOLUME /opt/volumebyfile/webapps:/usr/local/tomcat/webapps CMD /bin/bash
dockerfile相当于linux的shell的脚本,用来构建docker镜像。其语法下次将会详细讲解。
2. 在dockerfile的基础上build镜像
[root@localhost docker]# docker build -f /opt/docker/dockerfile -t datavolume/centos "docker build" requires exactly 1 argument(s). See 'docker build --help'. Usage: docker build [OPTIONS] PATH | URL | - Build an image from a Dockerfile [root@localhost docker]# docker build -f /opt/docker/dockerfile -t datavolume/centos . Sending build context to Docker daemon 2.048 kB Step 1/3 : FROM centos ---> 831691599b88 Step 2/3 : VOLUME /opt/volumebyfile/webapps:/usr/local/tomcat/webapps ---> Running in 34c582704242 ---> a9c9db5e0aff Removing intermediate container 34c582704242 Step 3/3 : CMD /bin/bash ---> Running in b77071cd1e11 ---> 0214e692df2c Removing intermediate container b77071cd1e11 Successfully built 0214e692df2c
- 运行datavolume/centos,检查数据卷是否挂载成功
[root@localhost docker]# docker run -it datavolume/centos [root@localhost docker]# docker inspect "Mounts": [ { "Type": "volume", "Name": "98f46be0880f6308d5d1dac4c940811da981c04cbef0f97954ce2b6d68d09445", "Source": "/var/lib/docker/volumes/98f46be0880f6308d5d1dac4c940811da981c04cbef0f97954ce2b6d68d09445/_data", "Destination": "/opt/volumebyfile/webapps:/usr/local/tomcat/webapps", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
从上面可以看出数据卷挂载成功。
- 通过继承数据卷容器来挂载数据卷
- 创建数据卷容器tomcat01_db_data
[root@localhost docker]# docker run -d -v /opt/volumes/webapps:/usr/local/tomcat/webapps --name tomcat01_db_data tomcat echo Data-only container for tomcat 7cd071fab7f8382834fe9d71018ab62d9d87c784de36402cf014f772ac1ed249
你一定会怀疑为啥不爆露端口?因为数据卷容器根本你不需要启动,只需要给其它容器提供数据卷信息,所以启动了也是浪费资源,不需要暴露端口
- 然后使用
--volumes-from
让其它容器挂载数据卷容器的数据卷
[root@localhost docker]# docker run -d --name tomcat02 -p 8082:8080 --volumes-from tomcat01_db_data tomcat c93393e2ebd8de49d018c7f8a344a53938c916b43b28663b8abec79dffe18609
- 查看是否挂载成功数据卷
[root@localhost docker]# docker exec -it tomcat02 /bin/bash root@c93393e2ebd8:/usr/local/tomcat# ls -l total 132 -rw-r--r--. 1 root root 18982 Jun 3 17:13 BUILDING.txt -rw-r--r--. 1 root root 5409 Jun 3 17:13 CONTRIBUTING.md -rw-r--r--. 1 root root 57092 Jun 3 17:13 LICENSE -rw-r--r--. 1 root root 2333 Jun 3 17:13 NOTICE -rw-r--r--. 1 root root 3255 Jun 3 17:13 README.md -rw-r--r--. 1 root root 6898 Jun 3 17:13 RELEASE-NOTES -rw-r--r--. 1 root root 16262 Jun 3 17:13 RUNNING.txt drwxr-xr-x. 2 root root 4096 Jun 10 08:17 bin drwxr-xr-x. 1 root root 21 Jun 29 16:01 conf drwxr-xr-x. 2 root root 4096 Jun 10 08:17 lib drwxrwxrwx. 1 root root 4096 Jun 29 16:01 logs drwxr-xr-x. 2 root root 4096 Jun 10 08:17 native-jni-lib drwxrwxrwx. 2 root root 29 Jun 10 08:17 temp drwxr-xr-x. 2 root root 6 Jun 29 15:59 webapps drwxr-xr-x. 7 root root 76 Jun 3 17:11 webapps.dist drwxrwxrwx. 2 root root 6 Jun 3 17:10 work root@c93393e2ebd8:/usr/local/tomcat# cd webapps root@c93393e2ebd8:/usr/local/tomcat/webapps# ls -l total 0 root@c93393e2ebd8:/usr/local/tomcat/webapps# touch container.txt root@c93393e2ebd8:/usr/local/tomcat/webapps# exit exit [root@localhost docker]# ls -l /opt/volumes/webapps/ total 0 -rw-r--r--. 1 root root 0 Jun 29 12:06 container.txt
说明可以通过继承数据卷容器来给容器添加数据卷