Loading

5-Docker存储卷

Docker存储卷

1、Docker默认存储机制

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

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

2、默认机制的缺陷

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

  • 存在的问题

    • 存储于联合文件系统中,不易于宿主机访问
    • 容器间数据共享不变
    • 删除容器数据会丢失。
  • 解决方案:卷

    • 卷是容器上的一个或多个目录,此类目录可绕过联合文件系统,与宿主机上的某目录绑定
    • volume于容器初始化时自动创建。
    • 独立于容器的生命周期实现数据持久化,因此删除容器时不会删除卷,也不会对未引用的卷做垃圾处理。

3、存储卷

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

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

4、存储卷类型

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

  • Bind mount volume
    • 指定容器上的路径和宿主机上的路径绑定
  • Docker-managed volume
    • 只指定容器上的路径,宿主机上的对应路径无需关系,由容器引擎自行创建。

5、使用存储卷

为docker run命令使用-v选项即可使用volume

  • 创建使用Bind mount volume类型的存储卷
[root@localhost ~]# docker run --name t2 -it -v /data/app/container/t1:/data --rm busybox:latest 
[root@localhost _data]# docker inspect t2
"Mounts": [
    {
        "Type": "bind",
        "Source": "/data/app/container/t1",
        "Destination": "/data",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

上例会创建宿主机的/data/app/container/t1和容器/data的绑定关系,且为持久化存储。

  • 创建使用Docker-managed volume类型的存储卷
[root@localhost ~]# docker run --name t1 -it -v /data busybox:latest
[root@localhost ~]# docker inspect t1
"Mounts": [
    {
        "Type": "volume",
        "Name": "6475280cb20709cd0e4746421266a014d5d04525b57f950ec50d0fbdbf0cba1d",
        "Source": "/var/lib/docker/volumes/6475280cb20709cd0e4746421266a014d5d04525b57f950ec50d0fbdbf0cba1d/_data",
        "Destination": "/data",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
......
"Volumes": {
    "/data": {}
},

上面可以看到创建后会绑定宿主机的/var/lib/docker/volumes/6475280cb20709cd0e4746421266a014d5d04525b57f950ec50d0fbdbf0cba1d/_data目录到容器的/data目录

  • 多个容器的卷使用同一个主机目录
# 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 bbox1 -v /data/volumes/v1:/data/busybox
# docker run -it --name bbox2 --volumes-from bbox1 busybox

5.1、获取inspect信息

使用docker inspect [containers]可以获取到容器的详细信息,也可以使用指令获取到指定的信息

# 获取Mounts节点信息
[root@localhost _data]# docker inspect -f {{.Mounts}} t2      
[{bind  /data/app/container/t1 /data   true rprivate}]
 
# 获取容器ip地址
[root@localhost _data]# docker inspect -f {{.NetworkSettings.Networks.bridge.IPAddress}} t2                
172.17.0.2
[root@localhost _data]# docker inspect -f {{.NetworkSettings.IPAddress}} t2                
172.17.0.2
posted @ 2021-07-13 17:21  勤俭持家亮公子  阅读(66)  评论(0)    收藏  举报