按特定顺序将新NIC添加到Docker容器

时间:2016-07-27 13:05:23

标签: networking docker centos nic docker-networking

我试图拥有一个带有两个网络接口的CentOS容器。 在浏览Docker文档和" googleing"一点,我发现this GitHub issue comment指定了如何实现这一点。

在此之后,我创建了一个新网络(默认类型:bridge

docker network create my-network

检查新网络,我可以看到Docker将其分配给子网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)

当我将容器连接到默认的Docker网络(bridge0 a.k.a 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)时手动设置的MAC地址不同:

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 个答案:

答案 0 :(得分:1)

目标是拥有一个包含两个NIC的正在运行的容器:eth0eth1

eth0将具有特定的MAC地址(例如,AA:AA:AA:AA:AA:AA)并将被禁用。所有网络都将通过eth1完成。

  

我将假设Docker镜像的用户有权执行ifdown和/或ifconfig

eth0已经存在于图像中,并与默认的Docker网络“对话”: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
  

使用 - 特权开关创建容器非常重要,这样我们就可以取消eth0界面。

现在,在启动容器之前,我们将其连接到新网络:

docker network connect myNetwork myContainer

现在,容器有两个界面:eth0网络的原始bridgeeth1网络的新myNetwork

此时,我们可以启动容器:

docker start myContainer

然后执行订单以取消eth0

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

要取消界面,我们必须在运行容器时执行此操作。原因是网络文件will only persist in its running container中的任何更改,因此无法提交向下接口(旧的,但仍然相关)。