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