Docker跨主机容器网络通信

前面已经有了 Docker 的几种网络方案:none、host、bridge 和 joined 容器,它们解决了单个 Docker主机内容器通信的问题。

本文将介绍docker的跨主机网络的一些基础概念以及简单的结构(overlay)

现在来想一个生产环境,在生产环境中,希望每一台docker主机都只去运行一个服务的集群即可。如

一台docker主机运行web集群

一台docker主机运行mysql集群

一台docke主机运行php集群

可是如果想要这些环境像我们所需要的那样,以LNMP的架构运行,务必每台主机间的容器之间是需要通信的。就用到了本文的跨主机容器通信的方案

跨主机网络方案包括

  1. docker 原生的overlay和macvlan
  2. 第三方方案:常用的包括 flannel、weave

其中macvlan,不能在云端主机使用,只能在物理机使用,甚至虚拟机也不可以,比如阿里云、腾讯云、亚马逊云等都不能使用,所以不再去过多的赘述macvlan

docker 网络是一个非常活跃的技术领域,不断有新的方案开发出来,这些方案是怎么和docker集成在一起的。

跨主机网络概念

libnetwork & CNM

libnetwork 是 docker 容器网络库,最核心的内容是其定义的 Container Network Model (CNM),这个模型对容器网络进行了抽象,由以下三类组件组成:

sandbox、endpoint、network

sandbox

Sandbox 是容器的网络栈,包含容器的 interface、路由表和 DNS 设置。 Linux Network Namespace 是 Sandbox 的标准实现。Sandbox 可以包含来自不同 Network 的 Endpoint

endpoint

Endpoint 的作用是将 Sandbox 接入 Network。Endpoint 的典型实现是 veth pair,一个 Endpoint 只能属于一个网络,也只能属于一个 Sandbox。

network

Network 包含一组 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的实现可以是 Linux Bridge、VLAN 等。

跨主机通讯基础原理

如图所示两个容器,一个容器一个 Sandbox,每个 Sandbox 都有一个 Endpoint 连接到 Network,第二个 Sandbox 还有一个 Endpoint 将其接入 Network 2.,由network的概念知道,同一network的endpoint可以直接通信,也就是与图中network向量的三个endpoint的sandbox以及web1都能够通信,而network2连接的sandbox就不可以,因为network2只有一个endpoint

可以理解为人的胳膊,两只胳膊都有,胳膊之间能够通信,如果是独臂,就不够与其他容器通信

准备overlay网络环境

为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络。VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 VLAN 相同的以太网二层服务,但是拥有更强的扩展性和灵活性。vlan的个数是4096,而VxLAN是2^24

Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,需要去保存谁到谁的通信,以及谁和谁之间的网段关系,包括Network、Endpoint、IP 等。

Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,这里使用 Consul。

做之前,需要跨网络的其中一台主机需要下载consul镜像

ip 服务 备注
192.168.1.12 docker docker1
192.168.1.13 docker docker2

docker1主机下载镜像(192.168.1.12)

[root@localhost ~]# docker pull progrium/consul

因为consul在主机间传输数据依靠主机名来做,所以我们先改一下两台的主机名,以便区分

docker1

[root@localhost ~]# hostname docker1
[root@localhost ~]# bash
[root@docker1 ~]# 

docker2

[root@localhost ~]# hostname docker2
[root@localhost ~]# bash
[root@docker2 ~]# 

需要两台中将几个重要的端口号去放行

docker管理端口:2376/tcp 2376/udp

docker集群通信:2733/tcp 2733/udp

docker主机间通信:7946/tcp 7946/udp

docker overlay网络:4789/tcp 4789/udp

docker1

[root@docker1 ~]# firewall-cmd --add-port=2733/tcp --permanent
[root@docker1 ~]# firewall-cmd --add-port=2733/udp --permanent
[root@docker1 ~]# firewall-cmd --add-port=2376/udp --permanent
[root@docker1 ~]# firewall-cmd --add-port=2376/tcp --permanent
[root@docker1 ~]# firewall-cmd --add-port=7946/tcp --permanent
[root@docker1 ~]# firewall-cmd --add-port=7946/udp --permanent
[root@docker1 ~]# firewall-cmd --add-port=4789/udp --permanent
[root@docker1 ~]# firewall-cmd --add-port=4789/tcp --permanent
[root@docker1 ~]# firewall-cmd --reload
[root@docker1 ~]# firewall-cmd --list-port
2733/tcp 2733/udp 2376/udp 2376/tcp 7946/tcp 7946/udp 4789/udp 4789/tcp

