5.容器数据卷管理
5.1 dockers数据层概念
容器层:可读写,容器重启以后,容器中的数据依然会保存在容器层,容器层数据会随着容器删除的时候一起被删除
镜像层:只读
示例:
[root@vms41 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
011d27f5bea6 hub.c.163.com/library/mysql:latest "docker-entrypoint.s…" 2 days ago Up 2 minutes 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp db
181c0a6691bd hub.c.163.com/library/tomcat:latest "catalina.sh run" 2 days ago Up 2 days 0.0.0.0:80->8080/tcp, :::80->8080/tcp web
[root@vms41 ~]# docker exec -it web bash #进入容器web中创建文件aaa.txt
root@181c0a6691bd:/usr/local/tomcat# touch aaa.txt
[root@vms41 ~]# find / -name "aaa.txt" ##在操作系统中查找aaa.txt发现存在
/var/lib/docker/overlay2/d00a05b0c73ca04d94b1b898860aebb456e08ac20fe451124cb2d2929a1121ea/diff/usr/local/tomcat/aaa.txt
/var/lib/docker/overlay2/d00a05b0c73ca04d94b1b898860aebb456e08ac20fe451124cb2d2929a1121ea/merged/usr/local/tomcat/aaa.txt
[root@vms41 ~]# docker restart web ##重启容器web后,aaa.txt依然存在
web
[root@vms41 ~]# find / -name "aaa.txt"
/var/lib/docker/overlay2/d00a05b0c73ca04d94b1b898860aebb456e08ac20fe451124cb2d2929a1121ea/diff/usr/local/tomcat/aaa.txt
/var/lib/docker/overlay2/d00a05b0c73ca04d94b1b898860aebb456e08ac20fe451124cb2d2929a1121ea/merged/usr/local/tomcat/aaa.txt
[root@vms41 ~]# docker rm -f web ##删除容器后发现aaa.txt已经不存在了
web
[root@vms41 ~]# find / -name "aaa.txt"
5.2 数据卷
创建数据卷相当于将物理机中的目录挂载至容器中的目录,所以在容器目录中写入数据相当于在物理机目录中写入数据,当删除容器后数据卷中数据依然存在,数据不再是临时的,而是永久存在
创建数据卷命令:
可以通过dockers run的-v参数来指定数据卷
docker run -dit --name=web -p 80:80 --restart=always -v /xx:/data nginx:latest
-v 冒号之前的第一个参数是本地数据卷,冒号后的参数是虚机数据卷,如果-v后面只有一个参数则是虚机数据卷。
docker run -dit --name=web -p 80:80 --restart=always -v /xx:/data:rw nginx:latest
-v 后面可以有第三个选项,影响容器对数据卷的读写操作,分别为rw--可读写(默认,不添加第三个参数时即为rw),ro--只读
示例:
[root@vms41 _data]# docker run -dit --name=web -p 80:80 --restart=always -v /xx:/data nginx:latest #创建容器web,容器目录为/data映射至物理机/xx目录
WARNING: IPv4 forwarding is disabled. Networking will not work.
4ed9eb530d4ffc025d8933191b8229b67091c59f53a1287a1d36897fa1663597
[root@vms41 _data]# ll /xx ##物理机/xx无数据
总用量 0
[root@vms41 _data]# docker exec -it web bash
[root@4ed9eb530d4f:/# touch /data/aaa.txt ##在容器/data目录创建aaa.txt文件
[root@vms41 ~]# ll /xx ##在物理机/xx目录查看文件,aaa.txt存在
总用量 0
-rw-r--r-- 1 root root 0 5月 7 23:11 aaa.txt
[root@vms41 ~]# docker rm -f web
web
[root@vms41 ~]# ll /xx
总用量 0
-rw-r--r-- 1 root root 0 5月 7 23:11 aaa.txt
[root@vms41 _data]# docker run -dit --name=web -p 80:80 --restart=always -v /xx:/data1 nginx:latest ##重新创建web容器,将物理机/xx挂载在容器/data1目录
WARNING: IPv4 forwarding is disabled. Networking will not work.
b0f75d5d639431361206c8024cb1881e3ded2d18e840734f8412e8297563316c
[root@vms41 _data]#
[root@vms41 _data]#
[root@vms41 _data]# docker exec -it web bash
[root@b0f75d5d6394:/# ls /data1 ##查看data1发现aaa.txt文件依然存在
aaa.txt
注意:使用容器数据卷时,需要熟悉容器中应用的默认使用数据卷,将物理机数据卷挂载至应用使用的数据卷,应用的有效数据才能够正确的保存下来
如:mysql的数据默认是在/var/lib/mysql,则需要将物理机数据卷挂载至/var/lib/mysql
docker run -dit --name=web -p 3037:3036 --restart=always -v /data:/var/lib/mysql hub.c.163.com/library/mysql:latest #将物理机/data数据卷挂载在/var/lib/mysql目录下