简单记录下Docker容器的数据管理
Docker镜像的存储
- Docker镜像是一层一层叠出来的,Dockerfile中的每一行指令都会产生一层,镜像中的数据对容器是只读的
- dockerfile中的命令可以直接访问底层(lower layer)已经产生的数据,当发生数据文件的修改时则会将底层文件复制到当前layer进行处理
docker history 镜像ID
展示镜像组成结构- 存储结构图
- docker的storage driver负责处理每层数据处理与存储
Docker容器的存储
- Docker容器在镜像的基础之上又叠了一层(Container layer即Thin R/W层,每个容器都会有自己的Thin R/W层,镜像可以共享)
docker ps -s
命令能够查看当前运行容器的大小- 当Container layer层发生数据文件的修改时则会将底层文件复制到当前layer进行处理即docker中的copy-on-write (CoW)策略,不同于虚拟机的本质。
- 存储结构图
- Container layer中的数据应该尽量的少,减少镜像大小,storage driver的引入同样会带来性能的下降并且在容器停止后数据将会消失。应该使用volumes(宿主机文件系统可持久化)
DATA VOLUMES
docker提供了三种类型的数据挂载:volume,bind mount,tmpfs mount,挂载的数据能够传递到容器内部,容器中的数据也会回传到挂在目录或文件中
Volumes
- Volumes是最理想的容器数据持久化选择。数据存储在宿主机中的/var/lib/docker/volumes/目录下,非docker进程不能够修改,由docker进行管理。好处如:Docker
CLI 扩展,容器间共享数据更加安全等- volumes由volume driver的支持使容器能够加载远端的数据
- volume使用:
docker run -d -it --name devtest --mount source=devtest,target=/app nginx
,devtest不存在会自动创建
Bind mount
- Bind mount挂载的文件或文件夹必须有存在的全路径
- Bind mount多用于容器共享宿主机中的配置文件,如/etc/resolv.conf
- Bind mount使用:
docker run -itd --name devtest --mount type=bind,source=/tmp,target=/app nginx
,若app中已经存在数据,则tmp会掩盖app中的数据
tmpfs mount
- tmpfs挂载的数据被存在宿主机的内存中
- 当数据不需要持久化可以使用此挂载类型,如:系统启动使用的一次性数据
- tmpfs mount使用:
docker run -d -it --name tmptest --mount type=tmpfs,destination=/app nginx
删除未使用Docker对象
Images,Containers,Volumes和Networks这些docker对象不会被删除(除非指定删除),未被使用的docker对象仍然占据着磁盘空间,docker提供了相应的修剪方法
删除无用镜像
docker image prune
#删除未打标签并且未被使用的镜像docker image prune -a
#删除所有未被容器使用的镜像
删除没有运行的容器
docker container prune
删除没有被容器引用的volume
docker volume prune
参考
When the going gets tough, the tough get going. - Parzival