Docker小記-網絡

Docker的網絡

  • Docker使用操作系統的底層特性構建了一個特殊的、可定製的虛擬網絡拓撲結構。這個虛擬網絡只在安裝有Docker的機器上有效,並並且它由主機上的容器和主機所連接的網絡之間的路由構成。
  • 本地虛擬網絡用來提供容器的隔離,Docker使用內核命名空間來創建私有的虛擬接口,但是命名空間本身並不提供網絡的隔離。網絡暴露或者隔離是通過主機的防火牆規則

四種網絡容器原型

Closed容器

  • docker run 命令後添加–net none 作爲參數來創建一個Closed 容器
  • Closed容器中的進程只能夠訪問本地迴環接口
  • 如果對網絡隔離程度要求非常高,或者程序不需要網絡訪問權限時,Closed 容器是最好的選擇

Bridged容器

  • Bridged容器纔是Docker的默認選項,這種原型可定製性最高,並且被認爲是最佳實踐
  • Bridged容器擁有兩個接口,一個是私有的本地迴環接口,另外一個私有接口通過網橋連接到主機的其他容器

Joined容器

  • Joined容器。這些容器共享一個網絡棧,在這種情況下,容器之間沒有任何的隔離
  • 它們各自維持有不同的文件系統、不同的內存等,但是它們共享了同一個網絡組件
  • 這種類型的原型通過將某一個容器接口的訪問權提供給另外一個新的容器來構建,在這種情況下,接口就類似於共享的數據卷
  • –net選項中容器的值決定了新容器要和哪一個容器進行連接(以下兩個命令將會創建兩個共享相同網絡接口的容器。因爲第一個命令創建了一個Closed容器,因此第二個容器只共享那個本地迴環接口)
  • 使用場景
    • 當你想要不同容器上的程序通過本地迴環接口進行通信時
    • 當想要監控另外一個容器中某個程序的網絡流量時
    • 當一個容器中的程序將要改變Joined網絡棧,而另外一個程序將要使用那個被改變的網絡棧時

Open容器

  • 創建:docker run --net host
  • Open容器沒有網絡容器,並且對主機網絡有完全的訪問權,包括對重要主機服務的訪問權。
  • Open容器沒有提供任何隔離,當你沒有其他選擇時它才應該被考慮

自定義命名解析

  • docker run命令有一個–hostname選項,你可以使用這個選項來設置一個新容器的主機名。這個選項會在該容器中的DNS覆蓋系統中添加一條記錄。這條記錄會將提供的主機名映射成該容器的橋接IP地址。
  • -add-host=[]選項能自定義從主機名到IP地址的映射關係,可以設置多個
    • 可以使用這個功能將特定的主機名映射到一個已知的IP地址上,比如說127.0.0.1,以此來有效地阻止特定的主機名。
    • 能爲單獨的容器提供特定的主機名映射,可能是最細粒度的自定義了。
docker run --rm \
--add-host test:10.10.10.255 \ 
alpine:latest \
nslookup test // 解析到10.10.10.255
  • -dns=[]選項可以被使用多次來設置多個DNS服務器,自定義DNS配置的選項能夠用來指定一個或者多個DNS服務器。
docker run --rm \
--dns 8.8.8.8 \  //設置主DNS服務器
alpine:lastest \
nslookup docker.com // 解析docker.com的ip地址
  • DNS相關的選項——–dns-search=[],允許你指定一個DNS查找域,這個查找域就像host名的一個默認後綴。當該選項被設置,在查詢時,任何不包括已知頂級域名(比如.com或者.net)的主機名會自動加上該後綴名
docker run --rm \
--dns-search docker.com \ // 設置查找域
busybox:latest \
nslookup registry.hub // registry.hub.docker.com解析
  • 所有的自定義轉換關係都保存在容器中的/etc/hosts 文件中。如果你想要看看有哪些覆蓋內容,你所要做的就是查找這個文件
  • 只有創建容器時,這些選項纔會生效。如果一個容器正在運行,你改變了默認值,那麼這個容器會保留舊的值。

開放對容器的訪問

  • docker run命令提供了一個-p --publish=[]選項,它能夠在主機網絡棧上的端口和容器端口之間創建映射關係。
docker run -p 3333:3333
  • docker port命令來查看端口是如何被映射的。port子命令接受一個容器名字或者ID作爲參數,並且會輸出一個列表,每一行對應一個端口映射
  • –expose選項,它能設置容器想要開發的端口。這個選項能夠被設置多次,一個端口設置一次:
    • 以上命令中的–expose 選項會將端口添加到-P 選項的端口列表中。
  • 禁止跨容器通信: docker -d -icc=false
    • 當跨容器通信被禁止了,除非被顯式允許的流量,否則任何從容器到容器的網絡流量都會被主機上的防火牆阻止。
    • 當跨容器通信(ICC)被允許時,–expose選項爲容器端口到主機端口的映射提供了捷徑。
    • 當跨容容器通信(ICC)被禁止時,–expose選項成了定義防火牆規則和在網絡上顯式聲明容器接口的一個工具

鏈接

docker run -d --name mydb \
alpine:latest 

docker run -it --rm \
--link mydb:database \
dockerDemo/ch5
  • 創建鏈接時,目標容器必須正在運行。原因非常簡單,只有容器正在運行,它們才能維持其IP地址
  • 如果某個依賴由於某些原因停止了,則這條鏈接也會被破壞。(一旦容器被停止或者重啓了,那麼它將失去IP地址租約並且任何鏈接到該容器的容器保留的都是過期的鏈接信息了)
  • 鏈接通過檢測目的容器的網絡信息(IP地址和開放端口),然後將這些信息注入新容器中。
  • 如果跨容器通信被禁止了,Docker會添加特定的防火牆規則來允許被鏈接的容器間的通信。
  • 鏈接的本質就是靜態的、具有方向性和無傳遞性的依賴
  • 創建一條鏈接會在新容器中添加鏈接信息,一方面存儲在環境變量中,另一方面通過在DNS覆蓋系統中添加主機名的映射來將鏈接信息注入新容器中
  • 有多個環境變量由於鏈接的創建而創建,所有跟某一具體鏈接相關的變量都會使用該鏈接別名作爲前綴
  • 對於每個被鏈接的容器開放的端口,都會有四個單獨的環境變量,並且環境變量的名字包含了對應的開放端口。模式如下:
    • PORT_
    • PORT__PROTO
    • PORT__ADDR
    • PORT__PORT
  • 如果能夠接受主機上動態或者短暫的端口,那麼你可以使用-P --publish-all 選項。這個選項會告訴Docker daemon去創建端口映射關係,將容器的端口都暴露出去。(能夠用來通信的端口就是那些已經被目標容器公開的端口)

修改網橋接口的配置

  • –bip選項(bip是bridge IP的縮寫,表示網橋IP),可以設置Docker創建的網橋接口的 IP 地址,也可以使用無類域內路由(CIDR)地址來設置子網的大小。
    • 假設想要將你的網橋IP地址設置爲192.168.0.128,並且只想分配這個子網最後的128個地址。需要將–bip選項的值設置爲192.168.0.128/25。
  • 自定義該網絡中的容器的IP地址的範圍
docker -d -fixed-cidr “192.168.0.192/26”
  • 更改Docker網橋的最大傳輸單元(MTU)(根據協議,以太網接口擁有1500字節的最大數據包大小,這是默認的配置)
docker -d -mtu 1200
  • 可以使用自定義的網橋接口來替代docker0,使用的選項是-b或–bridge

相關鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章