(三)如何自定義容器網路?
? 除了 none, host, bridge 這三個自動創建的網路,用戶也可以根據業務需要創建 user-defined 網路,
? Docker 提供三種 user-defined 網路驅動:bridge, overlay 和 macvlan,overlay 和 macvlan 用于創建跨主機的網路,我們后面有章節單獨討論,
? 我們可通過 bridge 驅動創建類似前面默認的 bridge 網路,例如:
root@cuiyongchao:~# docker network create --driver bridge my_net
283474cba87cc064846c65a10007f5bbfb75f36c1725bb0940ace016b652981e
root@cuiyongchao:~# brctl show
bridge name bridge id STP enabled interfaces
br-283474cba87c 8000.02429fbbaf05 no
docker0 8000.0242b316d415 no veth6825577
vethab0efda
vethea16017
vethf263a23
? 查看一下當前 host 的網路結構變化: 新增了一個網橋 br-283474cba87c,這里 283474cba87c 正好新建 bridge 網路 my_net 的短 id,
? 執行 docker network inspect 查看一下 my_net 的配置資訊:
root@cuiyongchao:~# docker inspect my_net
[
{
"Name": "my_net",
"Id": "283474cba87cc064846c65a10007f5bbfb75f36c1725bb0940ace016b652981e",
"Created": "2020-10-30T07:22:22.351283107Z",
"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,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
? 這里 172.18.0.0/16 是 Docker 自動分配的 IP 網段,
? 我們可以自己指定 IP 網段嗎?答案是:可以,只需在創建網段時指定 --subnet 和 --gateway 引數:
root@cuiyongchao:~# docker network create --driver bridge --subnet 172.22.0.0/16 --gateway 172.22.0.1 my_net2
ba21840c171312f98e1829cb240a46ce4d120ef7c5b8b94da3d199e606967d43
root@cuiyongchao:~#
root@cuiyongchao:~# brctl show
bridge name bridge id STP enabled interfaces
br-283474cba87c 8000.02429fbbaf05 no
br-ba21840c1713 8000.0242af51b219 no
docker0 8000.0242b316d415 no veth6825577
vethab0efda
vethea16017
vethf263a23
root@cuiyongchao:~# docker network inspect my_net2
[
{
"Name": "my_net2",
"Id": "ba21840c171312f98e1829cb240a46ce4d120ef7c5b8b94da3d199e606967d43",
"Created": "2020-10-30T07:27:38.256243235Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.22.0.0/16",
"Gateway": "172.22.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
? 這里我們創建了新的 bridge 網路 my_net2,網段為 172.22.0.0/16,網關為 172.22.0.1,與前面一樣,網關在 my_net2 對應的網橋 br-ba21840c1713 上,在host上可以查看到:
root@cuiyongchao:~# ifconfig
br-283474cba87c: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:9f:bb:af:05 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
br-ba21840c1713: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.22.0.1 netmask 255.255.0.0 broadcast 172.22.255.255
ether 02:42:af:51:b2:19 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 指定:
root@cuiyongchao:~# docker run -it --network my_net2 busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:16:00:02
inet addr:172.22.0.2 Bcast:172.22.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1032 (1.0 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ #
? 容器分配到的 IP 為 172.22.0.2,
? 到目前為止,容器的 IP 都是 docker 自動從 subnet 中分配,我們能否指定一個靜態 IP 呢?答案是:可以,通過--ip指定,
root@cuiyongchao:~# docker run -it --network my_net2 --ip 172.22.0.88 busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:16:00:58
inet addr:172.22.0.88 Bcast:172.22.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:696 (696.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
注:只有使用 --subnet 創建的網路才能指定靜態 IP,
my_net 創建時沒有指定 --subnet,如果指定靜態 IP 報錯如下:
root@cuiyongchao:~# docker run -it --network my_net --ip 172.18.0.99 busybox
docker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.
ERRO[0000] error waiting for container: context canceled
root@cuiyongchao:~# docker run -it --network=my_net --ip 172.18.0.99 busybox
docker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.
root@cuiyongchao:~#
? 我們來看看當前 docker host 的網路拓撲結構,
root@cuiyongchao:~# brctl show
bridge name bridge id STP enabled interfaces
br-283474cba87c 8000.02429fbbaf05 no
br-ba21840c1713 8000.0242af51b219 no veth3ca68d7
veth99fbfd2
docker0 8000.0242b316d415 no veth6825577
vethab0efda
root@cuiyongchao:~#

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224705.html
標籤:其他
上一篇:五、功能測驗-判定表分析法
