docker数据管理

本文最后更新于:2023年12月5日 晚上

docker 镜像由多个只读层叠加而成,启动容器时,docker 会加载只读镜像层并在镜像栈顶部添加一个读写层

所有的修改都被复制到读写层,保存在 diff 目录,原理就是“写时复制(COW)”

但是一旦删除容器,读写层也会被删除,所以为了数据持久化,需要将容器中的数据保存到宿主机的制定目录,方法就是使用数据卷(Data Volume):直接将宿主机目录挂载到容器的指定目录

数据卷

数据卷实际上就是宿主机上的目录或文件,可以直接 mount 到容器中使用

实际生产环境中,需要针对不同类型的服务,不同类型的数据存储要求做到相应的规划,最终保证服务的可扩展性、稳定性以及数据的安全性

使用场景:数据库、日志、静态 web 页面、应用配置文件、多容器间目录或文件共享

数据卷特点:

  • 可以多容器之间共享
  • 依赖宿主机目录,宿主机出问题,依赖的容器就会受影响,当宿主机较多时,不方便统一管理
  • 镜像中的挂载点中包含数据,则在容器初始化时会将数据拷贝到数据卷(匿名和命名)中

数据卷的使用

docker container run -v [host-src:]container-dest[:<options>]

options:
ro:容器内对此数据卷只读,代码等文件适合设置为只读
rw:容器内对此数据卷读写,默认
# 将宿主机目录挂载容器目录,两个目录都可自动创建
-v <宿主机绝对路径的目录或文件>:<容器目录或文件>[:ro]

# 匿名卷,宿主机自动生成/var/lib/docker/volumes/<卷ID>/_data目录,并挂载至容器指定路径
-v <容器内路径>

# 命名卷,宿主机自动生成/var/lib/docker/volumes/<卷名>/_data目录,并挂载至容器指定路径
-v <卷名>:<容器目录路径>

管理卷命令:

# docker volume --help
Usage:    docker volume COMMAND

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

关于匿名卷和命名卷:

命名卷,因为有名字可以指定,在用过一次后,以后挂载容器的时候还可以使用,所以一般需要保存的数据使用命名卷保存。

匿名卷没有名字,随容器建立而建立,当容器消亡,匿名卷即使还存在,但也失去了意义,因此匿名卷只存放无关紧要的临时数据。

Dockerfile 中指定 VOLUME 为匿名数据卷,其目的只是为了将某个路径确定为卷。

数据卷默认可能会保存于 /var/lib/docker/volumes,不过一般不需要、也不应该访问这个位置。

按照最佳实践的要求,不应该在容器存储层内进行数据写入操作,所有写入应该使用卷。

# 查看数据卷的挂载关系
docker inspect --format="{{.Mounts}}" <容器ID>
# 删除所有数据卷
docker volume rm `docker volume ls -q`

案例

MySQL 使用数据卷:

docker run -d \
--name mysql \
-p 3306:3306 \
-v /data/mysql/:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.30

文件数据卷:

docker run -d \
-v /data/bin/catalina.sh:/apps/tomcat/bin/catalina.sh:ro \
-v /data/testapp:/data/tomcat/webapps/testapp \
-v /data/logs:/apps/tomcat/logs \
-p 8080:8080 tomcat-web:app1

docker数据管理
http://blog.lujinkai.cn/运维/Docker/3.docker数据管理/
作者
像方便面一样的男子
发布于
2021年1月8日
更新于
2023年12月5日
许可协议