當(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 開頭(例如 vethAQI2QT)。通過這種方式,主機(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ò)" />
接下來的部分將介紹在一些場(chǎng)景中,Docker 所有的網(wǎng)絡(luò)定制配置。以及通過 Linux 命令來調(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ī)