目录
前言
Docker 数据管理
在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行
数据共享,这必然涉及容器的数据管理操作
那么数据管理策略的方式有三种:
1、原始的copy到容器中
2、创建数据卷目录用来关联容器,数据是双向绑定的
3、创建数据卷容器,联系其他容器,数据是双向绑定的
一、原始的copy到容器中
语法:docker cp 需要拷贝的文件或者目录 容器名称:容器目录
docker cp /liwangwang/tomcat/ mycentos01:/javawwl/software
安装语法来就行,把宿主机的文件或内容放入到容器中。
ps:在放入容器的什么地方记得必须得保证有这个文件
二、创建数据卷目录用来关联容器,(数据是双向绑定的)
先看一组图片:
根据上面的图解,应该已经讲解了一半的问题了。
怎么说,
在上面传统的方法中,那仅仅是把文件copy过去了,
在这个方法中,是在宿主机上建好数据卷,把数据卷给挂载到其他容器上,以实现数据双向绑定。
1、创建数据卷
创建一个数据卷
docker volume create 名字
查看所有数据卷信息
docker volume ls
查看单个数据卷的详情
docker volume inspect 名字
2、挂载到容器上
在挂载之前我们做一个测试:
好了,准备工作做好了。
其实最简单的挂载方式就是在启动容器的时候挂载上去就行了
1、语法:
docker run -d \
-it \
--name tomcat01 \
--mount source=my-vol,target=/webapp \
centos:7
注意:此行命令执行后的效果是,宿主机路径/var/lib/docker/volumes/my-vol/_data与tomcat01容器路径/webapp完成映射
2、语法:
docker run -d \
-it \
--name tomcat01 \
--mount type=bind,source=/javawwl,target=/webapp \
centos:7
注意:此行命令执行后的效果是,宿主机路径/javawwl与tomcat01容器路径/webapp完成映射
ps:linux命令结尾加斜杠有什么用?
加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车
当然也可以看下面的:
docker run -d -it --mount source=my-vol,target=/webapp --name tomcat01 centos
查看一下结果:
在这个时候就已经搭好了双向绑定,可以自行测试;
:mount选项高级用法
--mount选项的type参数支持三种类型的数据卷
--mount标志:由多个名值对组成,逗号分隔,每个键值由 <key> = <value> 元组组成
1.type=volume普通数据卷(默认即这种类型),映射到主机/var/lib/docker/volumes路径下;
--mount type=volume,source=my-vol,target=/webapp
注:这是type的默认值
2.bind:绑定数据卷,映射到主机指定路径下;
--mount type=bind,source=/webapp,destination=/webapp2
3.tmpfs :临时数据卷,只存在于内存中
docker run -d \
-it \
--name tmptest \
--mount type=tmpfs,destination=/app \
nginx:latest
3、删除数据卷
语法:
docker volume rm 名字
三、创建数据卷容器,联系其他容器,(数据是双向绑定的)
look this:
就是连接到其他容器的一个关联数据卷容器。
ok,上面的双向绑定的概念已经讲明白了,所以下面为了不太复杂,所以就写如何实现代码
1、新建数据卷容器
docker run -di --name db_data -v /db_data centos:7
注:-v 后面接的共享数据真实存放路径
2、新建依赖于数据卷容器的容器
语法:
docker run -di --name 名字--volumes-from 数据卷容器 centos:7
进入:
docker exec -it db1 bash
同样方法创建另一个db2。
方法如上面一样自行测试即可
然后进行测试:
后记
这里有个小东西要给大家讲一下:
如果是用-di 启动的容器是没办法用 attach 进入到容器的,会卡死。
但是可以用 docker exec -it 名字 bash
进入
如果是用-it 启动的容器是没有问题的,依然可以用attach进入。