一、Docker常用的四種網絡模型
1.第一種:使用網絡名稱空間,但不設置任何網絡設備
這種模型中只有lo接口,是一個封閉式的容器,不能與外界進行通信。設置網絡模型需要使用 --network 選項來設置,如果不指定類型,默認是第二種模型:
~]# docker container run -it --network none busybox:latest / # ifconfig -a 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:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
2.第二種:橋接式網絡模型。
這種模型是將容器與宿主機上的docker0網絡接口相連,可實現容器對外通信。
~]# docker container run -it --network bridge busybox:latest / # hostname f9a1612f44bd / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:172.17.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:648 (648.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:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
此時的IP地址就多了宿主機上docker0的地址,有時可能我們會需要使用主機名來進行通信,所以還可以在啓動容器時定義主機名(若不是先指定,默認主機名是容器id)。
~]# docker container run -it --network bridge -h box.docker.com busybox:latest / # hostname box.docker.com / # cat /etc/hosts #查看本地解析規則 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 box.docker.com box #已被加入到本地解析規則中 / # cat /etc/resolv.conf #查看DNS服務器指向 # Generated by NetworkManager search example.com nameserver 192.168.29.2 #自動指向宿主機的DNS服務器 / # nslookup -type=A www.baidu.com #查看是否能正常解析 Server: 192.168.29.2 Address: 192.168.29.2:53 Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com Name: www.a.shifen.com Address: 61.135.169.125 Name: www.a.shifen.com Address: 61.135.169.121
這種模型中默認指向的DNS服務器是宿主機指向的DNS,當然也可以用 --dns 自定義指定DNS:
~]# docker container run -it --network bridge -h box.docker.com --dns 114.114.114.114 busybox:latest / # cat /etc/resolv.conf search example.com nameserver 114.114.114.114
使用 --add-hosts 可以注入host解析規則:
~]# docker container run -it --network bridge -h box.docker.com --add-host www.ready.com:1.1.1.1 --dns 114.114.114.114 busybox:latest / # cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 1.1.1.1 www.ready.com 172.17.0.2 box.docker.com box
使用 -p 選項將容器“暴露”到網絡上去,使外部能夠訪問容器:
-p <containerPort> 將指定容器端口映射到宿主機所有地址的一個動態端口。 -p <hostPort>:<containerPort> 將指定的容器端口映射至指定的宿主機端口。 -p <ip>:<hostPort>:<containerPort> 將指定的容器端口映射至主機指定IP的指定端口。
"動態端口"指隨機端口,具體可使用 docker port 命令查看。
~]# docker container run --name test1 --network bridge -p 80 --rm ready/httpd:v0.2
查看被映射到了哪個端口:
~]# docker port test1 80/tcp -> 0.0.0.0:32768
在物理機上訪問容器宿主機的地址+映射IP:
3.第三種模型:聯盟容器模型。
所謂聯盟容器模式就是指使兩個容器使用共同的名稱空間,比如在一般情況下,啓動兩個容器時,會被分別分配在不同的名稱空間中使容器之間相互隔離,但在一些場景中可能會需要兩個容器使用相同的名稱空間,這時就可以使用 --network container:<容器名> 將兩個容器劃分爲一個共享的名稱空間。要注意的是這裏共享的僅僅只是網口名稱空間,文件系統等還是相互隔離的。
若要使容器共享宿主機的網絡名稱空間,則可以使用 --network host ,可以看到容器中的IP地址和宿主機上的IP一致了:
~]# docker container run --name box1 -it --network host --rm busybox:latest / # ifconfig docker0 Link encap:Ethernet HWaddr 02:42:19:55:5A:6A inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0 inet6 addr: fe80::42:19ff:fe55:5a6a/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:45 errors:0 dropped:0 overruns:0 frame:0 TX packets:55 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3432 (3.3 KiB) TX bytes:5494 (5.3 KiB) ens33 Link encap:Ethernet HWaddr 00:0C:29:A7:59:CC inet addr:192.168.29.101 Bcast:192.168.29.255 Mask:255.255.255.0 inet6 addr: fe80::7c47:ae3e:a9b4:fe7c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8392 errors:0 dropped:0 overruns:0 frame:0 TX packets:3438 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:626540 (611.8 KiB) TX bytes:389180 (380.0 KiB)
二、修改默認docker0的地址以及創建網絡接口
可在docker的配置文件中修改,路徑爲: /etc/docker/daemon.json
{ "bip": "192.168.1.5/24", #核心選項爲bip,即bridge ip之意,用於指定docker0橋自身的IP地址;其它選項可通過此地址計算得出。 "fixed-cidr": "10.20.0.0/16", "fixed-cidr-v6": "2001:db8::/64", "mtu": 1500, "default-gateway": "10.20.1.1", "default-gateway-v6": "2001:db8:abcd::89", "dns": ["10.20.1.2","10.20.1.3"] }
在容器中創建新的網絡接口可使用 docker network create 命令。