1. 程式人生 > >Docker高階網路

Docker高階網路


title: Docker高階網路
tags: Docker


本文搬運的《Docker技術入門與實戰》,有興趣的同學可以看看。

網路啟動與配置引數

基本過程

        Docker啟動時會在主機上自動建立一個 docker0虛擬網橋,實際上是一個 Linux網橋,可以理解為一個軟體交換機。它會在掛載其上的接- 之間進行轉發。
        同時, Docker隨機分配一個本地未佔用的私有網段(在RFC1918中定義)中的一個地址給 docker0接- 。比如典型的172.17.42.1,掩碼為255.255.0.0。此後啟動的容器內的網- 也會自動分配一個同一網段(172.17.0.0/16)的地址。
        當建立一個 Docker容器的時候,同時會建立了一對 veth pair接- (當資料包傳送到一個接- 時,另外一個接- 也可以收到相同的資料包)。這對接- 一端在容器內,即eth0;另一端在本地並被掛載到 docker0網橋,名稱以veth開頭(例如 vethAQI2QT)。通過這種方式,主機可以跟容器通訊,容器之間也可以相互通訊。如此一來, Docker就建立了在主機和所有容器之間一個虛擬共享網路。

網路相關引數

        下面是跟 Docker網路相關的命令引數。其中有些命令選項只有在 Docker服務啟動的時候才能配置,而且不能馬上生效.

    • b BRIDGE or --bridge=BRIDGE 指定容器掛載的網橋。
  • –bip=CIDR 定製 docker0的掩碼。
    • H SOCKET… or --host= SOCKET… Docker服務端接收命令的通道。
  • –icc= true|false 是否支援容器之間進行通訊。
  • –ip- forward=true|false 啟用 net. ipv4. ip forward,即開啟轉發功能。
  • – iptables=true|false 禁止 Docker新增 iptables規則。
  • –mtu= BYTES 容器網路中的MTU。

        下面兩個命令選項既可以在啟動服務時指定,也可以 Docker容器啟動( docker run)時候指定。在 Docker服務啟動的時候指定則會成為預設值,後續執行 docker run時可以覆蓋設定的預設值:

  • –dns= IP_ADDRESS … 使用指定的DNS伺服器
  • –dns- search= DOMAIN… 指定DNS搜尋域。

        最後這些選項只能在 docker run執行時使用,因為它是針對容器的特性內容:

    • h HOSTNAME or-- hostname= HOSTNAME 配置容器主機名。
  • –link=CONTAINER NAME: ALIAS 新增到另一個容器的連線。
  • –net= bridge I none I container: NAME or ID|host 配置容器的橋接模式。
    • p SPEC or --publish=SPEC 對映容器端- 到宿主主機
  • -P or – publish-all=true|false 對映容器所有端- 到宿主主機。

配置容器DNS 和主機名

相關配置檔案

        實際上,容器中主機名和DNS配置資訊都是通過三個系統配置檔案來維護的:/etc/resolv.conf、/etc/ hostname和/etc/ hosts 。其中, /etc/ resolv.conf檔案在建立容器時候,預設會與宿主機/etc/resolv.conf檔案內容保持一致。

        etc/ hosts檔案中預設只記錄了容器自身的一些地址和名稱:

[email protected] 5dbd6685305: / cat /etc/hosts
172.17.0.2 75dbd6685305
localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1  localhost

/etc/ hostname檔案則記錄了容器的主機名

[email protected]: / cat /etc/hostname 75dbd6685305

容器內修改配置檔案

        Docker1.2.0開始支援在執行中的容器裡直接編輯/etc/ hosts,/etc/ hostname和/etc/ resolve.conf檔案。

        但是這些修改是臨時的,只在執行的容器中保留,容器終止或重啟後並不會被儲存下來。也不會被 docker commit提交。

通過產生指定

        如果使用者想要自定義容器的配置,可以在建立或啟動容器時利用下面的引數指定:

  • 指定主機名- h HOSTNAME or-- hostname= HOSTNAME。設定容器的主機名,它會被寫到容器內的/etc/hostname和/etc/ hosts。但這個主機名只有容器內能看到,在容器外部則看不到,既不會在 docker ps中顯示,也不會在其他的容器的/etc/ hosts看到。

  • 記錄其他容器主機名–link= CONTAINER NAME: ALLAS。選項會在建立容器的時候,新增一個所連線容器的主機名到容器內/etc/ hosts檔案中。這樣,新建立容器可以直接使用主機名來與所連線容器通訊。

  • 指定DNS伺服器–dns= IP_ADDRESS。新增DNS伺服器到容器的/etc/ resolvconf中,容器會用指定的伺服器來解析所有不在/etc/ hosts中的主機名。

  • 指定DNS搜尋域–dns-search=DOMAIN。設定容器的搜尋域,當設定搜尋域為. example,com時,在搜尋一個名為host的主機時,DNS不僅搜尋host,還會搜尋host.example.com

容器訪問控制

容器訪問外部網路

        在宿主機 Linux系統中,檢查轉發是否開啟:
sysctl net.ipv4.ip_forward net.ipv4.ip_forward=1

        如果為0,說明沒有開啟轉發,則需要手動開啟:
sysctl -w net.ipv4.ip_forward=1

        更簡單的,在啟動 Docker服務的時候設定-ip- forward=true, Docker服務會自動開啟宿主機系統的轉發服務。

容器之間訪問

訪問所有埠

        當啟動 Docker服務時候,預設會新增一條“允許”轉發策略到 iptables的FORWARD鏈上。通過配置--icc= true|false(預設值為true)引數可以控制預設的策略。

        為了安全考慮,可以在/etc/default/docker檔案中配置 DOCKER OPTS=--icc=fase來預設禁止容器之間的相互訪問。

        同時,如果啟動 Docker服務時手動指定-- iptables= false引數則不會修改宿主機系統上的 iptables規則。

訪問指定埠
        在通過-icc= false禁止容器間相互訪問後,仍可以通過--link=CONTAINER_NAME:ALIAS選項來允許訪問指定容器的開放埠。

自定義網橋

        除了預設的 docker0網橋,使用者也可以指定網橋來連線各個容器。
        在啟動 Docker服務的時候,使用- b BRIdge或-- bridge=BRIDGE來指定使用的網橋。

        如果服務已經執行,那需要先停止服務,並刪除舊的網橋:

service docker stop
ip link set dev docker0 down
 brctl delbr docker0 

        然後建立一個網橋 bridge0:

sudo brctl addr bridge0
sudo ip addr add 192 168.5.1/24 dev bridge0
ip link set dev bridge0 up

        檢視確認網橋建立並啟動:

ip addr show bridge0

        配置 Docker服務,預設橋接到建立的網橋上:

echo 'DOCKER OPTS="-b=bridgeo"1>>/etc/default/docker

service docker start

        啟動 Docker服務。新建一個容器,可以看到它已經橋接到了 bridge0上。

        可以繼續用 brctl show命令檢視橋接的資訊。另外,在容器中可以使用 ip addr和 ip route命令來檢視IP地址配置和路由資訊。