用户在运用Docker的过程中,往往需求能检查容器内应用产生的数据,或者需求把容器内的数据进行备份,乃至多个容器之间进行数据的同享,这必然触及容器的数据办理操作。
容器中办理数据主要有两种办法:
-
数据卷(Data Volumes)
-
数据卷容器(Data Volume Dontainers)
数据卷(容器与宿主机之间数据同享)
数据卷是一个供容器运用的特别目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修正操作马上可见,而且更新数据不会影响镜像,从而完成数据在宿主机与容器之间的迁移。数据卷的运用类似于Linux下对目录进行的mount操作。
想要将容器中的数据耐久化,能够将宿主机目录挂载到容器中。
一般只主张在创立容器时进行挂载,不主张发动容器后再挂载。由于发动容器后再挂载的话,需求修正配置文件,且不一定能挂载成功。
docker run -v 数据卷 #在容器内创立数据卷
docker run -v 宿主机目录:数据卷 #将宿主机目录挂载到容器中
#留意:宿主机本地目录的途径有必要是运用绝对途径。假如途径不存在,Docker会主动创立相应的途径。
#挂载后的目录默许可读可写
#假如期望挂载后的目录为只读目录,能够在挂载时加:ro参数
docker run -v 宿主机目录:数据卷:ro #将宿主机目录挂载到容器中,只可读
示例:
[root@yuji ~]# ls /var/share #创立数据卷前,该目录不存在
ls: 无法访问/var/share: 没有那个文件或目录
#将宿主机目录/var/share挂载到容器中的/data1。
#留意:宿主机本地目录的途径有必要是运用绝对途径。假如途径不存在,Docker会主动创立相应的途径。
#-v选项能够在容器内创立数据卷
[root@yuji ~]# docker run -v /var/share:/data1 --name web1 -itd centos:7 /bin/bash
670bf71814364638c4b21a1fb13bcf95c6a2125cd379a5717061d41f9673b0fe
[root@yuji ~]# ls /var/share -d #主动创立了该目录
/var/share
#进入容器
[root@yuji ~]# docker exec -it web1 bash
[root@670bf7181436 /]# ls #容器中主动创立了/data1目录
anaconda-post.log data1 etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@670bf7181436 /]# echo "this is web1"> /data1/abc.txt #向数据卷中写入数据
[root@670bf7181436 /]# exit #退出容器
exit
#回来宿主机进行检查
[root@yuji ~]# cd /var/share
[root@yuji share]# ls
abc.txt
[root@yuji share]# cat abc.txt #能够看到容器中写入的数据,数据同步成功
this is web1
#在宿主机目录中写入数据,之后进容器中检查
[root@yuji share]# cp /etc/passwd ./
[root@yuji share]# ls
abc.txt passwd
[root@yuji share]# docker exec -it web1 bash #进入容器
[root@670bf7181436 /]# ls /data1
abc.txt passwd #完成了数据同步
数据卷容器(容器与容器之间数据同享)
假如需求在容器之间同享一些数据,最简单的办法便是运用数据卷容器。数据卷容器是一个一般的容器,专门供给数据卷给其他容器挂载运用。
#创立数据卷容器web2。创立/data1和/data2两个数据卷。
docker run --name web2 -v /data1 -v /data2 -itd centos:7
docker exec -it web2 bash #进入web2容器
echo "this is web2" > /data1/aaa.txt #向数据卷/data1中写入数据
echo "this is yuji" > /data2/bbb.txt #向数据卷/data2中写入数据
#运用--volumes-from 来挂载web2容器中的数据卷到新的容器web3
docker run -itd --volumes-from web2 --name web3 centos:7
docker exec -it web3 bash #进入web3容器
cat /data1/aaa.txt #检查/data1中的数据是否和web2一致
cat /data2/bbb.txt #检查/data2中的数据是否和web2一致
#在容器web3的挂载目录中写入数据,观察web2中能否同步成功
[root@e99ee4f80519 /]# echo "this is web3" > /data1/web3.txt
[root@e99ee4f80519 /]# exit
exit
[root@yuji ~]# docker exec -it web2 bash #进入容器web2
[root@146f1012bc08 /]# cat /data1/web3.txt #数据同享成功
this is web3
容器互联(运用centos镜像)
容器互联是经过容器的称号在容器间树立一条专门的网络通讯地道。简单点说,便是会在源容器和接收容器之问树立一条地道,接收容器能够看到源容器指定的信息。
示例1:做容器互联
#创立并运转源容器取名c1
docker run -itd -P --name c1 centos:7 /bin/bash
#创立并运转接收容器取名c2,运用--1ink选项指定衔接容器c1以完成容器互联。
docker run -itd -P --name c2 --link c1:C1 centos:7 /bin/bash
##--link 容器名:衔接的别号
#进c2容器,ping c1,经过容器称号或者别号都能够通讯
docker exec -it c2 bash
ping c1 #ping c1容器称号
ping C1 #ping c1容器的别号
PING C1 (172.17.0.5) 56(84) bytes of data.
64 bytes from C1 (172.17.0.5): icmp_seq=1 ttl=64 time=0.105 ms
64 bytes from C1 (172.17.0.5): icmp_seq=2 ttl=64 time=0.066 ms
#能够看到c1容器的IP地址为172.17.0.5
#进入c1容器,检查c1的IP地址
docker exec -it c1 bash
yum install -y net-tools #下载网络工具
ifconfig #检查IP为172.17.0.5,和c2中显示的一致
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.5 netmask 255.255.0.0 broadcast 172.17.255.255
示例2:假如不做互联的话只能经过IP进行通讯
#创立容器c5,没有与c1做互联
docker run -itd -P --name c5 centos:7 /bin/bash
docker exec -it c5 bash #进入容器c5
#经过c1的容器称号和别号,都无法和c1通讯
ping c1 #提示:ping: c1: Name or service not known
ping C1 #提示:ping: C1: Name or service not known
#只能经过IP进行通讯
ping 172.17.0.5
总结
本文介绍了经过数据卷和数据卷容器对容器内数据进行同享、备份和恢复等操作,经过这些机制,即便容器在运转中呈现故障,用户也不用忧虑数据产生丢掉,只需求快速地从头创立容器即可。
命令 | 阐明 |
---|---|
docker run -v 宿主机目录:数据卷 | 将宿主机目录挂载到容器中 |
docker run -v 数据卷 | 创立数据卷容器 |
docker run –volumes-from 数据卷容器 | 挂载数据卷容器(挂载点途径不变) |
docker run –link 源容器称号:别号 | 容器互联 |
留意:一般只主张在创立容器时进行挂载,不主张发动容器后再挂载。
由于发动容器后再挂载的话,需求修正配置文件,且不一定能挂载成功。