赞
踩
引出思考问题一: 在学习docker 服务的过程中想到一个问题,就是所有的docker 容器服务都部署在一台docker 宿主机上,若docker 容器服务足够多 这个docker 宿主机不会被撑死死掉么??
引出思考问题二: docker 容器里面的服务能不能跨宿主机访问另一台宿主机的docker 容器服务呢??
问题一: 其实我自己也不知道,希望有docker 大牛 可以解决这个疑问,让我这个小白能深入了解一下docker .
问题二: 请看实战操作二的内容
1. 准备两台linux centos 7 的机器:
主机名称 | ip地址 |
hadoop11 | 192.168.64.141 |
hadoop12 | 192.168.64.142 |
2. 两台机器上安装 了docker 引擎
我主要通过直接路由的方式来进行实现跨主机Docker容器通信,这种方式操作起来比较简单,对Docker原生网络改变最小,只需要互相指定对方的路由即可完成跨主机Docker容器之间的互通;
原理图如下:
1.docker网络设置
在 Docker安装完之后,默认会创建一个docker0的网桥,启动的Docker容器网段是172.17.0.1/16,如果不做调整,两台Docker主机上的容器就出现IP地址冲突 。所以我们先将默认docker0网桥的地址按【主机配置及IP信息】进行调整。
在hadoop11中创建/etc/docker/daemon.json文件,内容如下
[root@hadoop11 ~]# cat /etc/docker/daemon.json { "bip": "172.16.200.1/24" } |
重启docker服务
[root@hadoop11 ~]# systemctl restart docker
完成重启后,再看 hadoop11 中docker0的IP,已经调整完成了;
[root@hadoop11 ~]# ifconfig
使用同样的方式在 hadoop12 上进行 的操作内容
cat /etc/docker/daemon.json |
2. 分别在两台宿主机器上安装docker 容器服务
这里我们在 宿主机上安装 centos:7 为例:
[root@hadoop11 ~]# docker images
[root@hadoop11 ~]# docker pull centos:7
[root@hadoop11 ~]# docker run -d --name=centos_01 -it centos:7
[root@hadoop11 ~]# docker exec -it centos_01 /bin/bash
[root@容器终端id 号 /]# ifconfig
关于hadoop12 机器上的操作和 hadoop11 的操作一样的,这里不再进行命令的操作演示。
[root@容器终端id 号 /]# ifconfig
3. 分别在docker容器命令行终端,进行相互ping
4. 添加互通路由
原理非常简单,就是通过互相指定到达对方容器的路由;
在hadoop11主机添加到172.16.201.0/24网段的路由,指向hadoop12的IP:192.168.64.142;
在hadoop12主机添加到172.16.200.0/24网段的路由,指向hadoop11的IP:192.168.64.141;
hadoop11操作:
[root@hadoop11 ~]# route -n
[root@hadoop11 ~]# route add -net 172.16.201.0/24 gw 192.168.64.142 [root@hadoop11 ~]# route -n
hadoop12 操作:
[root@hadoop12 ~]# route -n
[root@hadoop12 ~]# route add -net 172.16.200.0/24 gw 192.168.64.141 [root@hadoop12 ~]# route -n
5. 验证是否能ping 通
在hadop11主机上的Docker容器中,ping hadoop12中的Docker容器IP:172.16.201.2;
在hadop12主机上的Docker容器中,ping hadoop11中的Docker容器IP:172.16.200.2;
hadoop11 上 进行操作
[root@hadoop11 ~]# docker exec -it centos_01 /bin/bash
发现 ping 172.16.201.2 是 ping 不同的
说明一下: 截图中的my001 ,是由于我当时关了服务器,之后重新使用的centos:7镜像,启动的的centos:7 的docker服务名称, 与 本文中的 centos_01 是一致的。
在 hadoop12 上操作:
[root@hadoop12 ~]# docker exec -it centos_02 /bin/bash
[root@docker容器服务终端号 ~]# ping 172.16.200.2
发现 ping 172.16.200.2 其实也是不能ping 通的 。 (由于忘记截图,所以这里没有原图)
6. (最重要的一步)添加防火墙转发规则, 在进行验证是否能ping 通
在 hadoop11 节点上执行:
[root@hadoop11 ~]# iptables -t nat -I PREROUTING -s 172.16.200.0/24 -d 172.16.201.0/24 -j DNAT --to 172.16.200.1
在 hadoop12节点上执行:
[root@hadoop12 ~]# iptables -t nat -I PREROUTING -s 172.16.201.0/24 -d 172.16.200.0/24 -j DNAT --to 172.16.201.1
发现现在两台跨主机 的docker 容器 能相互访问了。
最后,需要注意一点:通过路由打通跨主机Docker容器之间的 网络,必须确保Docker宿主机是在相同的网段中;
在整个实操过程中, 我学习了相关 技术牛人的博客文章。
文章一链接:Docker容器跨主机通信_L.Sir的博客-CSDN博客_docker跨主机容器通信
文章二链接: 实战|两种常用的跨主机Docker容器互通方法_大鹏的世界的博客-CSDN博客_docker跨主机容器通信
路由方式 可以使跨主机之间的Docker容器互通,操作起来也比较简单;再结合docker-compose,可以非常快速的搭建一套真正跨越宿主机的分布式环境;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。