[toc]
docker跨主机通信之overlay
1.overlay说明
overlay优点
- 会自动分配IP地址,需要consul数据库
网络类型为overlay的容器默认有两块网卡
-
eth0 用于跨主机间容器通信
-
eth1 用于连接外网
网关默认为172.18.0.1,是宿主机docker_gwbridge网卡的IP地址
overlay网络跨主机通信示意图

2.overlay跨主机通信示例
2.1 实验环境
| 主机名 | IP |
|---|---|
| docker01 | 10.0.0.60 |
| docker02 | 10.0.0.61 |
2.2 docker01操作
2.2.1 启动consul容器
docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap
2.2.2 查看容器,容器映射了好多端口
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84c733c42a91 progrium/consul "/bin/start -server …" 24 seconds ago Up 23 seconds 53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp consul
2.2.3 容器启动后可以访问一个web界面
浏览器访问 10.0.0.60:8500

2.2.4 修改docker配置文件 /etc/docker/daemon.json
修改配置文件 /etc/docker/daemon.json ,加入以下三行
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.60:8500",
"cluster-advertise": "10.0.0.60:2376"
参数说明
| 参数 | 说明 |
|---|---|
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"] | 本地监听tcp2376端口,同时指定sock文件 |
"cluster-store": "consul://10.0.0.60:8500" | 集群信息存放位置,这里为docker01 10.0.0.60 |
"cluster-advertise": "10.0.0.60:2376" | 客户机自身IP地址,这里为docker01 10.0.0.60 |
修改docker服务启动文件 /usr/lib/systemd/system/docker.service ,否则后续重启docker会报错
修改 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改为 ExecStart=/usr/bin/dockerd
重启docker
systemctl daemon-reload && systemctl restart docker
2.3 docker02操作
2.3.1 启动consul容器
docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap
2.3.2 查看容器,容器映射了好多端口
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a793cf0b4aed progrium/consul "/bin/start -server …" 37 seconds ago Up 35 seconds 53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp consul
2.3.3 容器启动后可以访问一个web界面
浏览器访问 10.0.0.61:8500

2.3.4 修改docker配置文件 /etc/docker/daemon.json
修改配置文件 /etc/docker/daemon.json ,加入以下三行
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.60:8500",
"cluster-advertise": "10.0.0.60:2376"
参数说明
| 参数 | 说明 |
|---|---|
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"] | 本地监听tcp2376端口,同时指定sock文件 |
"cluster-store": "consul://10.0.0.60:8500" | 集群信息存放位置,这里为docker01 10.0.0.60 |
"cluster-advertise": "10.0.0.61:2376" | 客户机自身IP地址,这里为docker02 10.0.0.61 |
修改docker服务启动文件 /usr/lib/systemd/system/docker.service ,否则后续重启docker会报错
修改 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改为 ExecStart=/usr/bin/dockerd
重启docker
$ systemctl daemon-reload && systemctl restart docker
2.3.5 最终效果
访问docker1 consul的web界面 KEY/VALUE --> docker --> nodes 正确情况为出现两个docker节点

到此,基础环境配置完成!!!
2.4 通信测试
2.4.1 docker01创建overlay网络,会自动同步到docker02,因为docker01和docker02都在consul集群中
docker01创建overlay网络
$ docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 overlay1
7a836393a60d6f87bd0053b2d75198a60960db8a98a34488d145eef1fef35711
查看创建的网络,名称为 overlay1 ,类型为 global ,与其余网络类型不一样
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
d25efee562f5 bridge bridge local
1c11b715a65c host host local
b0ddd6fd07ed macvlan_1 macvlan local
74d6b08c35c5 none null local
7a836393a60d overlay1 overlay global
docker02查看网络,可以看到docker01创建的 overlay 网络自动同步到了docker02
docker network ls
NETWORK ID NAME DRIVER SCOPE
59e0e535367b bridge bridge local
c464712c8392 host host local
7d9727dd0d2d macvlan_1 macvlan local
be782cbc19a4 none null local
7a836393a60d overlay1 overlay global
2.4.2 docker01启动容器overlay1
启动一个容器,指定网络为之前创建的overlay1
docker run -it --net overlay1 --name overlay1 busybox:latest /bin/sh
进入容器查看IP地址,IP地址为 172.16.1.1 ,因为之前创建overlay网络的时候指定了网段为172.16.1.0/24
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
46: eth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 02:42:ac:10:01:01 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.1/24 brd 172.16.1.255 scope global eth0
valid_lft forever preferred_lft forever
49: eth1@if50: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
valid_lft forever preferred_lft forever
2.4.3 docker02启动容器overlay2
启动一个容器,指定网络为之前创建的overlay1
docker run -it --net overlay1 --name overlay2 busybox:latest /bin/sh
查看IP地址,IP地址为 172.16.1.2 ,因为之前创建overlay网络的时候指定了网段为172.16.1.0/24
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 02:42:ac:10:01:02 brd ff:ff:ff:ff:ff:ff
inet 172.16.1.2/24 brd 172.16.1.255 scope global eth0
valid_lft forever preferred_lft forever
15: eth1@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
valid_lft forever preferred_lft forever