容器卷管理
一、容器卷基础
-
挂载的类型有卷和绑定挂载
-
卷挂载就是创建一个卷,然后创建容器指定卷
-
绑定挂载就是目录直接挂载
-
创建一个容器,默认会有一个临时卷(匿名卷的存在),删除了容器,这个卷也就会消失
1、容器创建中卷和主机的关系(默认是临时的挂载)
- 临时保存容器增加的数据
[root@docker /]# docker run -tid --name q1 alpine
0745ab4215b4c88a875782a0087300855b6637807063ec26d1fe7dd59f23f7dd
[root@docker /]# docker exec -ti q1 /bin/sh
/ # ls
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
/ # touch 666.txt
/ # exit
[root@docker /]# find / -name 666.txt
/var/lib/docker/overlay2/a736c5b513154be1ee6f6d2b37ccd86087a2b6808b3aebb23885f2951ac354c0/diff/666.txt
/var/lib/docker/overlay2/a736c5b513154be1ee6f6d2b37ccd86087a2b6808b3aebb23885f2951ac354c0/merged/666.txt
# 在主机上面发现了2个目录,下面的一个是容器运行的时候存在的
# 如果在这2个目录下创建文件的话,容器上面也会有的
# 临时保存容器的数据的目录
- 创建容器的时候,容器运行的进程,其实都是在内存上面实现的,但是呢,内存又是一个非持久化的存储,结束容器后,内存会被清空,但是了,在宿主机的目录上面保存了
docker stop q1
# 然后在目录上创建一个文件
docker start q1
# 就会有这个文件
# 这个目录临时保存了这些数据
-
创建了一个容器。对容器里面写入数据,默认是写入容器层的,随着容器的删除而删除
-
但是了,还是可以通过-v来使用保存

二、-v选项
1、-v 只带一个容器目录
- -v /data 仅指定容器目录
# 创建了一个容器,默认是指定了容器里面的目录
[root@docker /]# docker run -tid --name q1 -v /data1 alpine
a708842daca3255e4e749468fe2e5509b69583fb10ae30feeb8ce89087414137
[root@docker /]# docker inspect q1 | grep -i volume -C 2
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
39,
--
"Mounts": [
{
"Type": "volume", # 挂载类型是卷挂载,因为没有指定宿主机的目录,默认情况下会创建一个容器卷来挂载到容器指定的目录下面
"Name": "a0f6e9b769cff5d581d7d5d34e9982261cd85c3edfc877a3dc1500adf87a91f4",
"Source": "/var/lib/docker/volumes/a0f6e9b769cff5d581d7d5d34e9982261cd85c3edfc877a3dc1500adf87a91f4/_data", # 会自动创建一个容器卷
"Destination": "/data1", # 挂载到了容器里面的/data1目录下面
"Driver": "local",
--
],
"Image": "alpine",
"Volumes": {
"/data1": {}
},
# 在容器里面写入数据,也会保存到宿主机这个目录上面
[root@docker /]# docker exec -ti q1 /bin/sh
/ # ls
bin data1 dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
/ # cd /data1/
/data1 # touch test.txt
/data1 # exit
[root@docker _data]# pwd
/var/lib/docker/volumes/a0f6e9b769cff5d581d7d5d34e9982261cd85c3edfc877a3dc1500adf87a91f4/_data
[root@docker _data]# ls
test.txt
-
上面有个缺点,需要自己去找宿主机存储数据目录在哪里
-
卷也是一个目录,有路径的
2、-v 宿主机:容器
- 手动指定宿主机目录和容器目录
[root@docker /]# docker run -tid --name q2 -v /data/:/data1 alpine
[root@docker /]# docker inspect q2 | grep -i mount -C 5
"LogPath": "/var/lib/docker/containers/0c82fef8490397c5a87467727826bc38e47e523923fe6132b9a6d45d3d43a709/0c82fef8490397c5a87467727826bc38e47e523923fe6132b9a6d45d3d43a709-json.log",
"Name": "/q2",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": [
--
"UpperDir": "/var/lib/docker/overlay2/ef63e61fe90938e98145695a4d70a8ead2a794471505ab8e5c362db4cf46a1b1/diff",
"WorkDir": "/var/lib/docker/overlay2/ef63e61fe90938e98145695a4d70a8ead2a794471505ab8e5c362db4cf46a1b1/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "bind", # 这个是绑定挂载,没有创建容器卷
"Source": "/data",
"Destination": "/data1",
"Mode": "",


三、卷挂载
[root@docker /]# docker volume create q1
q1
[root@docker /]# docker run -tid --name q1 -v q1:/data1 alpine
6ebe24d53bdebd616f46b05c7685a3fc63d97f6699394f3126edbfdebc44ec07
[root@docker /]# docker inspect q1 | grep -i volume -C 2
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
45,
--
"Mounts": [
{
"Type": "volume", # 挂载的类型
"Name": "q1",
"Source": "/var/lib/docker/volumes/q1/_data",
"Destination": "/data1",
"Driver": "local",
--
],
"Image": "alpine",
四、--mount挂载
-- mount这个选项非常的强大,有很多的参数可以使用,-v非常的简介
docker run --mount type=,source=宿主机的路径(卷),target=容器路径,readonly(仅读)
# 还可以指定多个挂载
docker run \
--mount type=bind,source=/data,target=/app,readonly \
--mount type=volume,source=my-volume,target=/data \
my-image
# 创建一个卷,使用mount挂载
[root@docker ~]# docker volume create v1
v1
[root@docker ~]# docker run -tid --name a1 --restart always --mount type=volume,source=v1,target=/v1/ alpine
02e31c95dec20bab7f48a23ec017ee45952a419d82d588a36aac544b85a60c03
# 创建一个目录,使用mount挂载
[root@docker /]# mkdir v2
[root@docker /]# docker run -tid --name v2 --mount type=bind,source=/v2,target=/v2 alpine
35101e9b82a18416d470a80c6e43448803607fb87cb1d99dd815bdccf4681ad0
五、宿主机目录有数据是什么情况
1、对于绑定挂载(类型)来说(2边都是目录挂载的)
-
宿主机目录无论是否有数据都会覆盖容器里面挂载的目录,这个是挂载,如果宿主机目录为空,挂载到容器里面的目录有数据的话,就会被隐藏,并没有消失
-
绑定挂载看的就是宿主机的内容
-
这个就是绑定挂载的用法,
2、对于卷挂载(类型)
-
命名卷和匿名卷都是一样
-
创建一个卷(没有数据的),挂载到容器里面的目录有数据的话,直接同步到卷里面
-
命名卷有数据的话,直接覆盖掉容器里面原有的数据
-
-
卷挂载想象成一个u盘,谁有数据就复制给对方,如果都有数据的话,卷覆盖
3、卷和挂载总结
- 只有卷的挂载,才能将容器的数据同步到宿主机目录上面

浙公网安备 33010602011771号