Docker(2)網絡配置


Libetwork

實現了5種網絡模式:

1.bridge Docker默認的容器網絡驅動,Container通過一對veth pair鏈接到docker0 網橋上,由docker為容器動態分配IP及配置路由,防火牆等

2.host 容器與主機共享同一Network Namespace。

3.null 容器內網絡配置為空,需要用戶手動為容器配置網絡接口及路由

4.remote Docker網絡插件的實現,Remote driver使得Libnetwork可以通過HTTP Resful API 對接第三方的網絡方案,類似於SocketPlane的SDN方案只要實現了約定的HTTP URL處理函數以及底層的網絡接口配置方法,就可以替代Docker原生的網絡實現

5.overlay Docker原生的跨主機多子網網絡方案

 

 

 

高級網絡配置

當 Docker 啟動時,會自勱在主機上創建一個 docker0 虛擬網橋,實際上是 Linux 的一個 bridge,可以理解為一個軟件交換機。它會在掛載到它的網口乀間迕行轉發。同時,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 服務吪勱的時候才能配置,而且不能馬上生效。
  -b BRIDGE or --bridge=BRIDGE --指定容器掛載的網橋
  --bip=CIDR --定制 docker0 的掩碼
  -H SOCKET... or --host=SOCKET... --Docker 服務端接收命令的通道
  --icc=true|false --是否支持容器乀間迕行通信
  --ip-forward=true|false --請看下文容器之間的通信
  --iptables=true|false --禁止 Docker 添加 iptables 規則
  --mtu=BYTES --容器網絡中的 MTU

 

下面2個命令選項既可以在吪勱服務時挃定,也可以 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|none|container:NAME_or_ID|host --配置容器的橋接模式
  -p SPEC or --publish=SPEC --映射容器端口到宿主主機
  -P or --publish-all=true|false --映射容器所有端口到宿主主機

容器訪問外部網絡

  容器要想訪問外部網絡,需要本地系統的轉發支持

  

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

如果再啟動Docker服務的時候設定 --ip-forward=true,Docker就會自動設置系統的ip_forward值為1

容器直接互相訪問

需要兩方面的支持。

容器的網絡拓撲是否已經虧聯。默認情況下,所有容器都會被連接到 docker0 網橋上。
本地系統的防火牆軟件 -- iptables 是否允許通過。
訪問所有端口
當啟動 Docker 服務時候,默認會添加一條轉發策略到 iptables 的 FORWARD 鏈上。策略為通過
( ACCEPT )還是禁止( DROP )取決於配置 --icc=true (缺省值)還是 --icc=false 。當然,如果手動設
定 --iptables=false 則不會添加 iptables 規則。
可見,默認情況下,不同容器之間是允許網絡互通的。如果為了安全考慮,可以在 /etc/default/docker 文
件中配置 DOCKER_OPTS=--icc=false 來禁止它。

外部訪問容器實現

容器允許外部訪問,可以在docker run 的時候指定-p 或參數-P來啟用

不管用那種方法,其實也是在本地iptables的nat表中添加相應的規則

[root@linux-node2 ~]# iptables -t nat -nL

....
....

Chain DOCKER (2 references)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:9200 to:172.17.0.2:9200 

這里的規則映射了 0.0.0.0,意味着將接受主機來自所有接口的流量。用戶可以通過 -p
IP:host_port:container_port 或 -p IP::port 來指定允許訪問容器的主機上的 IP、接口等,以制定更嚴
格的規則。

如果希望永久綁定到某個固定的IP地址,可以在Dokcer配置文件 /etc/default/docker中指定DOCKER_OPTS = '--ip=IP_ADDRESS',之后重啟服務生效

配置docker0網橋

docker服務默認會創建一個docker0網橋(其上有一個docker0內部接口),它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主機都放到一個物理網絡

docker默認指定了docker0接口的IP地址和子網掩碼,讓主機和容器之間可以通過網橋互相通信,它還給出了MTU(接口允許接收最大傳輸單元)通常是1500Bytes或宿主機網絡路由上支持額默認值,這些值都可以通過服務啟動的時候進行配置

 

--bip=CIDR -- IP 地址加掩碼格式,例如 192.168.1.5/24
--mtu=BYTES -- 覆蓋默認的 Docker mtu 配置

 

自定義網橋

除了默訃的 docker0 網橋,用戶也可以挃定網橋來連接各個容器。
在吪勱 Docker 服務的時候,使用 -b BRIDGE 戒 --bridge=BRIDGE 來挃定使用的網橋。
如果服務已經運行,那需要先停止服務,幵刪除舊的網橋。
$ sudo service docker stop
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
然后創建一個網橋 bridge0 。
$ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up
查看確訃網橋創建幵吪勱。
$ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever
配置 Docker 服務,默訃橋接到創建的網橋上。
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo service docker start
吪勱 Docker 服務。 新建一個容器,可以看到它已經橋接到了 bridge0 上。
可以繼續用 brctl show 命令查看橋接的信息。另外,在容器中可以使用 ip addr 和 ip route 命令來查看
IP 地址配置和路由信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM