Docker存储

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

  • 如果运行的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制

  • 关闭并重启容器,其数据不受影响,但删除docker容器,则其更改将会全部丢失

  • 存在的问题

    • 存储于联合文件系统中,不易于宿主机访问
    • 容器间数据共享不便
    • 删除容器其数据会丢失
  • 解决方案:劵(volume)是容器上的一个或多个目录,此类目录可绕过联合文件系统与宿主机上的某目录绑定(关联)

Docker有两种类型的劵,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同

  • bind mount volume:本地挂载劵

    docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox

    docker inspect -f {{.Mounts}} bbox2

  • Docker-managed volume:docker管理的劵

    docker run -it -name bbox1 -v VOLUMEDIR busybox

    docker inspect -f {{.Mounts}} bbox1

可以在启动容器的时候去复制其他容器的存储卷属性和网络属性

  • 多个容器的劵使用同一个主机目录,

    docker container run -it --name c1 -v /docker/volumes/v1:/data busybox

  • docker container run -it --name c2 -v /docker/volumes/v1:/data busybox

  • 复制使用其他容器的劵,为docker run 命令使用--vcolumes-from选项

    docker run -it --name bbox1 -v /docker/volumes/v1:/data busybox

    docker run -it --name bbox1 --volumes-from bbox1 busybox

  • 复制使用其他容器的网络属性

    docker run -it --name bbox1 busybox

    docker run -it --name bbox2 --network container:bbox1 busybox

星霜荏苒 居诸不息