实现docker 容器跨主机互通。 推荐使用 overlay 网络类型。
什么是overlay网络
该overlay
网络驱动程序会在多个Docker守护进程主机之间创建一个分布式网络。这个网络位于特定于主机的网络之上,允许连接到它的容器(包括群集服务容器)安全地通信。Docker透明地处理每个包与正确的Docker守护进程主机和正确的目标容器之间的路由。
当你初始化一个群或加入一个Docker主机到一个现有的群,将在该Docker主机上创建两个新网络
docker_gwbridge
,它将各个Docker守护程序连接到该集群中的其他守护程序。可以使用docker network create创建自定义的overlay网络,容器以及服务可以加入多个网络,只有同一网络中的容器可以相互交换信息,可以将单一容器或是swarm服务连接到overlay网络中。
在 搭建 阿里云dcoker 跨主机通信前。已在物理机集群上使用 docker swarm + overlay 成功解决了跨主机访问的问题。 本以为直接在阿里云上,再搭一次,应该不会有什么问题。 可事与愿违,最终无法在 阿里云集群服务器上,搭建docker 跨主机互通。
然后各种找资料, 使用了 consul + overlay ,也无法互通。
最后终于找到答案:
阿里云售后工程师 : 您好,vpc网络不支持自建vxlan,跟底层有冲突。
不推荐您自建集群,一是难度很高花费时间很大,二是自建有很多兼容性问题。而且自建的容器集群没有阿里云容器服务官方技术支持,只能自己在网上找资料解决。
建议您考虑用阿里云提供的容器服务来搭建集群,容器服务本身是免费的,只是集群关联的云资源是付费的,您可以建个免费的集群,把现有的ECS加到集群的节点里面直接使用,省去了您搭建、调试集群的步骤。
截图:
阿里员工 明确回答:vpc网络不支持的自建vxlan, 而docker overlay用了vxlan!
另外其他各大云服务器应该也是不行,有人测过腾讯云服务器也不行(这个我没验证!)。
docker swarm集群可以使用阿里云提供的容器服务(阿里云容器服务提供了docker swarm或k8s的集群服务),或者自己机房搭建!
至于自建k8s还没弄过暂时不清楚。
如果两台同地域的ECS实例之间需要传输数据,建议使用内网连接。云服务器ECS与云数据库、负载均衡以及对象存储之间也可以使用内网相互连接使用。
云服务器ECS内网间,非I/O优化的实例为千兆共享带宽,I/O优化的实例为万兆或25G共享带宽。由于是共享网络,因此无法保证带宽速度是不变的。
对于内网中的ECS实例:
网络类型 | 所属账号 | 地域 | 安全组 | 如何实现内网互通 |
---|---|---|---|---|
VPC(同一VPC) | 同一账号或不同账号 | 同一地域 | 同一安全组 | 默认互通,也可以实现安全组内网络隔离。详情请参见安全组内网络隔离。 |
不同安全组 | 安全组授权实现内网互通,详情请参见安全组应用案例。 | |||
VPC(不同VPC) | 同一账号或不同账号 | 同一地域 | 不同安全组 | 通过高速通道实现网络互通,详情请参见使用场景。 |
不同地域 | ||||
经典网络 | 同一个账号 | 同一地域 | 同一安全组 | 默认互通。 |
不同账号 | 同一地域 | 同一安全组或不同安全组 | 安全组授权实现内网互通,详情参见安全组应用案例。 |
以上说的很清楚。 同一个VPC、同一账号、同一地域、同一安全组、网络默认是互通的。
也就是说,我至少有两台服务器,目前网络是互通的。 (即华东二区的),然后我就 尝试的,使用 consul + overlay ,来测试,这两台服务器上,的容器。能不能互相ping 通。 幸运的是。能正常ping通。 但是在 华东一区。肯定就不行了。 因此,我在华东二区上,又买了一台。 同时不再续费 华东一区的了。
接下来,详细说明。如果 搭建 consul+overlay 环境。
1、拉取 consul镜像并运行容器
[root@master /]# docker pull consul
Using default tag: latest
latest: Pulling from library/consul
Digest: sha256:a167e7222c84687c3e7f392f13b23d9f391cac80b6b839052e58617dab714805
Status: Image is up to date for consul:latest
docker.io/library/consul:latest
[root@master /]# docker run -dit \
--network host \
--privileged=true \
--restart=always \
--hostname=master_consul \
--name=master-consul \
-v /etc/localtime:/etc/localtime \
-e CONSUL_BIND_INTERFACE=eth0 \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
consul:latest \
agent -server \
-bind=172.18.18.11 \
-advertise=11.11.11.11 \
-bootstrap-expect=3 -ui -node=master-consul \
-data-dir=/tmp/consul -client 0.0.0.0
说明:
-e CONSUL_BIND_INTERFACE=eth0 使用 eth0 网卡
-bind=172.18.18.11 表示 bind 这个服务器的 内网ip地址。 即 网卡 eth0 的地址
-advertise=11.11.11.11 表示通告地址,使用的是 公网Ip
2、进入容器,加入集群
a、进入容器
docker exec -it master-consul sh
b、 加入 consul 集群
consul join 11.11.11.11
3、剩余的两台 服务器,也是同样的步骤。
注: 11.11.11.22 和 11.11.11.33 都是 consul join 11.11.11.11
# 创建 overlay 网卡,用于 集群服务的网卡设置(只需要在 master 节点上创建,从节点自然会获取)
docker network create --driver overlay --subnet=20.0.0.0/24 --gateway=20.0.0.254 --attachable cluster-overlay-sub
1、运行nginx 容器
docker run -dit \
--net cluster-overlay-sub \
--ip 20.0.0.247 \
--privileged=true \
--restart=always \
--name=keda-master-nginx \
--hostname=master_nginx \
-p 80:80 \
-p 443:443 \
-p 18500:8500 \
-v /usr/docker/software/nginx/html/:/usr/share/nginx/html/ \
-v /usr/docker/software/nginx/conf/:/etc/nginx/ \
-v /usr/docker/software/nginx/home/:/home/ \
-v /usr/docker/software/nginx/data/:/data/ \
-v /usr/docker/software/nginx/logs/:/var/log/nginx/ \
-v /etc/localtime:/etc/localtime \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
nginx:latest
2、配置 nginx 的 upstream
#consul集群负载均衡
upstream consul {
server 11.11.11.11:8500;
server 11.11.11.22:8500;
server 11.11.11.33:8500;
}
#监听本机8500端口,转发到upstream consul下
server {
listen 8510;
location / {
include /etc/nginx/conf.d/proxy.conf;
proxy_pass http://consul;
}
}
[root@master /]# vim /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:12375 -H unix://var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://11.11.11.11:18510 --cluster-advertise=172.18.18.11:12375 -H tcp://0.0.0.0:12375 -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3
# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
主要:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://11.11.11.11:18510 --cluster-advertise=172.18.18.11:12375 -H tcp://0.0.0.0:12375 -H unix://var/run/docker.sock
--cluster-store=consul://11.11.11.11:18510
表示:nginx的地址。 通过nginx 来负载 consul 集群
--cluster-advertise=172.18.18.11:12375
表示:本机内网Ip地址+docker 通信端口 12375(默认是2375,尽量改成别的。不然容易被 攻击)
sudo systemctl daemon-reload & sudo systemctl restart docker
1、创建容器
master:
docker run -dit \
--net cluster-overlay-sub \
--ip 20.0.0.3 \
--privileged=true \
--restart=always \
--name=springCloud-master-eureka \
--hostname=master_eureka \
-v /usr/docker/springCloud/eureka-dockerfile/eureka/:/var/local/eureka/ \
-v /data/springCloud/eureka/:/data/springCloud/ \
-v /etc/localtime:/etc/localtime \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-p 20000:9800 \
seowen/eureka:latest \
slave1:
docker run -dit \
--net cluster-overlay-sub \
--ip 20.0.0.4 \
--privileged=true \
--restart=always \
--name=springCloud-slave1-eureka \
--hostname=salve1_eureka \
-v /usr/docker/springCloud/eureka-dockerfile/eureka/:/var/local/eureka/ \
-v /data/springCloud/eureka/:/data/springCloud/ \
-v /etc/localtime:/etc/localtime \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-p 20000:9800 \
seowen/eureka:latest \
slave2:
docker run -dit \
--net cluster-overlay-sub \
--ip 20.0.0.5 \
--privileged=true \
--restart=always \
--name=springCloud-slave2-eureka \
--hostname=salve2_eureka \
-v /usr/docker/springCloud/eureka-dockerfile/eureka/:/var/local/eureka/ \
-v /data/springCloud/eureka/:/data/springCloud/ \
-v /etc/localtime:/etc/localtime \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-p 20000:9800 \
seowen/eureka:latest \
2、进入容器,ping
[root@master opt]# clear
[root@master opt]# docker exec -it e03b31f2c8b6 bash
[root@master_eureka eureka]# ifconfig
eth0: flags=4163 mtu 1450
inet 20.0.0.2 netmask 255.255.255.0 broadcast 20.0.0.255
ether 02:42:14:00:00:02 txqueuelen 0 (Ethernet)
RX packets 1110 bytes 81148 (79.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=4163 mtu 1500
inet 172.18.0.2 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet)
RX packets 3181102 bytes 810628239 (773.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2869065 bytes 791404615 (754.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 31 bytes 2392 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 31 bytes 2392 (2.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@master_eureka eureka]# ping 20.0.0.3
PING 20.0.0.3 (20.0.0.3) 56(84) bytes of data.
64 bytes from 20.0.0.3: icmp_seq=1 ttl=64 time=1003 ms
64 bytes from 20.0.0.3: icmp_seq=2 ttl=64 time=3.22 ms
64 bytes from 20.0.0.3: icmp_seq=3 ttl=64 time=1.79 ms
64 bytes from 20.0.0.3: icmp_seq=4 ttl=64 time=1.79 ms
64 bytes from 20.0.0.3: icmp_seq=5 ttl=64 time=1.77 ms
64 bytes from 20.0.0.3: icmp_seq=6 ttl=64 time=1.77 ms
3、查看 network
[root@slave2 ~]# docker network inspect cluster-overlay-sub
[
{
"Name": "cluster-overlay-sub",
"Id": "26db25278114e2cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxca1f2eddba1cf38add952b0",
"Created": "2019-12-25T18:29:51.325915414+08:00",
"Scope": "global",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "20.0.0.0/24",
"Gateway": "20.0.0.254"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"48f2da4eaa2c693939d6xxxxxxxxxxxxxxxxxxxxxxxxxxxx7c58669a4b464ad493f73": {
"Name": "springCloud-slave2-eureka",
"EndpointID": "2d2c68a17e0b27915e52xxxxxxxxxxxxxxxxxxxxxxxxxxx467f0eb1f7bda9",
"MacAddress": "02:42:14:00:00:04",
"IPv4Address": "20.0.0.4/24",
"IPv6Address": ""
},
"ep-2b407f01d38b6cb1dc247xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa068040be6ded8": {
"Name": "keda-master-nginx",
"EndpointID": "2b407f01d38b6cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx68040be6ded8",
"MacAddress": "02:42:14:00:00:f7",
"IPv4Address": "20.0.0.247/24",
"IPv6Address": ""
},
"ep-732b41808e90ce0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxe149c0eec41": {
"Name": "springCloud-slave1-eureka",
"EndpointID": "732b41808e90ce0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx149c0eec41",
"MacAddress": "02:42:14:00:00:03",
"IPv4Address": "20.0.0.3/24",
"IPv6Address": ""
},
"ep-7609e871f68fe5bc6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5e0573fc30d73f": {
"Name": "springCloud-master-eureka",
"EndpointID": "7609e871f68fe5bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx573fc30d73f",
"MacAddress": "02:42:14:00:00:02",
"IPv4Address": "20.0.0.2/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@slave2 ~]#