玩坏docker笔记(十八):主机与容器、容器与容器之间数据共享

数据共享
容器与host主机之间共享数据

Bind mount:直接将共享目录mount到容器
Docker managed volume:docker cp
在这里插入图片描述
也可以通过linux下的cp将数据复制到/var/lib/docker/volumes/xxx

容器之间共享数据

第一种方式:将共享数据直接mount到多个容器。
在这里插入图片描述
开启两个容器,只要host主机pv文件夹中有改动,则所有挂载的容器都会改动。
第二种:volume container
Volume container是专门为其他容器提供volume的容器,它提供的卷可以是bind mount,也可以是docker managed volume.下面我么创建一个volume container.
在这里插入图片描述
注意这里执行的是create命令,因为volume container的作用只是提供数据,它本身不需要处于运行状态。容器mount了连个volume:(1)bind mount,存放web Server静态文件;(2)docker managed volume,存放一些工具
通过docker inspect可以查看到这两个volume
在这里插入图片描述
在这里插入图片描述
其他容器可以通过–volume-from使用vc_data这个volume container:
在这里插入图片描述

查看web5都有哪些volume:
在这里插入图片描述
在这里插入图片描述
与bind mount相比,不必为每个容器指定hostpath,所有path都在volume container
中定义好了,只需要容器与volume container关联即可,实现了容器与host解偶。

data-packed volume container数据完全放到volume container中,同时又可以与其他容器共享(推荐)

原理:将数据打包到镜像,然后通过docker managed volume共享。
用dockerfile构建镜像:

FROM busybox:latest
ADD /home/work/htdocs /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs

Add将文件添加到容器目录/usr/local/apache2/htdocs.
Volume的作用与-v等效。用来创建docker managed volume,mount point为/usr/local/apache2/htdocs,因为这个目录就是add添加的目录,所以会将已有的数据复制到volume中。
Build新镜像datapacked。

Docker build -t datapacked .

用新镜像创建data-packed volume container:

Docker create --name vc_data datapacked

因为在dockerfile中已经使用了volume指令,这里就不需要指定volume的mount point了。启动httpd容器并使用data-packed volume container:

docker run -d -p 80:80 --volume-from vc_data httpd

Curl 127.0.0.1:80

容器能够正确读取volume中的数据。data-packed volume container是自包含的,不依赖host提供数据,具有很强移植性,非常适合静态数据的场景,比如应用的配置信息、webserver的静态文件。

Data Volume生命周期管理

关注点:volume的创建、共享、使用
备份:搭建本地Registry

docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry

所有本地镜像都保存在host主机的/myregistry目录中,我们要做的就是定期备份该目录。
恢复:
如果数据损坏了,直接将备份的数据复制到/myregistry目录中即可
迁移:
如果我们要使用新版本Registry,这就涉及数据迁移,方法:
1)docker stop当前的Registory容器
2)启动新版本容器并mount所有volume

docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:latest

在使用新版本容器前要确保新版本的默认数据路径是否发生变化。
销毁:
Docker不会销毁bind mount,删除数据只能由host负责。对于docker managed volume,在执行docker rm删除容器时可以带上-v参数,docker会将容器使用到的volume一并删除,前提是没有其他容器mount该volume,目的是保护数据。
如果删除时没有带上-v参数,就会产生孤儿volume,好在docker提供了volume子命令可以对volume维护。
通过docker volume ls可以查看容器使用的docker managed volume
对于孤儿volume可以使用

docker volume rm (volume name)

删除。
如果批量删除孤儿volume:

docker volume rm ${docker volume ls -q}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值