目录
如果数据都在容器中,容器被删除,数据就会丢失!因此,数据需要可以持久化!
例如:MySQL,容器删了,删库跑路!如果持久化了,数据备份在本地
一、数据卷
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地,本地数据也可同步到容器中(双向绑定),这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!
容器的持久化和同步操作!容器间数据也是可以共享的!
数据卷,目录挂在命令:-v

主机home目录原本为空,挂在后,创建了ceshi目录
# docker run -it -v 主机目录:容器目录
[root@WRF /]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@c985ee5938dc /]# exit
exit
#获取centos容器元数据
[root@WRF /]# docker inspect c985ee5938dc
...
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
1.测试文件修改后,数据同步(主机修改,容器观察)

2.测试停止容器后,修改数据同步
a.停止容器
b.主机上修改文件
c.启动容器
c.容器内的数据依旧是同步的

二、实战安装mysql
...
三、匿名挂载和具名挂载数据卷
#匿名关挂载(-v 后面只写了容器内的路径,没有写容器外的路径)
[root@WRF /]# docker volume ls
#查看所有volume情况
DRIVER VOLUME NAME
local 45d0a25050968f40b0d4eaec7314a0ec29ee59b9a3e0a2ecf309559e2d8cc0c9
local a66195e503e6a999550e2aee6f7381fb2295f35163f1210d7919eaf56045292a
#-v 容器内路径
#-P随机指定端口
[root@WRF /]# docker run -d -P --name nginx01 -v /etc/nginx nginx
bcacb2b6a9d1720246f5d7abafd3cc8306920eb97ba255771db8d734408e37ab
[root@WRF /]# docker volume ls
DRIVER VOLUME NAME
local 45d0a25050968f40b0d4eaec7314a0ec29ee59b9a3e0a2ecf309559e2d8cc0c9
local 704ed5bba0bfa68a1dbe4a37df22bcb4f0945fc366a2849fddce74331e8ca868
local a66195e503e6a999550e2aee6f7381fb2295f35163f1210d7919eaf56045292a
#具名挂载(-v 卷名:容器内的路径)
[root@WRF /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
aaaf46eb4c871b9296a53d6864243cafeff2fc1eb98a90aa4a39c384b72ff1e6
[root@WRF /]# docker volume ls
DRIVER VOLUME NAME
local 45d0a25050968f40b0d4eaec7314a0ec29ee59b9a3e0a2ecf309559e2d8cc0c9
local 704ed5bba0bfa68a1dbe4a37df22bcb4f0945fc366a2849fddce74331e8ca868
local a66195e503e6a999550e2aee6f7381fb2295f35163f1210d7919eaf56045292a
local juming-nginx
# 查看一下这个卷
[root@WRF /]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2024-03-06T13:55:28+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
拓展:
# 通过 -v 容器内容路径 ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内容无法操作
四、通过DockerFile挂载数据卷
DockerFile就是用来构建docker镜像的构建文件!属于命令脚本
通过该脚本可以生成镜像,镜像hi一层一层的,脚本一个个的命令,每个命令都是一层
[root@WRF /]# cd home
[root@WRF home]# ls
ceshi
[root@WRF home]# mkdir docker-test-volume
[root@WRF home]# ls
ceshi docker-test-volume
[root@WRF home]# pwd
/home
[root@WRF home]# cd docker-test-volume
[root@WRF docker-test-volume]# ls
[root@WRF docker-test-volume]# vim dockerfile01
[root@WRF docker-test-volume]# cat dockerfile01
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
[root@WRF docker-test-volume]# ls
dockerfile01
[root@WRF docker-test-volume]# docker build -f dockerfile01 -t WRF/centos:1.0 .
[+] Building 0.1s (5/5) FINISHED docker:default
=> [internal] load build definition from dockerfile01 0.0s
=> => transferring dockerfile: 124B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/1] FROM docker.io/library/centos:latest 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:bcb7b9d022595d87e4f374a55119c8e2e4933dd784edc7ca0ca447c4d8abff2f 0.0s
=> => naming to WRF/centos:1.0 0.0s
[root@WRF /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 2 years ago 680MB
mysql 5.7 c20987f18b13 2 years ago 448MB
centos latest 5d0da3dc9764 2 years ago 231MB
WRF/centos 1.0 bcb7b9d02259 2 years ago 231MB
elasticsearch 7.6.2 f29a1ee41030 3 years ago 791MB
启动新构建的镜像

这个数据卷和外部一定有一个同步目录
先在volume01新建一个文件v01-test.txt,看看外部默认的同步目录是不是也同步了新建的文件
[root@WRF /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1596d39db40 bcb7b9d02259 "/bin/bash" 16 minutes ago Up 16 minutes elegant_knuth
aaaf46eb4c87 nginx "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:32769->80/tcp, :::32769->80/tcp nginx02
bcacb2b6a9d1 nginx "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx01
[root@WRF /]# docker attach b1596d39db40
[root@b1596d39db40 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@b1596d39db40 /]# cd volume01
[root@b1596d39db40 volume01]# ls
#新建文件
[root@b1596d39db40 volume01]# touch v01-test.txt
[root@b1596d39db40 volume01]# ls
v01-test.txt
[root@b1596d39db40 volume01]# exit
#查看容器元数据
[root@WRF /]# docker inspect b1596d39db40
"Mounts": [
{
"Type": "volume",
"Name": "75ba726076277147b9926c45adad327fba877c1e88b3d3221d9abbcf79a46ea8",
"Source": "/var/lib/docker/volumes/75ba726076277147b9926c45adad327fba877c1e88b3d3221d9abbcf79a46ea8/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "fdaa40e2fdbad471c11ed88a378e35caf25b671d81948d4f84fda50c93d0f4b9",
"Source": "/var/lib/docker/volumes/fdaa40e2fdbad471c11ed88a378e35caf25b671d81948d4f84fda50c93d0f4b9/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
#查看容器内volume01目录的匿名挂载目录
[root@WRF /]# cd /var/lib/docker/volumes/75ba726076277147b9926c45adad327fba877c1e88b3d3221d9abbcf79a46ea8/_data
[root@WRF _data]# ls
v01-test.txt
测试一下刚才的文件是否同步到主机上了!
这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
五、容器数据卷
以多个mysql同步数据为例
启动三个容器,通过上面自己写的WRF/centos镜像为例
容器01
[root@WRF /]# docker run -it --name d-centos01 WRF/centos:1.0
[root@377ebc8f53ec /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@377ebc8f53ec /]# cd volume01
[root@377ebc8f53ec volume01]# ls
[root@377ebc8f53ec volume01]# touch v-01test
[root@377ebc8f53ec volume01]# ls
c-v-01test v-01test
[root@377ebc8f53ec volume01]# ls
c-v-01test d-c-v-01test v-01test
容器02
[root@WRF /]# docker run -it --name d-centos02 --volumes-from d-centos01 WRF/centos:1.0
[root@7c2937b2f080 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@7c2937b2f080 /]# cd volume01
[root@7c2937b2f080 volume01]# ls
v-01test
[root@7c2937b2f080 volume01]# touch c-v-01test
[root@7c2937b2f080 volume01]# ls
c-v-01test v-01test
[root@7c2937b2f080 volume01]# ls
c-v-01test d-c-v-01test v-01test
容器03
[root@WRF /]# docker run -it --name d-centos03 --volumes-from d-centos01 WRF/centos:1.0
[root@701f5d4f1a28 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@701f5d4f1a28 /]# cd volume01
[root@701f5d4f1a28 volume01]# ls
c-v-01test v-01test
[root@701f5d4f1a28 volume01]# touch d-c-v-01test
[root@701f5d4f1a28 volume01]# ls
c-v-01test d-c-v-01test v-01test

多个mysql实现数据共享
[root@WRF home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@WRF home]# docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
结论
容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
本文详细介绍了Docker中的数据卷技术,包括匿名挂载、具名挂载、通过DockerFile挂载数据卷以及容器间的数据共享。重点讲解了数据的持久化问题,以及如何确保数据在容器删除后仍能保留在本地。

被折叠的 条评论
为什么被折叠?



