两台局域网服务器内部的docker容器如何实现网络互通(最后成功了)

1.在VM下新建两个CentOS镜像,模拟两台局域网服务器。

 2.在两个虚拟机系统中各自生成一个docker容器

centos默认的下载器不支持docker安装,需要先安装yum install ‐y epel‐release

安装dock:yum install docker有Y/N就y它

开启docker:systemctl start docker

并查看版本:docker -v

设置一下开机自启:systemctl enable docker
下载docker纯净镜像

拉想要的版本:docker pull centos:7.8.2003

下载成功后:docker images

 

 创建自定义docker网络:

原因:使用自建的bridge网络时,container的端口可直接被相同网络下的其他container访问。使用自建的bridge网络,container之间可以通过名字互访。

docker network create ‐‐driver bridge ‐‐subnet=172.18.0.0/16 ‐‐gateway=172.18.0.1 mynet1

然后查看状态:

docker network inspect mynet1

 在虚拟机CentOS7_64,创建一个容器

docker run ‐‐privileged ‐it ‐‐name centos7.8‐pxc1 ‐d ‐‐net=mynet1 ‐‐ip 172.18.0.2 centos:7.8.2003 /usr/sbin/init

执行报错:(应该是之前已经安装过了,只是没有启动)

虚拟机重启后需要手工重启docker

docker start centos7.8-pxc1

重新登陆Linux,在看

 进入docker1

 退出

 虚拟机CentOS7_64_2由于是复制的CentOS7_64的镜像文件,所以情况相同

由于两个CentOS的镜像文件是拷贝的,所以docker0和容器内子网的IP网段都是一样的。要测试连通性需要改变其中一台虚拟机系统下容器的子网地址。

查出所有的容器信息-a, 包含停止的。

docker ps -a

docker stop 容器id

docker rm  容器id

好吧!最后我决定把两个虚拟机的原来的docker容器都删除了重新开始。

3.尝试Docker-Swarm实现跨宿主机容器通信

参考:

Docker篇(五):容器之间该如何通讯?

Docker篇(五):容器之间该如何通讯?

跨宿主机- 如何实现 Docker 容器的通讯?(Docker-Swarm)

跨宿主机- 如何实现 Docker 容器的通讯?(Docker-Swarm)_大鹏-CSDN博客

docker swarm init --advertise-addr=192.168.110.205

 docker swarm join --token SWMTKN-1-16u7u7zoxeuto5qa7znro25y2t52a7nrlsj8icrdlsg1wjbykq-8sqpceaourga296h93pvl1zxa 192.168.110.205:2377

在另一台机子执行报错

 发现是防火墙限制

firewall-cmd --zone=public --add-port=2377/tcp --permanent

把192.168.110.205的2377端口打开

permanent代表长久生效

再执行成功:

docker node ls

 以上这个方法暂时没有测试成功

2021.9.18再次尝试:

先创建指定子网的overlay

docker network create -d overlay --subnet 10.2.0.0/24 ov_net1

 发现SCOPE不是Global

 想办法解决,先安装:

docker run -d  -p  8500:8500  -h  consul  --name   consul  progrium/consul  -server  -bootstrap

docker network create -d overlay --subnet 10.3.0.0/24 ov_net2

依然:

2021.9.23再次尝试:(成功了)

Overlay解决方案 Consul单实例

仍然是使用自己VM的两个centos虚拟机模拟两台不同的局域网物理宿主机,IP地址分别为

192.168.110.205,192.168.110.206

注意事项:两台虚拟机的主机名不能相同,首先修改

hostnamectl set-hostname your-new-hostname

 

 确认虚拟机网卡名:

 准备Consul使用镜像在192.168.110.205服务器上启动

在205,206都设置如下:

vi /etc/docker/daemon.json,添加红色部分

systemctl daemon-reload

systemctl restart docker

这个时候会出现问题:restart异常,解决办法(加入这行)

 

在205服务器启动Consul服务

docker run -d --network host -h consul --name=consul --restart=always -e CONSUL_BIND_INTERFACE=ens33 consul:1.5.2

没有consul:1.5.2的image,有外网会自动下载

 

 

创建Docker overlay共享网络:

docker network create -d overlay my_overlay

两台虚拟机都能看到global类型

 此时在我笔记本电脑访问(笔记本和虚拟机网络也是通的):

注意:要放开2375,8500端口,关闭防火墙或者放开特定端口

http://192.168.110.205:8500/

 

发现两台机器都已经接入了KV的node

新建3个centos的容器分别在两台服务器上,使用overlay 我们刚才创建的网络,205一个

docker run -di --network my_overlay --name mycentos1 centos:7

206两个

docker run -di --network my_overlay --name mycentos2 centos:7

docker run -di --network my_overlay --name mycentos3 centos:7

 

 205上面的容器

 

206上面两个容器

 

三个都建立好后,查询

docker network inspect my_overlay

进入容器:

 docker exec -it mycentos1 /bin/bash

这里碰到几个问题,比如

1.已经绑定了overlay网络,无法打开

解决办法:

重启docker服务后再启动容器(overlay也要重新新建)
systemctl restart docker

mycentos1,mycentos2,mycentos3都启动成功后,开始进入测试

进入容器mycentos1,测试如下:

ping本机宿主机

 ping另外一台物理机

 ping自己

 ping另一台物理机的mycentos2

 ping另一台物理机的mycentos3

 同理测试mycentos2,mycentos3