1

我正在尝试拥有一个CentOS带有两个网络接口的容器。在浏览了 Docker 文档并“搜索”了一下之后,我发现了这个 GitHub 问题评论,它指定了如何实现这一点。

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

docker network create my-network

检查新网络,我可以看到 Docker 将其分配给了 subnetwork172.18.0.0/16和 gateway 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又名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 地址。

在图像级别执行此操作也很好。

4

1 回答 1

2

目标是拥有一个运行中的容器,其中包含两个 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

使用--privileged开关创建容器很重要,这样我们就可以关闭eth0接口。

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

docker network connect myNetwork myContainer

现在容器有两个接口:原始eth0bridge网络接口和新eth1myNetwork网络接口。

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

docker start myContainer

然后执行删除命令eth0

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

要关闭接口,我们必须在运行容器时执行此操作。原因是网络文件中的任何更改都只会保留在其运行的容器中,因此无法提交 down 接口(旧的,但仍然相关)。

于 2016-08-02T11:22:26.177 回答