docker-网络-自定义

除了 none, host, bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络。
Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan。overlay 和 macvlan 用于创建跨主机的网络,这里先看看bridge网络

我们可通过 bridge 驱动创建类似前面默认的 bridge 网络,例如:

1
# docker network create --driver bridge my_net

查看一下当前 host 的网络结构变化:

1
2
3
4
# brctl show
bridge name bridge id STP enabled interfaces
br-eaed97dc9a77 8000.024232661b4b no
docker0 8000.024224223ee8 no veth28c57d

新增了一个网桥 br-eaed97dc9a77,这里 eaed97dc9a77 正好新建 bridge 网络 my_net 的短 id。执行 docker network inspect 查看一下 my_net 的配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# docker network inspect my_net
[
{
"Name": "my_net",
"Id": "c03b9316a8fd6fd403ac1b50a7ce6f357742b665070b691cf7e31e57b61e7daf",
"Created": "2018-06-07T16:48:46.015739236+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

这里 172.18.0.0/16 是 Docker 自动分配的 IP 网段。

我们可以自己指定 IP 网段吗?
答案是:可以。

只需在创建网段时指定 –subnet 和 –gateway 参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
# docker network inspect my_net2
[
{
"Name": "my_net2",
"Id": "3cc6dd90e52428b43c6753a5405cef7256cbb72f79be67a360374148bdbd03f5",
"Created": "2018-06-07T17:18:51.750474776+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.22.16.0/24",
"Gateway": "172.22.16.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

这里我们创建了新的 bridge 网络 my_net2,网段为 172.22.16.0/24,网关为 172.22.16.1。与前面一样,网关在 my_net2 对应的网桥 br-5d863e9f78b6 上:

1
2
3
4
5
6
7
8
9
# ifconfig br-5d863e9f78b6
br-5d863e9f78b6: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.22.16.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::42:32ff:fe66:1b4b prefixlen 64 scopeid 0x20<link>
ether 02:42:32:66:1b:4b txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
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

容器要使用新的网络,需要在启动时通过 –network 指定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# docker run --it --network=my_net2 busybox
/ # 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff
inet 172.22.16.2/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe16:1002/64 scope link
valid_lft forever preferred_lft forever
/ #

容器分配到的 IP 为 172.22.16.2。

到目前为止,容器的 IP 都是 docker 自动从 subnet 中分配,我们能否指定一个静态 IP 呢?

答案是:可以,通过–ip指定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# docker run -it --network=my_net2 --ip 172.22.16.8 busybox
/ # 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:16:10:08 brd ff:ff:ff:ff:ff:ff
inet 172.22.16.8/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe16:1008/64 scope link tentative
valid_lft forever preferred_lft forever

注:只有使用 –subnet 创建的网络才能指定静态 IP。

my_net 创建时没有指定 –subnet,如果指定静态 IP 会报错

当前 docker host 的网络拓扑结构:
avatar

转自:自定义网络