Docker 網路

HuDu發表於2020-08-10

docker的通訊方式

預設情況下,docker使用網橋(bridge)+NAT的通訊模式

docker在啟動時預設會自動建立網橋裝置Docker0,並配置ip:

Host內容容器之間網路:

  docker建立容器的時候,會建立一堆veth虛擬網路裝置,並將其中一個veth網路裝置附加到網橋docker0,另一個加入容器的網路名字空間(network namespace),並改名為eth0.這樣同一個Host的容器與容器之間就可以通過docker0通訊了。

 

容器於外部網路:

  NAT

  1.容器訪問外部網路

    docker建立如下MASQUERADE規則:

    -tnat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

    這條規則將所有從容器(172.17.0.0/16)發出的、目的地址為Host外部網路的包的IP都修改成Host的IP,並由Host傳送出去。

  2.外部網路訪問容器

    如果容器提供的服務需要暴露給外部網路,Docker在啟動容器時,就會建立SNAT規則。比如,我們啟動一個apache容器:

    #docker run -d -p 80:80 apache

    這會建立下面的SNAT規則:

    iptables -t nat-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

    iptables -t nat-A DOCKER ! -i docker0 -p tcp -m tcp --dport80 -j DNAT --to-destination 172.17.0.2:80

    第一條規則是Docker程式啟動時預設建立的,第二條規則是在啟動容器時建立的。

 

網路配置

  網路配置引數

  docker有很多與網路配置相關的引數,一些是docker程式本身的,這會影響所有容器,另外一些是配置容器的,這些配置只會影響某個具體的容器。

 

  1.docker程式的網路配置

  -b/--bridge:指定docker使用網橋設定。預設情況下docker會使用docker0網橋裝置,通過該引數可以指定docker使用已經存在的網橋裝置。

  --bip:指定網橋裝置docker0的IP和掩碼,使用標準的CIDR形式,如192.168.1.5/24

  --dns/--dns-search:配置容器的DNS,該引數既可以在啟動docker程式時指定成為所有容器預設值,也可以在啟動容器時指定覆蓋預設值。

 

  2.容器的網路配置

  --net 用於指定容器使用的網路通訊方式,它可以取下面四個值:

  bridge:這個docker中的容器預設的方式

  none:容器沒有網路棧,無法與外部通訊

  container:<name|id>:使用其他容器(name或者id指定)的網路棧。實際上,docker會將該容器加入指定容器的network namespace,這是一種非常有用的方式。

  host:表示容器使用Host的網路,沒有自己獨立的網路棧。實際在這種情況下,docker不會給容器建立單獨的網路空間。由於容器可以完全訪問Host的網路,所以此方式是不安全的。

 

  配置DNS

  一般來說,每個容器的hostname和DNS配置資訊是不同的,我們不可能為每個容器都構建一個映象,並在映象中指定這些資訊。那麼如何解決這個問題呢?

  實際上,docker在啟動容器時,會使用bind mount動態掛載、/etc/hostname、/etc/hosts、/etc/resolv.conf幾個檔案,覆蓋映象中原來的檔案,我們可以在容器內部看到這個資訊:

 

$$ mount
...
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...
/dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ...
/dev/disk/by-uuid/1fec...ebdf on /etc/resolv.conf type ext4 ..

  

  使用可參考:https://zhuanlan.zhihu.com/fangtalk/20480923

相關文章