Day09 docker-跨主机通信、持久化存储

容器跨主机通信如何实现?

Day09 docker-跨主机通信、持久化存储_docker

对主机11和主机12进行Ip地址的更改
  • 1.

Day09 docker-跨主机通信、持久化存储_数据_02Day09 docker-跨主机通信、持久化存储_nginx_03

随后对docker 进行重启
systemctl restart docker.service
systemctl daemon-relodad
  • 1.
  • 2.
  • 3.

Day09 docker-跨主机通信、持久化存储_docker_04Day09 docker-跨主机通信、持久化存储_docker_05

本身的物理网卡是通的,也就是eth0,但是docker0虚拟网口是不通的
那解决这个的问题就是添加路由route
route add -net 10.0.131.0/24 gw 192.168.0.12  #机器11  ,gw 代表你要经过哪台机器?
物理网口->  物理网口1-> 虚拟网口1
route add -net 10.0.130.0/24 gw 192.168.0.11  #机器12
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

Day09 docker-跨主机通信、持久化存储_数据_06Day09 docker-跨主机通信、持久化存储_nginx_07

# 开启容器
docker run -itd --name test1 busybox
docker run -itd --name test2 busybox

那么 我们进入容器能不能Ping通?
docker exec -it test1 /bin/sh
docker exec -it test2 /bin/sh

答案是不行
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

Day09 docker-跨主机通信、持久化存储_docker_08

为什么不通?怎么让它通? 什么原理?
我们之前设置的只是路由,但是我们要走nat地址转换,走路由的话是无法转换的


原理应该是如下图所示
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

Day09 docker-跨主机通信、持久化存储_docker_09Day09 docker-跨主机通信、持久化存储_nginx_10

可以理解为,我们的两个容器都是两个小区之中的住户,那我们要实现通信,如何实现呢?
1、住户1写信让外卖小哥通过小区1 走入小区2
2、然后通过具体的住户2的门牌号进行拜访
在这个过程中,外卖小哥相当于我们的信件作用,也就是数据包,数据包通过小区之间的大门进入对应小区,也就是物理网卡,通过物理网卡之后,外卖小哥通过小区地图对比实际住户地址,确定住户2所在位置,这个动作就是nat地址转换,而达到住户2的楼下单元楼就是docker0-> veth0 上楼送信就是veth0->veth1

那么如何让我们的外卖小哥获取到对应的地址信息,就是我们给他一张地图nat 这样他就能找到对应的地址了

iptables -t nat -I PREROUTING -s 10.0.130.0/24 -d 10.0.131.0/24 -j DNAT --to 10.0.130.1


iptables -t nat -I PREROUTING -s 10.0.131.0/24 -d 10.0.130.0/24 -j DNAT --to 10.0.131.1


# prerouting 就是流入数据包要进行nat转换 -s 源地址
-d 目标地址 -j DNAT 目的地nat转换 --to 从哪里出去的
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

Day09 docker-跨主机通信、持久化存储_docker_11Day09 docker-跨主机通信、持久化存储_nginx_12

但是问题也接踵而来,这种情况不适用于几百台服务器,如果有很多机器,不可能一条一条nat去添加的,既麻烦也不切实际

答案是calico  fannel  cilium
  • 1.
  • 2.
  • 3.

持久化存储于数据卷的共享

volumes : docker 管理宿主机文件的一部分(/var/lib/docker/volumes) 保存数据的最佳方式
bind mounts:将宿主机上的任意位置的文件或者目录挂载在容器中
tmpfs:这个基本上没人用,挂在主机的文件系统里面的
  • 1.
  • 2.
  • 3.

Day09 docker-跨主机通信、持久化存储_数据_13

关于volumes
docker volumes create test1
docker volume inspect test1
# 可以看到他的具体的挂载地址
  • 1.
  • 2.
  • 3.
  • 4.

Day09 docker-跨主机通信、持久化存储_数据_14

那么volumes 怎么使用呢?
第一种就是docker run 启动容器的时候 使用--mount 指定他的volumes名称

如: docker run -itd --name volumes-test --mount src=mount-test,dst=/usr/share/nginx/html nginx:1.15
我们一般都是用-v  或者 --mount
没有存储卷就是会自动创建
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
我们来测试一个nginx服务 能否使用挂载在宿主机上进行操作更改nginx页面

docker run -itd --name nginx-test -v /var/www/html:/usr/share/nginx/html nginx:1.15
  • 1.
  • 2.
  • 3.

Day09 docker-跨主机通信、持久化存储_nginx_15Day09 docker-跨主机通信、持久化存储_数据_16

echo helloworld > index.html
  • 1.

Day09 docker-跨主机通信、持久化存储_docker_17Day09 docker-跨主机通信、持久化存储_nginx_18

挂载容器-没啥人用
docker run -it --name test1 -v /data1 -v /data2 centos:7 bash

echo  xixi > /data1/test.txt
echo  haha > /data2/test1.txt



docker run -it --name test2 --volumes-from test1 centos:7 bash

大概效果就像这个图一样的
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

Day09 docker-跨主机通信、持久化存储_nginx_19Day09 docker-跨主机通信、持久化存储_nginx_20

bind mount 和 tmpfs
绑定数据卷  基本上不用的
docker run -itd --name nginx5-test1 --mount type=bind src=/app/wwwroot,dst=/usr/share/nginx/html nging:1.15
docker run -d -it --name nginx4-test -v /app/wwwroot:/usr/share/nginx/html nginx:1.15
记住下面的就OK了,可以实验去试试,docker inspect nginx4-test 你会发现它有Bind



临时数据卷更不推荐使用了
因为容器删除,临时数据卷也会删除,数据就不会保存下来的,临时卷不存在持久化的数据能力
当你数据不想存于主机,又不想存于容器时,可以引用临时存储卷
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
总结
volumes 是存储在docker的安装目录中,卸载docker也会丢失
/var/lib/docker下
创建容器会将容器内容映射到docker volumes的相应目录上,宿主机和容器 操作挂载中的文件都是互通的,多个运行容器间共享数据,备份,恢复,或者数据迁移。


bind mount 数据直接存在了宿主机硬盘上
删除容器或者docker并不会小时,创建容器,会将宿主机上的目录文件覆盖容器内相应目录
所以此方法挂载需要把容器内相应挂载目录的文件复制出来主机与容器共享配置文件

tmpfs :应用于安全性特殊要求,一般不使用
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.