容器卷管理

一、容器卷基础

  • 挂载的类型有卷和绑定挂载

  • 卷挂载就是创建一个卷,然后创建容器指定卷

  • 绑定挂载就是目录直接挂载

  • 创建一个容器,默认会有一个临时卷(匿名卷的存在),删除了容器,这个卷也就会消失

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来使用保存

img

二、-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": "",





img

img

三、卷挂载

[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、卷和挂载总结

  • 只有卷的挂载,才能将容器的数据同步到宿主机目录上面
posted @ 2025-05-31 19:44  乔的港口  阅读(19)  评论(0)    收藏  举报