2016-07-27 76 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中的任何更改,因此无法提交下行接口(旧的,但仍然相关)。