Docker如何为容器分配MAC地址?

50

当我启动新的容器时,Docker会自动为它们分配一些MAC地址。我想知道这种分配是否有一定的规律。这个MAC地址可以更改吗?

$ docker network inspect bridge

"Containers": {
            "3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": {
                "EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bdccee38750bc1",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c": {
                "EndpointID": "b047d090f446ac49747d3c37d63e4307be745876db7f0ceef7b311cbba615f48",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
3个回答

89

Docker会始终为第一个容器分配相同的MAC地址02:42:ac:11:00:02,然后为每个不同的容器逐个递增。

不确定他们为什么要使用这个MAC地址。 它似乎与oui数据库中的任何实际供应商都不匹配。官方文档有说明:

MAC地址是使用分配给容器的IP地址生成的,以避免ARP冲突,范围从02:42:ac:11:00:00到02:42:ac:11:ff:ff。

无论如何,在创建容器时可以使用--mac-address参数设置任何MAC地址。 例如,执行类似于此类命令:docker run -ti --mac-address 00:00:00:00:00:11 ubuntu:trusty

希望这有所帮助。


非常感谢!这正是我所寻找的。 - monica
2
似乎02:42:ac在oui数据库中没有匹配的真实供应商。 MAC地址的第一个八位字节中的位0x02表示它是“本地管理”,因此它永远不会在供应商OUI中设置。这保证了docker分配的MAC地址不会与物理网络接口的MAC地址冲突。我只能猜测第二个八位字节中的00x42是用来干什么的(生命、宇宙和一切?)。正如@Norbert在他的答案中指出的那样,第三个八位字节(0xac)取自IP地址的第一个八位字节-172。 - Michael Burr

2

如果您查看容器接口的MAC地址,您会发现最后4个八位字节是IPv4地址的十六进制表示。这一部分以02:42:为前缀。

例如:

具有IPv4地址172.19.0.6的容器接口的Docker生成的MAC地址将是02:42:ac:13:00:06


谢谢您指出这一点 - 我一直在努力弄清楚“MAC地址是使用分配给容器的IP地址生成的”这句话的确切含义。 - Michael Burr

0
Docker的MAC地址都以“02:42”开头。剩下的四个八位字节表示容器的IP地址的十六进制表示。十六进制中的“0xAC”对应十进制中的“172”,“0x11”对应“17”,“0x00”对应“0”,而“0x02”对应“2”。因此,这个MAC地址表示的是一个IP地址为“172.17.0.2”的容器。默认的Docker“bridge”网络总是默认分配IP范围为“172.17.0.0/16”,因此这将是在新安装的Docker上运行的第一个容器所分配的虚拟以太网适配器的MAC地址。
有关更多信息,请参阅https://maclookup.app/faq/how-do-i-identify-the-mac-address-of-a-docker-container-interface

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接