Docker容器中的数据管理 | 8lovelife's life
0%

Docker容器中的数据管理

简单记录下Docker容器的数据管理

Docker镜像的存储

  1. Docker镜像是一层一层叠出来的,Dockerfile中的每一行指令都会产生一层,镜像中的数据对容器是只读的
  2. dockerfile中的命令可以直接访问底层(lower layer)已经产生的数据,当发生数据文件的修改时则会将底层文件复制到当前layer进行处理
  3. docker history 镜像ID展示镜像组成结构
  4. 存储结构图

这里写图片描述

  1. docker的storage driver负责处理每层数据处理与存储

Docker容器的存储

  1. Docker容器在镜像的基础之上又叠了一层(Container layer即Thin R/W层,每个容器都会有自己的Thin R/W层,镜像可以共享)
  2. docker ps -s命令能够查看当前运行容器的大小
  3. 当Container layer层发生数据文件的修改时则会将底层文件复制到当前layer进行处理即docker中的copy-on-write (CoW)策略,不同于虚拟机的本质。
  4. 存储结构图
    这里写图片描述
  5. Container layer中的数据应该尽量的少,减少镜像大小,storage driver的引入同样会带来性能的下降并且在容器停止后数据将会消失。应该使用volumes(宿主机文件系统可持久化)

DATA VOLUMES

docker提供了三种类型的数据挂载:volume,bind mount,tmpfs mount,挂载的数据能够传递到容器内部,容器中的数据也会回传到挂在目录或文件中
这里写图片描述

Volumes

  1. Volumes是最理想的容器数据持久化选择。数据存储在宿主机中的/var/lib/docker/volumes/目录下,非docker进程不能够修改,由docker进行管理。好处如:Docker
    CLI 扩展,容器间共享数据更加安全等
  2. volumes由volume driver的支持使容器能够加载远端的数据
  3. volume使用:docker run -d -it --name devtest --mount source=devtest,target=/app nginx,devtest不存在会自动创建

Bind mount

  1. Bind mount挂载的文件或文件夹必须有存在的全路径
  2. Bind mount多用于容器共享宿主机中的配置文件,如/etc/resolv.conf
  3. Bind mount使用:docker run -itd --name devtest --mount type=bind,source=/tmp,target=/app nginx,若app中已经存在数据,则tmp会掩盖app中的数据

tmpfs mount

  1. tmpfs挂载的数据被存在宿主机的内存中
  2. 当数据不需要持久化可以使用此挂载类型,如:系统启动使用的一次性数据
  3. tmpfs mount使用: docker run -d -it --name tmptest --mount type=tmpfs,destination=/app nginx

删除未使用Docker对象

Images,Containers,Volumes和Networks这些docker对象不会被删除(除非指定删除),未被使用的docker对象仍然占据着磁盘空间,docker提供了相应的修剪方法

删除无用镜像

  1. docker image prune #删除未打标签并且未被使用的镜像
  2. docker image prune -a #删除所有未被容器使用的镜像

删除没有运行的容器

docker container prune

删除没有被容器引用的volume

docker volume prune

参考

Docker v17.09

When the going gets tough, the tough get going. - Parzival

Ready Player One