1. 程式人生 > >為Docker容器設定固定IP實現網路聯通(1)——通過Pipework為Docker容器設定

為Docker容器設定固定IP實現網路聯通(1)——通過Pipework為Docker容器設定

目標

本部落格已經為大家推出了關於Docker的系列內容,相信各位已經對容器產生了濃厚的興趣,但是如果你深入進來可能會發現,容器與虛擬機器的差別還是比較大,特別是在網路方面,還需要很多完善,當然,隨著docker 1.11版本的推出,容器的網路技術越來越完善,接下來,我們就給各位介紹幾個我們平常經常會碰到的一些需求。

--------------------------------------------------------------------------------------

宗旨:專注於"GIS+"前沿技術的研究與交流,將雲端計算技術、大資料技術、容器技術、物聯網與GIS進行深度融合,探討"GIS+"技術和行業解決方案

轉載說明:文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任!

--------------------------------------------------------------------------------------


例如

宿主機A 和宿主機B是網路聯通關係,在宿主機A上面建立了多個容器組成叢集,但是我希望通過宿主機B也可以訪問到宿主機A的容器,當然,你也可能會說,埠對映非常方便,如果我需要的埠比較多,或者著如果我臨時需要增加某些埠,可能設定起來比較麻煩,那麼如果我們將宿主機A裡面的容器的IP與宿主機的IP在同一個網路,不就可以直接來進行互聯互通了麼。

步驟

其實這些需求在以前可能需要比較多繁雜的步驟,對於我們非網路出身的使用者來說比較麻煩,但是docker原廠工程師在github上推出了pipework工具,這個工具可以使用一條命令就可以實現更改容器的IP,更準確來說為容器IP新增一個新的網絡卡,這豈不是非常好的事情,感謝開源!

原理


