这个问题来源于我司一个获取机器指纹的程序,它误读了docker0网桥mac,导致机器重启后指纹总是变化,但是在测试环境又难以复现(因为测试环境没装docker),为什么docker engine创建的docker0网桥每次重启机器后都会变呢?同时观察可以发现如果不重启机器只是重启docker engine,docker0不会变,为什么呢?
解释:
当重启整台机器时,系统会把所有的内核网络接口(包括 docker0
)都清空;而只是重启 dockerd
守护进程时,内核中的那些接口依然存在,因此行为就不一样了。具体来说:
-
docker0
是一个内核级的 bridge 接口
Docker 并不会把docker0
写到系统的网络配置文件(如/etc/network/interfaces
、/etc/sysconfig/network-scripts/
等)里;它完全是在运行时由dockerd
通过 libnetwork 动态创建的。-
机器重启:内核重启,所有 runtime 接口都被销毁,只有当
dockerd
再次启动时,才会“初次”创建一个新的docker0
。 -
dockerd 重启:因为你只是把守护进程干掉又重启,并没有重启内核,
docker0
依然挂在内核里。新启动的dockerd
看到桥接口已经存在,就直接沿用它,也就不会重新分配新的 MAC。
-
-
Docker 会给每个新建的 bridge 随机分配一个 MAC 为了减少与宿主机或其它虚拟网络冲突,Docker 在创建 bridge 时会生成一个看似随机的 MAC 地址。
-
桥被删掉(机器重启后):重新创建,新 MAC 肯定和上一次不同。
-
桥存在(仅重启 dockerd):没有走“创建”流程,MAC 保持不变。
-