自定义容器网络
除了 none, host, bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络。
Docker 提供三种 user-defined 网络驱动:
- bridge
- overlay
- macvlan
overlay 和 macvlan 用于创建跨主机的网络,我们后面有章节单独讨论。
我们可通过 bridge 驱动创建类似前面默认的 bridge 网络,例如:
1 root@ubuntu:~# docker network create --driver bridge my_net 2 150e61912b36901d8b884e58c322186e9462933b8f87f5d7ac5531cb2d232291 3 root@ubuntu:~#
查看一下当前 host 的网络结构变化:
1 root@ubuntu:~# brctl show 2 bridge name bridge id STP enabled interfaces 3 br-150e61912b36 8000.02426da65730 no 4 docker0 8000.0242841fd925 no vetha0836f4 5 vethe1126ec 6 root@ubuntu:~#
新增了一个网桥 br-150e61912b36,这里 150e61912b36 正好新建 bridge 网络 my_net
的短 id。执行 docker network inspect
查看一下 my_net
的配置信息:
1 root@ubuntu:~# docker network inspect my_net 2 [ 3 { 4 "Name": "my_net", 5 "Id": "150e61912b36901d8b884e58c322186e9462933b8f87f5d7ac5531cb2d232291", 6 "Created": "2019-02-21T03:51:25.067138843-05:00", 7 "Scope": "local", 8 "Driver": "bridge", 9 "EnableIPv6": false, 10 "IPAM": { 11 "Driver": "default", 12 "Options": {}, 13 "Config": [ 14 { 15 "Subnet": "172.18.0.0/16", 16 "Gateway": "172.18.0.1" 17 } 18 ] 19 }, 20 "Internal": false, 21 "Attachable": false, 22 "Ingress": false, 23 "ConfigFrom": { 24 "Network": "" 25 }, 26 "ConfigOnly": false, 27 "Containers": {}, 28 "Options": {}, 29 "Labels": {} 30 } 31 ] 32 root@ubuntu:~#
这里 172.18.0.0/16 是 Docker 自动分配的 IP 网段。
也可以自己指定 IP 网段,只需在创建网段时指定 --subnet
和 --gateway
参数:
1 root@ubuntu:~# docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2 2 30f89dcc5e69a6887c8139054f39b2347c790de6da1d0460f657c7467307754b 3 root@ubuntu:~# 4 root@ubuntu:~# docker network inspect my_net2 5 [ 6 { 7 "Name": "my_net2", 8 "Id": "30f89dcc5e69a6887c8139054f39b2347c790de6da1d0460f657c7467307754b", 9 "Created": "2019-02-21T03:53:06.250744749-05:00", 10 "Scope": "local", 11 "Driver": "bridge", 12 "EnableIPv6": false, 13 "IPAM": { 14 "Driver": "default", 15 "Options": {}, 16 "Config": [ 17 { 18 "Subnet": "172.22.16.0/24", 19 "Gateway": "172.22.16.1" 20 } 21 ] 22 }, 23 "Internal": false, 24 "Attachable": false, 25 "Ingress": false, 26 "ConfigFrom": { 27 "Network": "" 28 }, 29 "ConfigOnly": false, 30 "Containers": {}, 31 "Options": {}, 32 "Labels": {} 33 } 34 ] 35 root@ubuntu:~#
这里我们创建了新的 bridge 网络 my_net2
,网段为 172.22.16.0/24,网关为 172.22.16.1。与前面一样,网关在 my_net2
对应的网桥 br-30f89dcc5e69 上:
1 root@ubuntu:~# ifconfig br-30f89dcc5e69 2 br-30f89dcc5e69 Link encap:Ethernet HWaddr 02:42:fd:21:c8:7e 3 inet addr:172.22.16.1 Bcast:172.22.16.255 Mask:255.255.255.0 4 UP BROADCAST MULTICAST MTU:1500 Metric:1 5 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 6 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 7 collisions:0 txqueuelen:0 8 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
容器要使用新的网络,需要在启动时通过 --network
指定:
1 root@ubuntu:~# docker run -it --network=my_net2 busybox 2 / # 3 / # ip a 4 1: lo:mtu 65536 qdisc noqueue qlen 1 5 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 6 inet 127.0.0.1/8 scope host lo 7 valid_lft forever preferred_lft forever 8 80: eth0@if81: mtu 1500 qdisc noqueue 9 link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff 10 inet 172.22.16.2/24 brd 172.22.16.255 scope global eth0 11 valid_lft forever preferred_lft forever 12 / #
容器分配到的 IP 为 172.22.16.2。
到目前为止,容器的 IP 都是 docker 自动从 subnet 中分配,可以通过--ip
指定一个静态IP。
1 root@ubuntu:~# docker run -it --network=my_net2 --ip 172.22.16.8 busybox 2 / # 3 / # ip a 4 1: lo:mtu 65536 qdisc noqueue qlen 1 5 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 6 inet 127.0.0.1/8 scope host lo 7 valid_lft forever preferred_lft forever 8 82: eth0@if83: mtu 1500 qdisc noqueue 9 link/ether 02:42:ac:16:10:08 brd ff:ff:ff:ff:ff:ff 10 inet 172.22.16.8/24 brd 172.22.16.255 scope global eth0 11 valid_lft forever preferred_lft forever 12 / #
注:只有使用 --subnet
创建的网络才能指定静态 IP。
my_net
创建时没有指定 --subnet
,如果指定静态 IP 报错如下:
1 root@ubuntu:~# docker run -it --network=my_net --ip 172.18.0.8 busybox 2 docker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets. 3 ERRO[0000] error waiting for container: context canceled 4 root@ubuntu:~#
当前 docker host 的网络拓扑结构
--------------------------------引用来自---------------------------------
https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587686&idx=1&sn=10f799f4b4c4a552871e751615b56880&chksm=8d3080ffba4709e9926d137a4cdb2a5907c96e0107481de297b071f3aabe37dbeeb0d34ef7d9&scene=21#wechat_redirect