我试图拥有一个带有两个网络接口的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地址。
在图像级别执行此操作也很好。
答案 0 :(得分:1)
目标是拥有一个包含两个NIC的正在运行的容器:eth0
和eth1
。
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
网络的原始bridge
和eth1
网络的新myNetwork
。
此时,我们可以启动容器:
docker start myContainer
然后执行订单以取消eth0
:
docker exec myContainer /bin/bash -c "sudo ifdown eth0"
要取消界面,我们必须在运行容器时执行此操作。原因是网络文件will only persist in its running container中的任何更改,因此无法提交向下接口(旧的,但仍然相关)。