Bridge 模式
當(dāng) Docker 進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為 docker0
的虛擬網(wǎng)橋宛徊,此主機(jī)上啟動(dòng)的 Docker 容器會(huì)鏈接到這個(gè)虛擬網(wǎng)橋上歧杏。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似陪每,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中影晓。從 docker0
子網(wǎng)中分配一個(gè) IP 給容器使用,并設(shè)置 docker0
的 IP 地址為容器的默認(rèn)網(wǎng)關(guān)檩禾。在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡 veth pair
設(shè)備挂签,Docker 將 veth pair
設(shè)備的一端放在新創(chuàng)建的容器中,并命名為 eth0
(容器的網(wǎng)卡)盼产,另一端放在主機(jī)中饵婆,以 vethxxx
這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到網(wǎng)橋中戏售∏群耍可通過 brctl show
命令查看。
bridge
模式是 Docker 的默認(rèn)網(wǎng)絡(luò)模式灌灾,不寫 -net
參數(shù)搓译,就是 bridge
模式。使用 docker run -p
時(shí)锋喜,Docker 實(shí)際是在 iptables
做了 DNAT
規(guī)則些己,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能。可使用 iptables -t nat --vnL
查看段标,bridge
模式如下圖所示
$ docker run -tid --net=bridge --name docker_bri1 ubuntu-base:v3
$ docker run -tid --net=bridge --name docker_bri2 ubuntu-base:v3
$ brctl show
$ docker exec -it docker_bri1 /bin/bash
$ ficonfig -a
$ route -n
隨著 Docker 網(wǎng)絡(luò)的完善涯冠,建議將容器加入自定義的 Docker 網(wǎng)絡(luò)來連接多個(gè)容器,而不是使用 --link
參數(shù)
下面先創(chuàng)建一個(gè)新的 Docker 網(wǎng)絡(luò)
$ docker network create -d bridge my-net
-d
參數(shù)指定 Docker 網(wǎng)絡(luò)類型怀樟,有 bridge overlay
。其中 overlay
網(wǎng)絡(luò)類型用于 Swarm mode
運(yùn)行一個(gè)容器并連接到新建的 my-net
網(wǎng)絡(luò)
$ docker run -it --rm --name busybox1 --network my-net busybox sh
打開新的終端盆佣,再運(yùn)行一個(gè)容器并加入到 my-net
網(wǎng)絡(luò)
$ docker run -it --rm --name busybox2 --network my-net busybox sh
再打開一個(gè)新的終端查看容器信息
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0776372cc5ad busybox "sh" 13 seconds ago Up 12 seconds busybox2
8f4015b6747c busybox "sh" 50 seconds ago Up 49 seconds busybox1
下面通過 ping
來證明 busybox1
和 busybox2
建立了互聯(lián)關(guān)系往堡,在 busybox1
輸入如下命令
/ # ping busybox2
PING busybox2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.110 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.118 ms
用 ping
來測(cè)試連接 busybox2
容器,它會(huì)解析成 172.18.0.3
/ # ping busybox1
PING busybox1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.153 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.094 ms
如果有多個(gè)容器之間需相互連接共耍,推薦使用 Docker Compose
Host 模式
如果啟動(dòng)容器的時(shí)候使用 host
模式虑灰,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的 Network Namespace
,而是和宿主機(jī)共用一個(gè) Network Namespace
痹兜。容器將不會(huì)虛擬處自己的網(wǎng)卡穆咐,配置自己的 IP 等。而是用宿主機(jī) IP 和端口字旭。容器其他方面对湃,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的
$ docker run -tid --net=host --name docker_host1 ubuntu-base:v3
$ docker run -tid --net=host --name docker_host2 ubuntu-base:v3
$ docker exec -it docker_host1 /bin/bash
$ docker exec -it docker_host2 /bin/bash
$ ifconfig -a
$ route -n
Container 模式
這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè) Network Namespace
遗淳,而不是和宿主機(jī)共享拍柒。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的 IP屈暗,而是和一個(gè)指定的容器共享 IP华临、端口范圍等拦英。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)太援、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過 lo
網(wǎng)卡設(shè)備通信
$ docker run -tid --net=container:docker_bri1 --name docker_con1 ubuntu-base:v3
$ docker exec -it docker_con1 /bin/bash
$ docker exec -it docker_bri1 /bin/bash
$ ifconfig -a
$ route -n
None 模式
使用 none
模式惶室,Docker 容器擁有自己的 Network Namespace
神年,并不為 Docker 容器進(jìn)行任何網(wǎng)絡(luò)配置。即這個(gè) Docker 容器沒有網(wǎng)卡淆攻、IP肮之、路由器信息。需要自己為 Docker 容器添加網(wǎng)卡卜录、配置 IP 等
$ docker run -tid --net=none --name docker_non1 ubuntu-base:v3
$ docker exec -it docker_non1 /bin/bash
$ ifconfig -a
$ route -n