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

浙公网安备 33010602011771号