查看镜像、容器、数据卷所占用的空间

1
docker system df

为什么要用存储卷

  • Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层
  • 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制

image-20200729092446874

类似的

image-20200611164322267

image-20200611164442349

  • 关闭并重启容器,其数据不受影响;但删除Docker容器,则其更改将会全部丢失
  • 存在的问题
    • 存储于联合文件系统中,不易于宿主机访问;
    • 容器间数据共享不便
    • 删除容器其数据会丢失
  • 解决方案:“卷(volume)”
    • “卷”是容器上的一个或多个”目录”,此类目录可绕过联合文件系统,与宿主机
      上的某目录“绑定(关联)”

image-20200729093905335

数据卷

  • Data volumes provide several useful features for persistent or shared data

    • Volume于容器初始化之时即会创建,由base image提供的卷中的数据会于此期间完成复制

    • Data volumes can be shared and reused among containers

    • Changes to a data volume are made directly

    • Changes to a data volume will not be included when you update an image

    • Data volumes persist even if the container itself is deleted

  • Volume的初衷是独立于容器的生命周期实现数据持久化,因此删除容器之时既不会删除卷,也不会对哪怕未被引用的卷做垃圾回收操作;

  • 卷为docker提供了独立于容器的数据管理机制

    • 可以把“镜像”想像成静态文件,例如”程序”,把卷类比为动态内容,例如“数据”;于是,镜像可以重用,而卷可以共享;
    • 卷实现了“程序(镜像)”和“数据(卷)”分离,以及“程序(镜像)”和“制作镜像的主机”分离,用户制作镜像时无须再考虑镜像运行的容器所在的主机的环境;

image-20200729094556022

创建数据卷

创建数据卷之后,默认会存放在一个目录下/var/lib/docker/volumes/数据卷名称/_data

1
docker volumn create 数据卷名称

查看数据卷详情

查看数据卷的详细信息,可以查询到存放路径,创建时间等

1
docker volumn inspect 数据卷名称

查看全部数据卷

1
docker volumn ls

删除数据卷

1
docker volumn rm 数据卷名称

卷类型

  • Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同;
    • Bind mount volume
      • a volume that points to a user-specified location on the host file system
    • Docker-managed volume
      • the Docker daemon creates managed volumes in a portion of the host’s file system that’s owned by Docker

image-20200729094935005

在容器中使用Volumes

  • docker run命令使用-v选项即可使用Volume

    • Docker-managed volume

      • ~]# docker run -it –name busybox1 -v /data busybox
      • ~]# docker inspect -f { {.Mounts} } busybox1
        • 查着bbox1容器的卷、卷标识符及挂载的主机目录
      1
      [root@docker01 ~]# docker run -it -v /data alpine:latest

      image-20200729095935953

      image-20200729101022867

      image-20200729100325323

      image-20200729100345744

    • Bind-mount Volume

      • ~]# docker run -it -v HOSTDIR:VOLUMEDIR –name busybox2 busybox
      • ~]# docker inspect -f { {.Mounts} } busybox2
      1
      [root@docker01 ~]# docker run -it -v /data/alpine-volumn:/data  alpine:latest

      image-20200729101235622

      image-20200729101301059

      image-20200729101330494

    • # 如何确定是具名挂载还是匿名挂载,还是指定路径挂载?
      -v 容器内路径                     #匿名挂载
      -v 卷名:容器内路径                    #具名挂载
      -v /宿主机路径:容器内路径              #指定路径挂载
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12

      - 拓展

      ```sh
      # 通过 -v 容器内路径:ro 或 rw 改变读写权限
      ro #readonly 只读
      rw #readwrite 可读可写
      # 一旦创建容器时设置了容器权限,容器对我们挂载出来的内容就有限定了!
      docker run -d -P --name nginx05 -v /data:/etc/nginx:ro nginx
      docker run -d -P --name nginx05 -v /data:/etc/nginx:rw nginx
      # 默认是 rw
      # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

共享卷

  • There are two ways to share volumes between containers
    • 多个容器的卷使用同一个主机目录,例如
      • ~]# docker run -it –name c1 -v /docker/volumes/v1:/data busybox
      • ~]# docker run -it –name c2 -v /docker/volumes/v1:/data busybox
    • 复制使用其它容器的卷,为docker run命令使用——volumes-from选项
      • ~]#docker run-it –name busybox1 -v/docker/volumes/v1:/data busybox
      • ~]# docker run -it –name busybox2 –volumes-from busybox1 busybox