2016-07-27 47 views
0

我試圖讓一個帶有兩個網絡接口的CentOS容器。 在閱讀Docker文檔和「googleing」之後,我發現this GitHub issue comment指定了如何實現這一點。以特定順序向Docker容器中添加新NIC

跟隨它,我創建了一個新的網絡(默認類型:bridge

docker network create my-network 

檢查新的網絡,我可以看到,碼頭工人分配給它的子網172.18.0.0/16和網關172.18.0.1/16

然後,創建容器的時候,我特別重視新網絡:

docker create -ti --privileged --net=my-network --mac-address 08:00:AA:AA:AA:FF <imageName> 

容器內,我可以ifconfig檢查的確接口存在與IP和MAC地址:

eth0  Link encap:Ethernet HWaddr 08:00:AA:AA:AA:FF 
      inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 
      inet6 addr: fe80::a00:aaff:feaa:aaff/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:3 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:258 (258.0 b) TX bytes:258 (258.0 b) 

lo  Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0 
      inet6 addr: ::1/128 Scope:Host 
      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) 

,當我的容器連接到默認多克爾網絡(bridge0又名bridge)的問題來了:

docker network connect bridge <my-container> 

現在檢查在容器中的接口:

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 
      inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:17 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:2941 (2.8 KiB) TX bytes:508 (508.0 b) 

eth1  Link encap:Ethernet HWaddr 08:00:AA:AA:AA:FF 
      inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 
      inet6 addr: fe80::a00:aaff:feaa:aaff/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 
      RX packets:17 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:0 
      RX bytes:2941 (2.8 KiB) TX bytes:508 (508.0 b) 

接口爲我的新的網絡獲取移動到eth1,同時默認網絡接口獲取eth0

此外,檢查在接口(/etc/sysconfig/network-scripts/ifcfg-eth0)配置文件時,我可以看到,MAC地址指定有從所述一個運行容器(08:00:AA:AA:AA:FF)時手動設置的不同:

DEVICE="eth0" 
BOOTPROTO="dhcp" 
HWADDR="52:54:00:85:11:33" 
IPV6INIT="yes" 
IPV6_AUTOCONF="yes" 
MTU="1500" 
NM_CONTROLLED="yes" 
ONBOOT="yes" 
TYPE="Ethernet" 
UUID="25016937-1ff9-40d7-b4c3-18e08af0f98d" 

/etc/sysconfig/network-scripts中只有eth0的配置文件。 eth1(新添加的界面)文件丟失。

由於我涉及的工作要求,我需要第一個接口必須始終禁用,並且必須專門設置其MAC地址。

任何其他與網絡相關的工作都必須通過新連接的NIC。

我的問題是:

我怎麼能把一個新的NIC的容器,這樣eth0具有所需的MAC地址。

在圖像級別做這件事情也很好。

回答

1

目標是讓一個運行容器有兩個NIC:eth0eth1

eth0將有一個特定的MAC地址(假設,AA:AA:AA:AA:AA:AA),並將被禁用。所有網絡將通過eth1完成。

我將假定泊塢窗圖像具有權限的用戶來執行ifdown和/或ifconfig

eth0已經存在於圖像中的「會談」,默認多克爾BP網絡在:bridge( Docker安裝時創建)。

我們必須修改映像中eth0的配置文件(/etc/sysconfig/network-scripts/ifcg-eth0)以修改其MAC地址:文件中名爲HWADDR的字段。

在此之後,我們必須承諾更改爲新的圖像。我們稱之爲myImage

現在,我們必須在第二界面創建新的網絡:

docker network create myNetwork 

默認情況下,它是一個bridge網絡(這是在我的情況就足夠了)。

由於要求有eth0自定義MAC地址,我們必須創建容器,而不指定網絡;它將把它連接到默認橋接網絡。

docker create -ti --mac-address=AA:AA:AA:AA:AA:AA --privileged --hostname=myHostnane --name=myContainer myImage 

創建具有--privileged開關,所以我們可以取下來的eth0接口的容器是很重要的。

現在,在啓動容器之前,我們把它連接到新的網絡:

docker network connect myNetwork myContainer 

現在容器有兩個接口:原eth0bridge網絡和myNetwork網絡新eth1

在這一點上,我們就可以啓動容器:

docker start myContainer 

,然後執行命令取下來eth0

docker exec myContainer /bin/bash -c "sudo ifdown eth0" 

取下來的界面,我們必須這樣做當運行一個容器。原因是網絡文件will only persist in its running container中的任何更改,因此無法提交下行接口(舊的,但仍然相關)。