docker2

[root@docker2 ~]# firewall-cmd --add-port=2733/tcp --permanent
[root@docker2 ~]# firewall-cmd --add-port=2733/udp --permanent
[root@docker2 ~]# firewall-cmd --add-port=2376/udp --permanent
[root@docker2 ~]# firewall-cmd --add-port=2376/tcp --permanent
[root@docker2 ~]# firewall-cmd --add-port=7946/tcp --permanent
[root@docker2 ~]# firewall-cmd --add-port=7946/udp --permanent
[root@docker2 ~]# firewall-cmd --add-port=4789/udp --permanent
[root@docker2 ~]# firewall-cmd --add-port=4789/tcp --permanent
[root@docker2 ~]# firewall-cmd --reload
[root@docker2 ~]# firewall-cmd --list-port
2733/tcp 2733/udp 2376/udp 2376/tcp 7946/tcp 7946/udp 4789/udp 4789/tcp

运行consul镜像,要比使用overlay网络的容器优先启动

docker1

映射consul的三个端口

8400:8400 8500:8500 8600:53

[root@docker1 ~]# docker run -d --restart always -p 8400:8400 -p 8500:8500 \
-p 8600:53/udp progrium/consul -server -bootstrap -ui-dir /ui
44bd33f2b9911b86c0479efb6169c39090b0503c28b9ff2c7edd32bed4cc7586

将consul加入docker的启动文件中

