Docker数据卷
容器数据卷
docker容器数据卷是什么?
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。
通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
特点
-
数据卷可以在容器之间共享或重用数据
-
数据卷中的更改可以直接生效
-
数据卷中的更改不会包含在镜像的更新中
-
数据卷的生命周期一直持续到没有容器使用它为止
使用数据卷
方法一:通过命令行挂载 -v
docker run -it -v 主机目录:容器内目录
docker run -it -v /home/test:/home centos /bin/bash
docker inspect b9e99e8a5528 #在容器详细信息中看到mounts挂载信息
"Mounts": [
{
"Type": "bind",
"Source": "/home/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
#容器内创建文件
[root@b9e99e8a5528 home]# touch a.txt
[root@b9e99e8a5528 home]# ls
a.txt
#挂载的目录中保持一致
[root@pinked test]# ls
a.txt
Mysql数据持久化
docker pull mysql:5.7
docker run -d -p 9000:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker rm -f mysql01 #删除容器后,数据并不会消失
匿名和具名挂载
#匿名挂载, -v后只写了容器内的路径,不指定主机的路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#具名挂载,也不指定主机的路径
docker run -d -P --name nginx02 -v named-nginx:/etc/nginx nginx
#查看所有数据卷的情况
docker volume ls
DRIVER VOLUME NAME
local 8a60bf491b5a15b6fd7377cf8ea5a75f33da280981c255abef8514ac39986317
local 18fe0022467eb03f6877e905a63801d20c9384baaa8b14583f4c75d460f9def3
local 688bfa670576a725fbb1286b6d3c9f8bfcbb94e89cce225d373861a8cdb21b3f
local a1d6fcbe9e667e4d2489ed100438be9d7a05b59a62e8da1cd7f41768241dbe49
local ad2f1d8fccf4dbc05a3034ead5832a10245b11dc2441566111bd629749e95489
local d2c6a93afb5ba497bb645389e0d7c9b7e29210b1a31a8637226577657336d05f
local d7307bdf0a4d308a15a71228706b03aa7028a3492d0dda5b281eb86a7a3c58f8
local efbffc284f8a8880c90bbed53b6d2dd37a2822c7bbe1a57dc042eadd17ded034
local named-nginx
#查看挂载的目录
docker volume inspect named-nginx
[
{
"CreatedAt": "2020-09-14T16:38:45+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/named-nginx/_data",
"Name": "named-nginx",
"Options": null,
"Scope": "local"
}
]
方法二:通过DockerFile添加
#创建编写dockerfile文件
vim dockerfile1
#文件内容
FORM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#运行脚本
docker build -f dockerfile1 -t pinked/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 3bcba5970da7
Removing intermediate container 3bcba5970da7
---> eb50b29c1307
Step 3/4 : CMD echo "----end----"
---> Running in 1ccbaabea09d
Removing intermediate container 1ccbaabea09d
---> 8a2624081206
Step 4/4 : CMD /bin/bash
---> Running in ab98e07b11a5
Removing intermediate container ab98e07b11a5
---> 8b902d6910f6
Successfully built 8b902d6910f6
Successfully tagged pinked/centos:latest
#启动镜像
docker run -it 8b902d6910f6 /bin/bash
#镜像内会有自己挂载的目录
ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
#查看容器详细信息,找到挂载的主机目录
docker inspect 4845b25f96fa
数据卷容器
测试
#启动容器1,里面有自定义的挂载目录volume01 volume02
docker run -it --name centos01 pinked/centos
#启动容器2,里面也有自定义的挂载目录volume01 volume02
docker run -it --name centos02 --volumes-from centos01 pinked/centos
#容器2中新建文件
[root@52dfe66f41d8 /]# cd volume01
[root@52dfe66f41d8 volume01]# ls
[root@52dfe66f41d8 volume01]# touch abc.java
#容器1中也会看到文件
[root@pinked docker-test-volume]# docker attach centos01
[root@949a6c982e37 /]# cd volume01
[root@949a6c982e37 volume01]# ls
abc.java
#启动容器3,之前建立的文件也在
docker run -it --name centos03 --volumes-from centos01 pinked/centos
[root@7d8e3c53a1d0 /]# cd volume01
[root@7d8e3c53a1d0 volume01]# ls
abc.java
#删除容器1后,挂载的文件仍然存在
docker rm -f centos01
多个mysql数据共享
#容器1
docker run -d -P -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#容器2
docker run -d -P -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysql01 --name mysql02 mysql:5.7