Docker容器的網路連線

思維的深度發表於2018-09-08

一.Docker容器的網路基礎

通過ifconfig檢視docker0的網路裝置,docker守護程式就是通過docker0為docker的容器提供網路連線的各種服務。

docker0是Linux虛擬網橋。

Linux虛擬網橋的特點:

  • 可以設定IP地址
  • 相當於擁有一個隱藏的虛擬網路卡

docker0的地址劃分:

  • IP:172.17.42.1 子網掩碼: 255.255.0.0
  • MAC: 02:42:ac:11:00:00 到 02:42:ac:11:ff:ff
  • 總共提供65534個地址

docker守護程式在一個容器啟動時,實際上它要建立網路連線的兩端。一端是在容器中的網路裝置,而另一端是在執行docker守護程式的主機上開啟一個名為veth*的一個介面,用來實現docker這個網橋與容器的網路通訊。

需要檢視網橋,需要linux的網橋管理程式,在Ubuntu中通過 apt-get install bridge-utils。

$ sudo brctl show
bridge name    bridge id              STP    enabled    interfaces
docker0        8000.0242ed943d02      no

執行一個docker容器,在容器中檢視它的網路裝置(如果沒有ifconfig命令,通過apt-get install -y net-tools)

 

root@b2a3136f5425:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02 
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:145 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0 
RX bytes:184985 (184.9 KB) TX bytes:4758 (4.7 KB)

lo Link encap:Local Loopback 
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0 
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

 

docker已經自動建立了eth0的網路卡,注意觀察ip地址和mac地址。不要退出容器,再執行如下檢視網橋的狀態

$ sudo brctl show
bridge name    bridge id           STP    enabled    interfaces
docker0    8000.0242ed943d02       no                veth95521e6

我們看到在interface中多了一個veth*的這樣一個介面。通過ifconfig命令同樣可以看到這個網路介面。

 

自定義docker0

  • 修改docker0預設分配的ip地址:
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

修改完後,重啟docker服務 sudo service docker restart. 新執行的容器地址就變成了新的ip地址了。

  • 新增虛擬網橋
sudo brctl addbr br0
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

更改docker守護程式的啟動配置:

vim /etc/default/docker 中新增 DOCKER_OPS的值 -b=br0.

重啟docker服務即可。

 

二.Docker容器的互聯

用於測試的Docker映象 Dockerfile:

 

FROM ubuntu:14.04
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE 80
CMD /bin/bash

 

1.允許所有容器互聯

在同一宿主機下,docker的容器是通過虛擬網橋來進行連線的。那麼在預設情況下,在同一宿主機中執行的容器都是可以互相連線的。

--icc=true 預設

容器的ip地址實際上是一個不可靠的連線,因為它會隨著容器的啟動而改變。

 

--link

docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]

CONTAINER_NAME: 需要連線的容器名字

ALIAS: 在容器中連線的代號

docker -run -it --link=container01:webtest nginx
ping webtest

檢視在容器中產生的哪些影響

$ env

檢視環境變數,可以看到大量以WEBTEST*開頭的環境變數,這些環境變數是在容器啟動時,由docker新增的。我們還可以檢視在/ect/host檔案,這裡新增了webtest的地址對映。當docker重啟啟動容器時 /ect/host所對應的ip地址發生了變化。也就是說,針對於指定了link選項的容器,在啟動時docker會自動修改ip地址和我們指定的別名之間的對映。環境變數也會做出相應的改變。

 

2.拒絕所有容器間互聯

Docker守護程式的啟動選項

--icc=false

修改vim /etc/default/docker,在末尾新增配置 DOCKER_OPTS="--icc=false"。

需要重啟docker的服務 sudo service docker restart.即使是link也ping不通。

 

3.允許特定容器間的連線

Docker守護程式的啟動選項

--icc=false --iptables=true

--link 在容器啟動時新增link

docker利用iptables中的機制,在icc=false時,阻斷所有的docker容器間的訪問,僅僅執行利用link選項配置的容器進行相互的訪問。

注: 如果出現ping不通的情況,可能為iptables的問題(DROP規則在docker之前了)。

sudo iptables -L -n    檢視iptables規則的情況
sudo iptables -F    清空iptables規則設定
sudo service docker restart 重新啟用docker的服務
sudo iptables -L -n 再來檢視iptables的設定,docker的規則鏈已經在第一位

重新啟動容器即可

 

三.Docker容器與外部網路的連線

  • ip_forward

    --ip-forward=true

sysctl net.ipv4.conf.all.forwarding

ip_forward本身是Linux系統中的一個變數,它的值決定了系統是否會轉發流量。在Docker守護程式的預設引數中也有ip_forward選項,預設值是true. 

  • iptables

iptables是與linux核心整合的包過濾防火牆系統,幾乎所有的linux發行版本都會包含iptables的功能。

每一個大的方塊中,就是iptables中的一個鏈(chain),每一個鏈實際上就是資料處理中的一個環節,而在每個環節中又包含了不同的操作。

 

  • 允許埠對映訪問
  • 限制IP訪問容器

實質都是通過iptables的規則來控制的。

 

原文地址:https://www.cnblogs.com/Hai--D/p/7017933.html

相關文章