環境:(圖上的右邊IP 應該是192.168.14.117,不改了

VMWare Workstation 12

Ubuntu14.04   

Docker1.10

容器虛擬機器有兩個網絡卡,eth0和eth1,eth1作為管理口 192.168.14.223,我的筆記本IP相當於與虛擬機器一個網路的另一個機器,IP為192.168.14.117,我的目標就是通過我的筆記本訪問到容器虛擬機器的容器例項。

1、在容器虛擬機器裡面建立兩個容器例項

這裡,我並不需要預設docker0網橋分配的172.17.0.1網段,所以我設定--net=none

[email protected]:~# docker run -d --name test1 --net=none ubuntu:14.04 /bin/bash
ef8a344fd5f99f1711b9e0f1b3c7303d91cb750747ad723d1e3838983b352304
[email protected]:~# docker run -d --name test2 --net=none ubuntu:14.04 /bin/bash
ef5179fe1058cb71aa710642c9b6cb3417213e194e5c8d76ba0def28077ce267

2、下載pipework

git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin/
chmod +x /usr/local/bin/pipework
3、接下來,通過pipework命令直接為容器設定固定IP
[email protected]:~# pipework br0 test1 192.168.14.243/[email protected]
[email protected]:~# pipework br0 test2 192.168.14.244/[email protected]
pipework包含了200多行的shell指令碼,通過network namespace,veth pair以及linux bridge完成容器網路的設定,執行過程大概包括:
  • 檢視主機是否包含br0(可以自定義)網橋,如果不存在就建立
  • 向容器例項test1新增一塊網絡卡(可以設定網絡卡名),並配置固定IP:192.168.14.243   
  • 若test1已經有預設的路由,則刪除掉,將@後面的192.168.14.254設定為預設路由的閘道器
  • 將test1容器例項連線到建立的br0上

4、我們進入test2容器,檢視IP是否已經設定

[email protected]:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4940085f9358        ubuntu:14.04        "/bin/bash"         48 seconds ago      Up 48 seconds                           test2
19da8f983a5c        ubuntu:14.04        "/bin/bash"         54 seconds ago      Up 54 seconds                           test1
[email protected]:~# docker exec -it 4940085f9358 /bin/bash
[email protected]:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
9: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 76:b0:22:b6:3b:b6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.14.244/24 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::74b0:22ff:feb6:3bb6/64 scope link
       valid_lft forever preferred_lft forever

然後再test2容器裡面,ping test1和閘道器測試

[email protected]:/# ping 192.168.14.243
PING 192.168.14.243 (192.168.14.243) 56(84) bytes of data.
64 bytes from 192.168.14.243: icmp_seq=1 ttl=64 time=0.087 ms
64 bytes from 192.168.14.243: icmp_seq=2 ttl=64 time=0.128 ms
^C
--- 192.168.14.243 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.087/0.107/0.128/0.022 ms
[email protected]:/# ping 192.168.14.254
PING 192.168.14.254 (192.168.14.254) 56(84) bytes of data.
From 192.168.14.244 icmp_seq=1 Destination Host Unreachable
From 192.168.14.244 icmp_seq=2 Destination Host Unreachable
From 192.168.14.244 icmp_seq=3 Destination Host Unreachable
From 192.168.14.244 icmp_seq=4 Destination Host Unreachable
From 192.168.14.244 icmp_seq=5 Destination Host Unreachable
From 192.168.14.244 icmp_seq=6 Destination Host Unreachable
^C
--- 192.168.14.254 ping statistics ---
9 packets transmitted, 0 received, +6 errors, 100% packet loss, time 7999ms
pipe 4

說明配置都沒有問題


5、我們再看上圖,目前c1和C2我們已經聯通,而且都在14網段,那麼現在宿主機還是ping不通容器例項,我們只需要將宿主機的eth0網絡卡新增到br0網橋即可

[email protected]:~# brctl addif br0 eth0
[email protected]:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000c29d35afe       no              eth0
                                                        veth1pl1844
                                                        veth1pl1866
docker0         8000.0242e420d7c6       no
然後再進行相關測試
[email protected]:~# ping 192.168.14.243
PING 192.168.14.243 (192.168.14.243) 56(84) bytes of data.
64 bytes from 192.168.14.243: icmp_seq=1 ttl=64 time=0.398 ms
64 bytes from 192.168.14.243: icmp_seq=2 ttl=64 time=0.831 ms
64 bytes from 192.168.14.243: icmp_seq=3 ttl=64 time=0.842 ms
64 bytes from 192.168.14.243: icmp_seq=4 ttl=64 time=0.844 ms
64 bytes from 192.168.14.243: icmp_seq=5 ttl=64 time=0.876 ms
^C
--- 192.168.14.243 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 0.398/0.758/0.876/0.181 ms
[email protected]:~# ping 192.168.14.244
PING 192.168.14.244 (192.168.14.244) 56(84) bytes of data.
64 bytes from 192.168.14.244: icmp_seq=1 ttl=64 time=0.262 ms
64 bytes from 192.168.14.244: icmp_seq=2 ttl=64 time=1.00 ms

我們看到宿主機也可以ping通固定IP的容器例項,那麼接下來在我的筆記本測試應該就很簡單了,因為我的筆記本都是windows10,所以在cmd直接測試
C:\Users\Administrator>ping 192.168.14.244

正在 Ping 192.168.14.244 具有 32 位元組的資料:
來自 192.168.14.244 的回覆: 位元組=32 時間<1ms TTL=64
來自 192.168.14.244 的回覆: 位元組=32 時間<1ms TTL=64
來自 192.168.14.244 的回覆: 位元組=32 時間<1ms TTL=64

192.168.14.244 的 Ping 統計資訊:
    資料包: 已傳送 = 3,已接收 = 3,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 0ms,最長 = 0ms,平均 = 0ms
Control-C
^C
C:\Users\Administrator>ping 192.168.14.243

正在 Ping 192.168.14.243 具有 32 位元組的資料:
來自 192.168.14.243 的回覆: 位元組=32 時間<1ms TTL=64
來自 192.168.14.243 的回覆: 位元組=32 時間<1ms TTL=64
來自 192.168.14.243 的回覆: 位元組=32 時間<1ms TTL=64
來自 192.168.14.243 的回覆: 位元組=32 時間<1ms TTL=64

192.168.14.243 的 Ping 統計資訊:
    資料包: 已傳送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 0ms,最長 = 0ms,平均 = 0ms

問題

pipework目前還有缺陷,就是容器重啟後IP設定會自動消失,需要重新設定,後面我們再介紹其他更加有效的方法。

當然,關於容器的網路還有更多事情要做,例如如何實現跨宿主機所在的容器例項網路連線等,後面我們一塊探討該問題。