[root@docker1 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 --containerd=/run/containerd/containerd.sock \
--cluster-store=consul://192.168.1.12:8500 --cluster-advertise=ens33:2376
--cluster-store 指定 consul 的地址。
--cluster-advertise 告知 consul 自己的连接地址。

将修改过的文件传给docker2

[root@docker1 ~]# scp /usr/lib/systemd/system/docker.service \
root@192.168.1.13:/usr/lib/systemd/system/

该文件修改后应该重载文件以及重启服务,因为consul在docker1上,所以必须先启动docker1的docker服务,然后在启动docker2的docker服务

docker1

切记第一台启动完成后,再去启动第二台,因为要启动consul的8500端口,所以启动会有点慢

[root@docker1 ~]# systemctl daemon-reload 
[root@docker1 ~]# systemctl restart docker

docker2

[root@docker2 ~]# systemctl daemon-reload 
[root@docker2 ~]# systemctl restart docker

两台主机都能检测到8500端口即可

netstat -anput | grep 8500

打开浏览器,访问http://192.168.1.12:8500

找到以下两个节点,也就是docker1和docker2的ip:2376docker管理节点

access_consul

现在环境已经准备完成

创建overlay网络

需要先开启网卡的混杂模式

docker1

[root@docker1 ~]# ifconfig ens33 promisc
[root@docker1 ~]# ip a  | grep PROMISC
2: ens33: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP>

创建overlay网络

[root@docker1 ~]# docker network create --driver overlay --attachable ov_net1
a921406c8f1e6c3899b39c3ecc862d806107f7abbab4f93e9b529896dd23b66d
# 默认情况下overlay只能用于docker swarm集群环境,使用--attachable可以在集群之外单独使用

查看创建成功的overlay网络

这个网卡是基于global(全局范围),也就是所有添加过consul端口的docker服务器

[root@docker1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
49670536d26e        bridge              bridge              local
dc8bfdbda464        host                host                local
ecbab8a758e6        none                null                local
a921406c8f1e        ov_net1             overlay             global

这时在docker2查看也同样有这块网卡

[root@docker2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b1240547891e        bridge              bridge              local
fb1387ab7fc3        host                host                local
a728ac0f7801        none                null                local
a921406c8f1e        ov_net1             overlay             global

查看overlay网络信息

[root@docker1 ~]# docker network inspect ov_net1 
                    "Subnet": "10.0.0.0/24",  # 网段
                    "Gateway": "10.0.0.1"  # 网关

使用overlay网络运行容器

docker1

[root@docker1 ~]# docker run -itd --name bbox1 --network ov_net1 busybox
d74c87e1bd18e1624207d162f75cce6c13892d86a2c13e41bfdc225602eefd23
[root@docker1 ~]# docker exec bbox1 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
47: eth0@if48: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
50: eth1@if51: <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

会发现这个容器上除了lo网络还有两块网卡,eth0是overlay的网络的网卡,eth1默认路由要去使用的网卡

这时候docker还会多出一块网卡docker_gwbridge,用来为所有的连接到overlay网络的容器提供了访问外网的能力

[root@docker1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
49670536d26e        bridge              bridge              local
da3b5eb55718        docker_gwbridge     bridge              local
dc8bfdbda464        host                host                local
ecbab8a758e6        none                null                local
a921406c8f1e        ov_net1             overlay             global

查看该网卡网段,与使用overlay网络的容器中是同一个网段,他本身也是一个overlay的网络

[root@docker1 ~]# docker network inspect docker_gwbridge
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"

查看桥接网卡

注意看,veth20a968a被桥接在docker_gwbridge网卡上

[root@docker1 ~]# ip a
...
51: veth20a968a@if50: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default 
    link/ether ee:16:6e:72:93:e6 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::ec16:6eff:fe72:93e6/64 scope link 
       valid_lft forever preferred_lft forever
[root@docker1 ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.024217bee795    no        veth3ed4284
docker_gwbridge        8000.0242dbe46d3e    no        veth20a968a
virbr0        8000.525400d7704d    yes        virbr0-nic

docker_gwbridge就是为容器连接外网的

[root@docker1 ~]# docker exec bbox1 ping www.baidu.com
PING www.baidu.com (61.135.169.121): 56 data bytes
64 bytes from 61.135.169.121: seq=0 ttl=127 time=4.131 ms

使用overlay网络的容器内映射端口也是没有问题的

[root@docker1 ~]# docker run -p 80:80 -d --network ov_net1 --name web1 httpd:latest
6b60e837f2b9984b0b9c0ae6ffa88e97f0ece4b8628a9fa5f4a64af9204aed44
[root@docker1 ~]# curl 192.168.1.12
<html><body><h1>It works!</h1></body></html>

跨主机容器通信

主机之间需要开启路由转发功能,我已经开启了

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

上面在docker1已经运行一个容器,现在在docker2中运行容器

docker2

使用overlay网络运行容器,并查看ip

[root@docker2 ~]# docker exec bbox2 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
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:00:04 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.4/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
11: eth1@if12: <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

通过ip发现,与docker1中同样的网卡网段,这由consul统一的数据分配的

尝试与docker1的bbox1容器通信,成功~

[root@docker2 ~]# docker exec bbox2 ping -c 2 bbox1
PING bbox1 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.739 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=1.134 ms

--- bbox1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.739/0.936/1.134 ms

docker1的web1容器通信

[root@docker2 ~]# docker exec bbox2 ping -c 2 web1
PING web1 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.650 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.362 ms

--- web1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.362/0.506/0.650 ms

结论:

所有在consul集群中同一overlay网络中的容器可以互相通信

docker 会为每个 overlay 网络创建一个独立的 network namespace

docker网络的存放位置

[root@docker1 ~]# cd /var/run/docker/netns/
[root@docker1 netns]# ll
total 0
-r--r--r--. 1 root root 0 Apr  2 22:09 1-a921406c8f
-r--r--r--. 1 root root 0 Apr  2 22:22 244cf69f028a
-r--r--r--. 1 root root 0 Apr  2 21:43 663ad80947aa
-r--r--r--. 1 root root 0 Apr  2 22:09 e8cb0000018a

为了可让ip netns直接可以查看docker网络,做一个软链接

docker1、docker2

ln -s /var/run/docker/netns/ /var/run/netns

docker1

查看docker网络

[root@docker1 ~]# ip netns
244cf69f028a (id: 3)
e8cb0000018a (id: 2)
1-a921406c8f (id: 1)
663ad80947aa (id: 0)

docker2

[root@docker2 ~]# ip netns
c8a0a325610f (id: 1)
1-a921406c8f (id: 0)

观察可以看到两台主机都有相同的网络1-a921406c8f,这就是两台主机所在的相同的网络命名空间,为什么说在同一个命名空间。

先来看bbox1中的网卡

docker1

[root@docker1 ~]# docker exec bbox1 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
47: eth0@if48: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
50: eth1@if51: <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

使用的overlay网卡是47@48的,再看物理机中是否有这样的网卡

[root@docker1 ~]# ip a | grep @47

是没有的,那这两块网卡在哪,就在另外一个网络命名空间范围

进入ip netns查看到的相同命名空间可以看到如下

[root@docker1 ~]# ip netns exec 1-a921406c8f ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
2: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default 
    link/ether 46:1f:b7:ea:30:4e brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 brd 10.0.0.255 scope global br0
       valid_lft forever preferred_lft forever
46: vxlan0@if46: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN group default 
    link/ether d6:9f:87:b1:84:32 brd ff:ff:ff:ff:ff:ff link-netnsid 0
48: veth0@if47: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP group default 
    link/ether 46:1f:b7:ea:30:4e brd ff:ff:ff:ff:ff:ff link-netnsid 1
53: veth1@if52: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP group default 
    link/ether 56:41:d1:39:8b:e8 brd ff:ff:ff:ff:ff:ff link-netnsid 2

再来看47@48桥接在这个命名空间内br0的网卡上,可以看到上方br0也是10网段,还存在一个vxlan0

[root@docker1 ~]# ip netns exec 1-a921406c8f brctl show
bridge name    bridge id        STP enabled    interfaces
br0        8000.461fb7ea304e    no        veth0
                            veth1
                            vxlan0

通信的前提是vxlan-id相同

[root@docker1 ~]# ip netns exec 1-a921406c8f ip -d l show vxlan0
46: vxlan0@if46: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default 
    link/ether d6:9f:87:b1:84:32 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 1 
    vxlan id 256 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 noudpcsum noudp6zerocsumtx noudp6zerocsumrx 

可以看到vxlan id是256

通过一幅图来看从创建overlay网络到跨主机通信的原理

跨主机原理

如图所示,在创建ov_net1的时候,两台主机都有了这个overlay网卡,当在1.12中使用ov_net1运行bbox1时,生成了47@48的overlay网络和50@51的与1.12物理机通信的网络,同时也生成了一个网络的命名空间(1-a921406c8f)。

在网络命名空间中,有两块网卡veth0是空间中与bbox1的overlay网络相连,然后通过命名空间中的br桥接到vxlan0。

与此同时,1.13中的bbox2是同理,他们之间的互相通信,正式因为他们的网络命名空间的相同和vxlan id相同,进而可以进行通信

不同的overlay之间的隔离

不同的 overlay 网络是相互隔离的。创建第二个overlay网络ov_net2来运行容器

创建第二个overlay网络

docker2

哪台主机都行

[root@docker2 ~]# docker network create --driver overlay ov_net2
e2ddd9d7d1a609576c217d685cf8eb7e95b7ba74742afce5c31b8c7a1f53b0b1

运行容器

[root@docker2 ~]# docker run -itd --name bbox3 --network ov_net2 busybox
09a1c1a651aa4ffeb2ee8885f896c308d4a038fd47011ccfa3dcaa623d892edb

查看bbox3容器ip

[root@docker2 ~]# docker exec bbox3 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
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:01:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.2/24 brd 10.0.1.255 scope global eth0
       valid_lft forever preferred_lft forever
16: eth1@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever

现在尝试ping通bbox1或者2

[root@docker2 ~]# docker exec -it bbox3 ping -c 2 bbox1
ping: bad address 'bbox1'
[root@docker2 ~]# docker exec -it bbox3 ping -c 2 bbox2
ping: bad address 'bbox2'

跨overlay通信

[root@docker2 ~]# docker network connect ov_net1 bbox3  # 将ov_net1网络连接到bbox3的网络
[root@docker2 ~]# docker exec -it bbox3 ping -c 2 bbox2
PING bbox2 (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: seq=0 ttl=64 time=0.189 ms
--- bbox2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.189/0.189/0.189 ms
[root@docker2 ~]# docker exec -it bbox3 ping -c 2 bbox1
PING bbox1 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=1.686 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=1.411 ms
--- bbox1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.411/1.548/1.686 ms

查看bbox3的网卡变化

14连接vo_net2中的容器,16连接物理机,18连接vo_net1中的容器

[root@docker2 ~]# docker exec -it bbox3 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
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:01:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.2/24 brd 10.0.1.255 scope global eth0
       valid_lft forever preferred_lft forever
16: eth1@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever
18: eth2@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:00:05 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth2
       valid_lft forever preferred_lft forever

手动指定overlay网段

[root@docker1 ~]# docker network create --driver overlay --subnet 10.22.1.0/24 --gateway 10.22.1.1 ov_net3
03a6a6ce682d4e911ea6f0ec328eb0efddd92f5724258f01bb4fb7d0c0acbdc6
[root@docker1 ~]# docker network inspect ov_net3
                    "Subnet": "10.22.1.0/24",
                    "Gateway": "10.22.1.1"

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0