zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Docker 数据卷容器实现数据共享

Docker容器数据 实现 数据共享
2023-09-14 09:01:46 时间

 

数据卷容器


数据卷(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类型的数据卷,其中数据只存在于内存中,容器退出后自动删除。