當(dāng) Docker 啟動(dòng)時(shí),會(huì)自動(dòng)在主機(jī)上創(chuàng)建一個(gè) docker0
虛擬網(wǎng)橋,實(shí)際上是 Linux 的一個(gè) bridge,可以理解為一個(gè)軟件交換機(jī)。它會(huì)在掛載到它的網(wǎng)口之間進(jìn)行轉(zhuǎn)發(fā)。
同時(shí),Docker 隨機(jī)分配一個(gè)本地未占用的私有網(wǎng)段(在 RFC1918 中定義)中的一個(gè)地址給 docker0
接口。比如典型的 172.17.42.1
,掩碼為 255.255.0.0
。此后啟動(dòng)的容器內(nèi)的網(wǎng)口也會(huì)自動(dòng)分配一個(gè)同一網(wǎng)段(172.17.0.0/16
)的地址。
當(dāng)創(chuàng)建一個(gè) Docker 容器的時(shí)候,同時(shí)會(huì)創(chuàng)建了一對(duì) veth pair
接口(當(dāng)數(shù)據(jù)包發(fā)送到一個(gè)接口時(shí),另外一個(gè)接口也可以收到相同的數(shù)據(jù)包)。這對(duì)接口一端在容器內(nèi),即 eth0
;另一端在本地并被掛載到 docker0
網(wǎng)橋,名稱以 veth
開(kāi)頭(例如 vethAQI2QT
)。通過(guò)這種方式,主機(jī)可以跟容器通信,容器之間也可以相互通信。Docker 就創(chuàng)建了在主機(jī)和所有容器之間一個(gè)虛擬共享網(wǎng)絡(luò)。
http://wiki.jikexueyuan.com/project/docker-technology-and-combat/images/network.png" alt="Docker 網(wǎng)絡(luò)" />
接下來(lái)的部分將介紹在一些場(chǎng)景中,Docker 所有的網(wǎng)絡(luò)定制配置。以及通過(guò) Linux 命令來(lái)調(diào)整、補(bǔ)充、甚至替換 Docker 默認(rèn)的網(wǎng)絡(luò)配置。
下面是一個(gè)跟 Docker 網(wǎng)絡(luò)相關(guān)的命令列表。
其中有些命令選項(xiàng)只有在 Docker 服務(wù)啟動(dòng)的時(shí)候才能配置,而且不能馬上生效。
-b BRIDGE or --bridge=BRIDGE
--指定容器掛載的網(wǎng)橋--bip=CIDR
--定制 docker0 的掩碼-H SOCKET... or --host=SOCKET...
--Docker 服務(wù)端接收命令的通道--icc=true|false
--是否支持容器之間進(jìn)行通信--ip-forward=true|false
--請(qǐng)看下文容器之間的通信--iptables=true|false
--禁止 Docker 添加 iptables 規(guī)則--mtu=BYTES
--容器網(wǎng)絡(luò)中的 MTU下面2個(gè)命令選項(xiàng)既可以在啟動(dòng)服務(wù)時(shí)指定,也可以 Docker 容器啟動(dòng)(docker run
)時(shí)候指定。在 Docker 服務(wù)啟動(dòng)的時(shí)候指定則會(huì)成為默認(rèn)值,后面執(zhí)行 docker run
時(shí)可以覆蓋設(shè)置的默認(rèn)值。
--dns=IP_ADDRESS...
--使用指定的DNS服務(wù)器--dns-search=DOMAIN...
--指定DNS搜索域最后這些選項(xiàng)只有在 docker run
執(zhí)行時(shí)使用,因?yàn)樗轻槍?duì)容器的特性內(nèi)容。
-h HOSTNAME or --hostname=HOSTNAME
--配置容器主機(jī)名--link=CONTAINER_NAME:ALIAS
--添加到另一個(gè)容器的連接--net=bridge|none|container:NAME_or_ID|host
--配置容器的橋接模式-p SPEC or --publish=SPEC
--映射容器端口到宿主主機(jī)-P or --publish-all=true|false
--映射容器所有端口到宿主主機(jī)