用户在运用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           #完成了数据同步

DAY85 docker的数据管理

DAY85 docker的数据管理

数据卷容器(容器与容器之间数据同享)

假如需求在容器之间同享一些数据,最简单的办法便是运用数据卷容器。数据卷容器是一个一般的容器,专门供给数据卷给其他容器挂载运用。

#创立数据卷容器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一致

DAY85 docker的数据管理

DAY85 docker的数据管理

#在容器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

DAY85 docker的数据管理

容器互联(运用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

DAY85 docker的数据管理

DAY85 docker的数据管理

DAY85 docker的数据管理

示例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

DAY85 docker的数据管理

总结

本文介绍了经过数据卷和数据卷容器对容器内数据进行同享、备份和恢复等操作,经过这些机制,即便容器在运转中呈现故障,用户也不用忧虑数据产生丢掉,只需求快速地从头创立容器即可。

命令 阐明
docker run -v 宿主机目录:数据卷 将宿主机目录挂载到容器中
docker run -v 数据卷 创立数据卷容器
docker run –volumes-from 数据卷容器 挂载数据卷容器(挂载点途径不变)
docker run –link 源容器称号:别号 容器互联

留意:一般只主张在创立容器时进行挂载,不主张发动容器后再挂载。

由于发动容器后再挂载的话,需求修正配置文件,且不一定能挂载成功。