docker数据管理
docker 镜像由多个只读层叠加而成,启动容器时,docker 会加载只读镜像层并在镜像栈顶部添加一个读写层
所有的修改都被复制到读写层,保存在 diff 目录,原理就是“写时复制(COW)”
但是一旦删除容器,读写层也会被删除,所以为了数据持久化,需要将容器中的数据保存到宿主机的制定目录,方法就是使用数据卷(Data Volume):直接将宿主机目录挂载到容器的指定目录
数据卷
数据卷实际上就是宿主机上的目录或文件,可以直接 mount 到容器中使用
实际生产环境中,需要针对不同类型的服务,不同类型的数据存储要求做到相应的规划,最终保证服务的可扩展性、稳定性以及数据的安全性
使用场景:数据库、日志、静态 web 页面、应用配置文件、多容器间目录或文件共享
数据卷特点:
- 可以多容器之间共享
- 依赖宿主机目录,宿主机出问题,依赖的容器就会受影响,当宿主机较多时,不方便统一管理
- 镜像中的挂载点中包含数据,则在容器初始化时会将数据拷贝到数据卷(匿名和命名)中
数据卷的使用
1 | docker container run -v [host-src:]container-dest[:<options>] |
1 | # 将宿主机目录挂载容器目录,两个目录都可自动创建 |
管理卷命令:
1 | # docker volume --help |
关于匿名卷和命名卷:
命名卷,因为有名字可以指定,在用过一次后,以后挂载容器的时候还可以使用,所以一般需要保存的数据使用命名卷保存。
匿名卷没有名字,随容器建立而建立,当容器消亡,匿名卷即使还存在,但也失去了意义,因此匿名卷只存放无关紧要的临时数据。
Dockerfile 中指定 VOLUME 为匿名数据卷,其目的只是为了将某个路径确定为卷。
数据卷默认可能会保存于 /var/lib/docker/volumes,不过一般不需要、也不应该访问这个位置。
按照最佳实践的要求,不应该在容器存储层内进行数据写入操作,所有写入应该使用卷。
1 | # 查看数据卷的挂载关系 |
案例
MySQL 使用数据卷:
1 | docker run -d \ |
文件数据卷:
1 | docker run -d \ |