Docker数据卷管理

本文介绍了Docker中数据卷管理的重要性,强调了数据卷和绑定挂载作为持久化数据的方法。数据卷是Docker主机上的独立存储区域,非Docker进程不应修改,而绑定挂载允许直接挂载主机的文件系统部分,两者都能在容器停止后保留数据。Docker通过-v参数或--mount选项来管理这些挂载方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker数据卷管理

一般情况下,容器内创建的所有文件都存储在可写容器层上;

  • 当容器不再运行时,数据不会持续存在,那么容器中数据会被删除;
  • 容器的可写层紧密耦合到容器运行的主机,您无法轻松地将数据移到其他地方;
  • 多个容器如何实现数据共享;

Docker有两种容器将文件存储在主机中的方式,即使在容器停止之后这些文件也会被保留,卷(volumes)和绑定挂载(bind mounts)卷的方式;

  • 卷存在Docker主机(宿主机)文件系统中的一部分(/var/lib/docker/volumes/),非Docker进程不应该修改这部分文件系统,卷是在Docker中保留数据的最佳方式;
  • 挂载卷(bind mounts)以指定主机(宿主机)的任何文件系统或目录,Docker主机或Docker容器上的非Docker进程可以随时修改它们;
volume
# -v参数:在指定容器 docker_contos_01 中创建目录/data,挂载Docker主机的某个目录;
# 容器可以挂载多个目录,-v,-;
# 同样也可以指定--mount参数进挂载;
[root@GaoServer ~]# docker run -dit --restart=always -v /data --name docker_centos_01 -h docker_centos_01 centos /bin/bash
8f0f7d107663cb5fc4e2471d78776864038eb4bdc4850802ddec8b460ef2ef3c
[root@GaoServer ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
8f0f7d107663        centos              "/bin/bash"         6 seconds ago       Up 5 seconds                            docker_centos_01
[root@GaoServer ~]# docker attach docker_centos_01
[root@docker_centos_01 /]# cd /data/;pwd
/data
[root@GaoServer ~]# docker inspect docker_centos_01
...
        "Mounts": [
            {
                "Type": "volume",
                "Name": "a720606ac53340454dc94a26e8e2160e1d19621e24d819701220a34252d4fd75",
                "Source": "/var/lib/docker/volumes/a720606ac53340454dc94a26e8e2160e1d19621e24d819701220a34252d4fd75/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
...
#Source相当于Docker主机的目录;
#Destination容器中映射的目录;

#测试:
[root@GaoServer _data]# cd /var/lib/docker/volumes/a720606ac53340454dc94a26e8e2160e1d19621e24d819701220a34252d4fd75/_data/
[root@GaoServer _data]# touch TestFile
[root@GaoServer _data]# docker attach docker_centos_01
[root@docker_centos_01 /]# ls /data/
TestFile

参数-v(--volume)--mount
-v参数由:分隔;
–mount由多个键值对组成,由逗号分隔,<key>=<value>元组组成;

  • 官方实例:
# --mount参数:
$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest
# -v参数:
$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  nginx:latest
bind mount
##-v参数 冒号前制定的Docker主机的目录,冒号后指定的容器目录;
[root@GaoServer _data]# mkdir /data/docker -pv
mkdir: created directory ‘/data/docker’
[root@GaoServer docker]# docker run -dit --restart=always -v /data/docker/:/data/ --name docker_centos_02 -h docker_centos_02 centos /bin/bash
8bd87c9539dce4412b68f3c5e9ec6c42dde0691b05786339bab3fba8242e5852
oot@GaoServer docker]# docker inspect docker_centos_02
...
                "Source": "/data/docker",
                "Destination": "/data",
...

# 以只读模式挂载:
# 注:在Docker主机上目录下添加文件,容器可以访问文件内容;
[root@GaoServer ~]# docker run -dit --restart=always -v /data/docker/:/data/:ro --name docker_centos_02 -h docker_centos_02 centos /bin/bash
6f110bac2b263636747e49311149691fdf6b798f281cfd5e7543c88e88e6452a
[root@GaoServer ~]# docker attach docker_centos_02
[root@docker_centos_02 /]# cd /data/
[root@docker_centos_02 data]# touch TestFile_02_ro
touch: cannot touch 'TestFile_02_ro': Read-only file system

官方文档:https://docs.docker.com/storage/volumes/#differences-between–v-and—mount-behavior

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值