~阿弥陀佛~

人生能有多少天是按照自己的想法去活着

Docker本地卷

每个容器只运行一个程序及其子程序,容器启动依赖于底层一层或多层镜像联合挂载启动,底层能够存储此类分层构建并且实现联合挂载镜像的包含AUFS。Overlay2等,最上层一定要构建可写层

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

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

对IO要求较高的应用如redis,mysql等在实现持久化存储的时候存储系统必然对数据存储性能要求较高。而存储卷就是为了解决容器运行该类服务时存储性能限制的问题。

/data/web –> /container/data/web  宿主机与容器目录建立关联关系

 

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

l  存在的问题

(1)     存储于联合文件系统中,不易于宿主机访问;

(2)     容器间数据共享不便

(3)     删除容器其数据会丢失

l  解决方案:“卷(volume)”

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

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

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

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

  可以把“镜像”想象成静态文件,例如“程序”,把卷类比为动态内容,例如“数据”;于是,镜像可以重用,而卷可以共享;

  卷实现了“程序(镜像)”和“数据(卷)”分离,以及“程序(镜像)”和“制作镜像的主机”分离,用户制作镜像时无须再考虑镜像运行的容器所在的主机的环境;

Docker卷的类型

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

l  Bind mount volume

绑定挂载卷,在宿主机上需要人工指定一个特定路径,在容器中指定一个特定路径,对两个已知路径建立关联关系

[root@node-2 _data]# docker run –name wlx9 -it -v /data/volume/wlx9:/data busybox (/data/volume/wlx9为宿主机目录,/data为容器目录,当然也可以两个容器共享同一个宿主机存储卷)

/ #

[root@node-2 ~]# docker inspect wlx9

        "Mounts": [

            {

                "Type": "bind",

                "Source": "/data/volume/wlx9",  (本地卷地址)

                "Destination": "/data",  (容器目录地址)

l  Docker-managed volume

Docker管理卷,在容器内指定容器内的挂载目录,然后由容器引擎daemon自行在宿主机创建目录(/var/lib/docker/vfs/dir/<some volume ID>),但是缺陷在与不能手动指定目录,重启容器如果需要数据持久化,还要绑定挂在卷,不然会重新生成一个新的目录

[root@node-2 ~]# docker run –name wlx8 -it -v /data busybox

/ #

[root@node-2 ~]# docker inspect wlx8

        "Mounts": [

            {

                "Type": "volume",

                "Name": "62ee15cf7216cc5331b490802f11f71a2f516e1d12a4de0c77b097e39b2a98e8",  (卷ID)

                "Source": "/var/lib/docker/volumes/62ee15cf7216cc5331b490802f11f71a2f516e1d12a4de0c77b097e39b2a98e8/_data",  (实际存储目录)

[root@node-2 ~]# cd /var/lib/docker/volumes/62ee15cf7216cc5331b490802f11f71a2f516e1d12a4de0c77b097e39b2a98e8/_data

[root@node-2 _data]# ls

[root@node-2 _data]# touch a.txt

[root@node-2 ~]# docker run –name wlx8 -it -v /data busybox  (此处查看之前运行的wlx8容器data目录下内容与宿主机存储目录内容相同)

/ # ls /data

a.txt

/data # echo "gcxsd" > /data/a.txt

/data #

[root@node-2 _data]# cat a.txt  (本机查看存储目录下的该文件内容)

gcxsd

[root@node-2 _data]#

无论是哪种类型的卷,它的绑定关系都是在mounts当中,

[root@node-2 /]# docker inspect -f {{.Mounts}} wlx9   ({{.Mounts}}根下的Mounts,外层{}是语法格式引用模板,内层是json格式的数组/data/volume/wlx9与/data建立关联关系)

[{bind  /data/volume/wlx9 /data   true rprivate}]

[root@node-2 /]#

[root@node-2 ~]# docker inspect -f {{.NetworkSettings.IPAddress}} wlx9 (单独获取容器IP地址)

172.17.0.4

[root@node-2 ~]#

复制容器的存储卷

[root@node-2 ~]# docker run –name sharevolume -it -v /data/sharevolume:/data/web/html busybox  (创建基础支撑容器,用来为其他服务提供本地卷复制,将本地sharevolume挂目录挂载到容器的/data/目录下)

/ # ls /data/

web

/ #

[root@node-2 ~]# docker run –name nginx –network container:sharevolume –volumes-from sharevolume -it busybox   (另启一个终端加入sharevolume容器的网络,并—volumes-from复制sharevolume容器的挂载卷, docker inspect可以查看mount键的值是否复制了支撑容器的卷,注意复制卷的容器inspect一般不显示IP地址

/ #

Next Post

Leave a Reply

© 2021 ~阿弥陀佛~

ICP备案号: 京ICP备19038630号

版权所有@ 王力翔

耗时 0.194 秒 | 查询 45 次 | 内存 22.32 MB