两台局域网服务器内部的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-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再次尝试:(成功了)
仍然是使用自己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端口,关闭防火墙或者放开特定端口
发现两台机器都已经接入了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