docker入门之存储卷

栏目: 编程工具 · 发布时间: 6年前

内容简介:首先我们需要回顾一下之前的内容:1、docker镜像由多个层叠加而成,启动容器时,docker会加载只读镜像层,并在镜像栈顶部添加一个读写层。2、如果运行中的容器修改了现有的一个已经存在的文件,那该文件会从只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制。

Docker 入门之存储卷

Docker 入门之存储卷

一、 Docker 中的文件

首先我们需要回顾一下之前的内容:

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

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

通俗来讲:容器是分层的,最上面一层是可读写层,对所有数据的修改,都是保存在最上层的;在运行容器之后,所有的操作都不会影响到镜像本身,如果是编辑操作,那么docker只会从只读层将文件复制(非移动)到读写层给用户进行编辑。

docker入门之存储卷
docker中的文件

二、存在的问题和解决方案

1)存在的问题

1、当用户关闭和重启容器时,容器中的数据不受影响,但删除容器,则其数据会全部丢失。

2、数据存储在联合文件系统中,不易于宿主机访问。

3、容器间数据共享不便

4、容器写入和更改数据效率低,部分文件需要从底层复制,不适合IO较高的应用。

2)解决方案

“卷”是容器一个或多个“目录”,此次类目录可绕过联合文件系统,于宿主机上的目录“绑定(关联)”

docker入门之存储卷
目录绑定

三、什么是docker存储卷?

1)概述

将宿主机的目录直接于容器中的目录进行绑定,容器向目录写入数据时,可以直接写入宿主机的目录中。这样容器内的数据保存时就能绕过容器内部文件系统的限制,与宿主机的文件系统建立关联关系,实现数据共享,容器被停止或者删除时,数据不会丢失。

2)卷(volume)的特点

1、volume于容器初始化之时即会创建,由base image提供的卷中的数据会在此期间完成复制。(例:将宿主机上/data/docker/b1 和 容器b1中的/etc/绑定,那么会将容器中/etc/的内容复制到宿主机/dta/docker/b1/目录中)

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

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

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

docker入门之存储卷
docker 卷

3)卷的类型(volume types)

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

3.1 bind mount volume(绑定挂载卷)

a volume that points to a user-specified location on the host file system

3.2 docker-manged volume(docker 管理卷)

the docker daemon creates managed volumes in a portion of the host’s file system that’s system that’s owned by docker

docker入门之存储卷
两种类型的卷
bind mount volume:指定绑定的路径
docker-managed volume:宿主机的路径由docker daemon定义 

四、使用docker存储卷(volume)

无论是哪种类型的卷,都使用docker run的-v参数。

1)docker-managed volume

1.1 创建容器b1,指定b1的/data/目录使用存储卷

[root@localhost ~]# docker run --name b1 -it -v /data busybox
/ # cd /data/
/data # ls
/data # 

1.2 查看关联的宿主机目录

[root@localhost b1]# docker inspect -f {{.Mounts}} b1
[{volume 4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local  true }]
[root@localhost b1]# 

1.3 在宿主机目录中写入文件

[root@localhost b1]# cd /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data/
[root@localhost _data]# echo 'welcome to arppinging.com' >> test.txt
[root@localhost _data]# cat test.txt 
welcome to arppinging.com
[root@localhost _data]# 

1.4 在容器b1中查看是否有test.txt文件

/data # cat /data/test.txt 
welcome to arppinging.com
/data # 

2)bind mount volume

使用绑定挂载卷的时候,如果宿主机的目录不存在,那么会自动创建该目录。

1.1 创建容器b2,配置宿主机的/data/docker/b2/与容器b2的/data/关联

[root@localhost ~]# docker run --name b2 -it -v /data/docker/b2:/data busybox
/ # ls /data/
/ # 

1.2 查看b2的关联目录

[root@localhost _data]# docker inspect -f {{.Mounts}} b2
[{bind  /data/docker/b2 /data   true rprivate}]
[root@localhost _data]# 

1.3 在b2的/data/中创建一个文件,

/ # cd /data/
/data # echo 'welcome to b2.arppinging.com' > b2.html
/data # 

1.4 在宿主机的/data/docker/b2中是否能看到b2创建的文件?

[root@localhost /]# cd /data/docker/b2/
[root@localhost b2]# ls
b2.html
[root@localhost b2]# cat b2.html 
welcome to b2.arppinging.com
[root@localhost b2]# 

1.5 删除容器b2,查看宿主机的目录文件是否还存在

[root@localhost ~]# docker rm b2
b2
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
ec2ff6aeb48a        busybox             "sh"                10 minutes ago      Exited (0) 4 minutes ago                       b1
[root@localhost ~]# 
[root@localhost ~]# cd /data/docker/b2/
[root@localhost b2]# cat b2.html 
welcome to b2.arppinging.com
[root@localhost b2]# 

3)复制使用其他容器的卷

复制和使用其他容器的卷,使用的是–volumes-from选项

创建一个容器b3,使用b1的存储卷

[root@localhost b2]# docker run --name b3 -it --volumes-from b1 busybox
/ # cat /data/test.txt 
welcome to arppinging.com
/ # 

查看映射卷

[root@localhost b2]# docker inspect -f {{.Mounts}} b1
[{volume 4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local  true }]

[root@localhost b2]# docker inspect -f {{.Mounts}} b3
[{volume 4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local  true }]
[root@localhost b2]# 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Black Box Society

The Black Box Society

Frank Pasquale / Harvard University Press / 2015-1-5 / USD 35.00

Every day, corporations are connecting the dots about our personal behavior—silently scrutinizing clues left behind by our work habits and Internet use. The data compiled and portraits created are inc......一起来看看 《The Black Box Society》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具