以特定的顺序向Docker容器添加一个新的NIC
我正在尝试拥有两个networking接口的CentOS
容器。 在经过Docker文档和“googleing”之后,我发现了这个GitHub问题评论 ,指出了如何实现这一点。
之后,我创build了一个新的networking(默认types: bridge
)
docker network create my-network
检查新的networking,我可以看到Docker分配给子网172.18.0.0/16
和网关172.18.0.1/16
。
然后,在创build容器时,我专门附加了新的networking:
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)
当我将容器连接到默认的Dockernetworking( bridge0
aka 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)
我的新networking的接口被移到eth1
,同时默认networking的接口获得eth0
。
另外,在检查接口configuration文件( /etc/sysconfig/network-scripts/ifcfg-eth0
)时,可以看到指定的MAC地址与运行容器时手动设置的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
的configuration文件。eth1
文件(新添加的界面)缺失。
由于我涉及的工作要求,我需要第一个接口必须始终被禁用,并且MAC地址必须专门设置。
任何其他与networking有关的工作都必须通过新连接的NIC。
我的问题是:
如何将新的NIC连接到容器,以便eth0
具有所需的MAC地址。
在图像级别做这个也很好。
我们的目标是拥有一个运行两个网卡的容器: eth0
和eth1
。
eth0
将有一个特定的MAC地址(假设AA:AA:AA:AA:AA:AA
),将被禁用。 所有networking将通过eth1
完成。
我将假设Docker镜像具有执行
ifdown
和/或ifconfig
权限
eth0
已经存在于映像中,并与默认的Docker networ: bridge
(与Docker安装时创build)进行“对话”。
我们必须修改映像中eth0
的configuration文件( /etc/sysconfig/network-scripts/ifcg-eth0
)来修改其MAC地址:文件中名为HWADDR
的字段。
之后,我们必须将这些更改提交到新的图像。 我们称之为myImage 。
现在,我们必须为第二个界面创build一个新的networking:
docker network create myNetwork
默认情况下,它是一个
bridge
networking(在我的情况下,这是足够的)。
由于要求eth0
具有自定义MAC地址,因此我们必须创build容器而不指定networking。 将其连接到默认桥接networking。
docker create -ti --mac-address=AA:AA:AA:AA:AA:AA --privileged --hostname=myHostnane --name=myContainer myImage
使用–privileged开关创build容器非常重要,这样我们可以取下
eth0
接口。
现在,在启动容器之前,我们将它连接到新networking:
docker network connect myNetwork myContainer
现在容器有两个接口: bridge
networking的原始eth0
和myNetwork
networking的新eth1
。
在这一点上,我们可以启动容器:
docker start myContainer
然后执行命令来取下eth0
:
docker exec myContainer /bin/bash -c "sudo ifdown eth0"
要取下界面,我们必须在运行容器时执行此操作。 原因是networking文件中的任何更改只会保留在其运行的容器中 ,所以不可能提交down接口(旧的,但仍然相关)。