docker卷管理
Posted 我就是我
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker卷管理相关的知识,希望对你有一定的参考价值。
制作镜像的俩种方法
Commit制作镜像基于一个现有的容器
dockerfile基于镜像制作镜像
容器底层技术:
1.cgroup
实现了资源的使用限额,CPU,内存,以及磁盘
[root@zxw99 ~]# docker run -d -m 64M -c 512 httpd:v1
[root@zxw99 ~]# cat /sys/fs/cgroup/cpu/docker/981a911ba02f5f4b8fb06052271de813521a94012f05922f5ee09ee2636d8626/cpu.shares
512
2,namespace
实现了资源隔离
PID,UTS,USER,NETWORK,MOUNT,IPC
数据卷volume功能特性
数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定。数据卷 是被设计用来持久化数据的
对于数据卷你可以理解为NFS中的哪个分享出来的挂载点,指宿主机共享的目录。
主要有如下的功能和特性
• 容器中数据的持久存储
• 容器间的资源共享
• 容器的迁移(分布式)
• 对数据卷的修改会立马生效
• 对数据卷的更新,不会影响镜像
• 数据卷默认会一直存在,即使容器被删除 (注意docker自主管理的会被删除,容器删除前一定要对数据卷进行备份)
实现数据卷
三种方式
1.绑定本机的特定目录
2.docker 自管理,docker会随机绑定主机的一个目录
3.基于一个现有的容器
1.绑定本机的特定目录 bind mount volume
[root@ken1 ~]# docker run -v /ken1:/var/www/html -d -P httpd
-v 指定使用数据卷
/ken1:/var/www/html
#/ken1是宿主机的一个目录,
/var/www/html是容器内的一个目录,如果说容器内的这个目录不存在的话,shi是会自动创建!
优势:
1.易于管理
2.可以实现数据的持久化
3.如果宿主机宕了,容器还是无法访问,可以使用NFS进行共享,多个宿主机进行负载均衡。
2.docker自管理的 docker manaagerment volume
这个和bind mount volume区别是用户无法再去管理本地的一个目录。docker会自己绑定宿主机下的一个目录
[root@ken1 ken1]# docker run -d -v /usr/local/apache2/htdocs -d -P httpd
可以通过下面的命令进行查看
[root@ken1 ken1]# docker container inspect 1365d65ead56
注意:
1.在删除容器的时候,是默认不会删除docker managerment volume中的数据卷的,如果想要在删除容器的时候顺带删掉相关的数据卷,需要加上选项-v
2.如果在删除容器的时候没有使用-v就会遗留下来数据卷,这样的数据卷叫做孤儿卷,即每人管理的卷
如果处理孤儿卷?
解决方案:
第一步:查看卷
root@zxw99 _data]# ls /var/lib/docker/volumes/
034d0d7b346db801f7f0c92c3bb879acebc28d0e17ba6e6eb91d08802a03d152
0fc92d717a2bc87384b52c8e3f6ebb4e842be857106410364a4c7be793653509
3aab6aa51cd795b932769a2479104b02585d79da87b7f554d96c45b809e8a5f1
950d114e4f29feaeeb5560f2666e7ce4e03794e812cfdd11ac680dbb63f9286f
a4a83390a954fe8c79bba7a0de157690c47900a354229e3f513bebc99cd7b461
f4f82f58cb91d555d17f230a4bdc52c61ca0b6910538c3ddf1870ccc62bd6346
[root@ken1 ken1]# docker volume ls
DRIVER VOLUME NAME
local 986d19ec31801a630dc5209724560b074b025eacdb7cdf4fbbe3d5e6cc7f0771
local d846455965a7bc208478bf7f6cf2f178263fe455c573504572d4a87f299800a1
local f0d96791e2a60a6edf9b6550625bf568520988ffbaffcfa6353e924b4530dc1c
local fa7bcf028a50a168d8b531eaff2dc74e6207421a5b3347430909d75eb4ad76a4
第二步:删除相应的孤儿卷
[root@ken1 ken1]# for i in `docker volume ls | grep -v "DRIVER" | awk ‘{print $2}‘`; do docker volume rm $i ;done
在删除容器的时候加上-v
[root@ken1 ken1]# docker container rm -f -v a5e91fa77abe1a5
注意:
如果使用-v, 相应的数据卷也会被删掉,如果是在生产环境当中,应当做好数据备份工作!
3.基于一个容器
[root@ken1 ken1]# docker run -d --volumes-from 1e9a4c3b0bc30295d httpd
–volumes-from是基于一个现有的容器进行数据共享,这个参数后面应当跟上相应的容器ID或者容器名
数据卷的生命周期管理
1.备份
2.迁移
3.恢复
4.销毁
1.备份
备份只需要备份相应的数据卷即可,例如:
[root@ken1 ken1]# docker run -d -v /ken:/var/www/html httpd
再上面的额例子中我们只需要做好/ken这个目录下的文件备份即可!
2.恢复
只需要重启一个容器,并且绑定ken下面备份的数据即可
3.迁移
把ken下面备份好的数据,发送到相应的节点即可,并使用bind mount volume方式运行容器即可
4.销毁
情况一:bind mount volumes
这种情况是绑定宿主机的一个目录,如果想要删除数据,只需要删掉宿主机的目录即可
情况二:docker managerment volume
需要在删除容器的时候加上选择-v
情况三:基于一个容器
分为两种情况:
1,如果是docker自管理,删除容器时使用-v
2.宿主机特定目录,需要删除宿主机上的特定目录
验证:数据卷被其他容器使用是否能够删掉
第一步:创建一个新的容器
[root@ken1 ken1]# docker run -d -v /data httpd
第二步:查看数据卷
[root@ken1 ken1]# docker inspect 3b1ce4b5f96150e866f322a600f93cd
...
/var/lib/docker/volumes/b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e/_data
第三步:基于现有容器在创建一个容器并绑定数据卷
[root@ken1 ken1]# docker run -d --volumes-from 3b1ce4b5f96150e866 httpd
第四步;查看第二个容器的数据卷
发现数据卷和第一个容器使用的数据卷是一致,说明两个容器现在共用一个数据卷
"Name": "b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e",
第五步:查看数据卷
[root@ken1 ken1]# docker volume ls
DRIVER VOLUME NAME
local b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e
第六步:删除第一个容器并加上-v选择
[root@ken1 ken1]# docker rm -f -v 3b1ce4b5f961
3b1ce4b5f961
[root@ken1 ken1]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70df334b3f25 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp wonderful_shamir
39d5f620493b httpd "httpd-foreground" 9 minutes ago Up 9 minutes 80/tcp goofy_herschel
c42a2a22c533 httpd "httpd-foreground" 12 minutes ago Up 12 minutes 80/tcp admiring_wilbur
1e9a4c3b0bc3 httpd "httpd-foreground" 24 minutes ago Up 23 minutes 80/tcp blissful_haslett
a6304e984f93 httpd "httpd-foreground" About an hour ago Up About an hour 0.0.0.0:32778->80/tcp brave_varahamihira
[root@ken1 ken1]# docker volumes ls
docker: ‘volumes‘ is not a docker command.
See ‘docker --help‘
[root@ken1 ken1]# docker volume ls
DRIVER VOLUME NAME
local b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e
验证总结:
两个容器如果共享了一个数据卷的话,删除一个容器的时候即使加上-v选线的话,即使删除源容器的话数据卷并不会被删除。
以上是关于docker卷管理的主要内容,如果未能解决你的问题,请参考以下文章