Docker 容器产生的数据在可写层,如果不通过 docker commit 生成新的镜像,使得数据成为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
Docker 提供了三种数据 Mount 方式:
这里主要记录 Volumes 方式,也就是图中的 Docker area,也是 Docker 推荐的方式。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
一、数据卷
# 类似于挂载目录 docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash # 也可以使用 docker volume create,默认挂载在宿主机的 /var/lib/docker/volumes/ 目录下 docker volume create 卷名称 docker run -it --volume 卷名称:/容器内目录 centos /bin/bash
可以看到这里把宿主机 /tmp 目录挂载到容器内 /home 目录了
也可以使用命令查看数据卷是否挂载成功。
docker inspect 容器ID
关于宿主机和容器之间数据同步
无论容器是运行还是停止,对宿主机的挂载目录所做的修改,在容器启动后都会映射到容器内对应目录。
同样的,在容器内,对挂载目录的操作都会映射到宿主机对应目录。
挂载目录权限
https://docs.docker.com/engine/reference/run/#volume-shared-filesystems
docker run -it -v /宿主机目录:/容器内目录:ro centos /bin/bash
二、数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个容器(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
容器间传递共享:--volumes-from
docker run --name="cent0" -it -v /tmp:/home1 centos /bin/bash docker run --name="cent1" -it -v /tmp:/home2 --volumes-from cent0 centos /bin/bash docker run --name="cent2" -it -v /tmp:/home3 --volumes-from cent0 centos /bin/bash
创建三个容器
- 第一个容器挂载 /tmp:/home,后面子容器挂载的目录不会影响父容器
- 第二个容器基于第一个容器,且又挂载了 /tmp:/home2,所以可以看到两个目录:/home1、/home2
- 第三个容器基于第一个容器,且又挂载了 /tmp:/home3,所以可以看到两个目录:/home1、/home3,与第二个容器无关
删除掉父容器再看子容器目录挂载情况
可以到删除父容器后不影响子容器的挂载目录。
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
https://docs.docker.com/storage/volumes/
https://docs.docker.com/engine/reference/commandline/run/
https://docs.docker.com/engine/reference/commandline/volume_create/