Docker 数据卷容器实现数据共享
数据卷容器
数据卷(Data Volumes)∶容器内数据直接映射到本地主机环境(对数据进行持久化),容器和宿主机通信,容器还不能和容器通信
数据卷容器(Data Volume Containers)∶使用特定容器维护数据卷(多个容器之间的数据共享),实现容器之间数据共享
如果两个容器都有data目录,怎么使得两个容器data目录数据同步,那么可以在宿主机建立data目录,然后容器1去同步宿主机data目录,同理容器2。
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
首先,创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata
[root@www ~]# docker run -itd -v /dbdata --name dbdata ansible/centos7-ansible
055f6abf02d1086a7718b388ab442712e95fce614b11e742785eb5e31c14b607
[root@www ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
055f6abf02d1 ansible/centos7-ansible "/bin/bash" 13 seconds ago Up 12 seconds dbdata
[root@www ~]# docker exec -it 055f6abf02d1 /bin/bash
[root@www volumes]# docker inspect 055f6abf02d1
"Mounts": [
{
"Type": "volume",
"Name": "90e275b975cad4dd8c09fa29304555c91fb080e3c9b95e72578a58874025cfca",
"Source": "/var/lib/docker/volumes/90e275b975cad4dd8c09fa29304555c91fb080e3c9b95e72578a58874025cfca/_data",
"Destination": "/dbdata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
[root@www ~]# ll /var/lib/docker/volumes/
total 44
drwxr-xr-x 3 root root 19 Jul 30 16:17 90e275b975cad4dd8c09fa29304555c91fb080e3c9b95e72578a58874025cfca #创建的文件以及其他的内容都放在该目录下面
-rw------- 1 root root 65536 Jul 30 16:31 metadata.db
查看/dbdata目录,在 dbdata容器中创建一个 test 文件∶
[root@055f6abf02d1 ansible]# find / -name dbdata
/dbdata
然后,可以在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,例如创建 db1和db2两个容器,并从dbdata 容器挂载数据卷,此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录,三个容器任何一方在该目录下的写入,其他容器都可以看到。例如∶
[root@www ~]# docker run -it --volumes-from dbdata --name db1 ansible/centos7-ansible
[root@294a37825ea2 ansible]# ll /dbdata/
total 0
-rw-r--r-- 1 root root 0 Jul 30 08:19 a.txt
[root@www ~]# docker run -it --volumes-from dbdata --name db2 ansible/centos7-ansible
[root@2eabe80d0a19 ansible]# ll /dbdata/
total 0
-rw-r--r-- 1 root root 0 Jul 30 08:19 a.txt
可以多次使用--volumes-from参数来从多个容器挂载多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷∶
$ docker run-d --name db3 --volumes-from db1 training/postgres
使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括dbdata、db1和 ab2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
使用数据卷容器可以让用户在容器之间自由地升级和移动数据卷,具体的操作将在下一节进行讲解。
利用数据卷容器来迁移数据(仅供参考)
可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。
1. 备份
使用下面的命令来备份 dbdata 数据卷容器内的数据卷∶
$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
这个命令稍微有点复杂,具体分析下。
首先利用ubuntu镜像创建了一个容器 worker。使用--volumes-from dbdata参数来让 worker容器挂载dbdata容器的数据卷(即data数据卷),使用-v $(pwd)∶/backup 参数来挂载本地的当前目录到 worker 容器的/backup目录。
worker容器启动后,使用tar cvf /backup/backup.tar /dbdata命令将/dbdata 下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。
2.恢复
如果要恢复数据到一个容器,可以按照下面的操作。首先创建一个带有数据卷的容器 dbdata2∶
s docker run -v /dbdata --name abdata2 ubuntu /bin/bash
然后创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中∶
$ docker run --volumes-from dbdata2 -v s(pwd):/backup busybox tar xvf /backup/backup.tar
总结
数据是最宝贵的资源。Docker 在设计上考虑到了这点,数据卷机制为数据管理提供了方便的操作支持。即使容器在运行中出现故障,用户也不必担心数据发生丢失,只需要快速地重新创建容器即可。
在生产环境中,推荐在使用数据卷或数据卷容器之外,定期将主机的本地数据进行备份,或者使用支持容错的存储系统,包括RAID或分布式文件系统,如Ceph、GPFS、HDFS等。
另外,有些时候不希望将数据保存在宿主机或容器中,还可以使用tmpfs类型的数据卷,其中数据只存在于内存中,容器退出后自动删除。
相关文章
- Docker 启动容器实例报错:UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeou...
- 解散Docker Image为Dockerfile
- Docker容器访问SQL Server 抛异常:SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed
- docker安装mysql
- Docker 离线安装_docker官方中文文档
- 一篇文章教你实战Docker容器数据卷
- 【Docker】基于Rancher快速部署docker容器管理平台
- docker 安装
- 「Docker学习系列教程」10-Docker容器数据卷案例
- 「 【Docker】利用宝塔docker管理器搭建为知笔记(docker安装为知笔记) 」
- 【Docker 系列】docker 学习六,探究一下数据卷容器
- 【Docker 系列】docker 学习八,Docker 网络
- 如何清理Docker容器、镜像、数据卷和网络
- Docker 正在删除开源组织,强制其付费
- Docker容器中部署Redis服务(dockerredis)
- 掌握docker容器技术,轻松搭建Redis服务器(dockerredis)
- Docker 发布新的跨容器的分布式应用编排服务
- docker-容器端口映射
- 准备 overlay 网络实验环境 – 每天5分钟玩转 Docker 容器技术(49)
- 安装 Docker Machine – 每天5分钟玩转 Docker 容器技术(45)
- Ubunt环境下docker安装部署和知识点整理