Featured image of post docker0为什么会变

docker0为什么会变

这个问题来源于我司一个获取机器指纹的程序,它误读了docker0网桥mac,导致机器重启后指纹总是变化,但是在测试环境又难以复现(因为测试环境没装docker),为什么docker engine创建的docker0网桥每次重启机器后都会变呢?同时观察可以发现如果不重启机器只是重启docker engine,docker0不会变,为什么呢?

解释:

当重启整台机器时,系统会把所有的内核网络接口(包括 docker0)都清空;而只是重启 dockerd 守护进程时,内核中的那些接口依然存在,因此行为就不一样了。具体来说:

  1. docker0 是一个内核级的 bridge 接口
    Docker 并不会把 docker0 写到系统的网络配置文件(如 /etc/network/interfaces/etc/sysconfig/network-scripts/ 等)里;它完全是在运行时由 dockerd 通过 libnetwork 动态创建的。

    • 机器重启:内核重启,所有 runtime 接口都被销毁,只有当 dockerd 再次启动时,才会“初次”创建一个新的 docker0

    • dockerd 重启:因为你只是把守护进程干掉又重启,并没有重启内核,docker0 依然挂在内核里。新启动的 dockerd 看到桥接口已经存在,就直接沿用它,也就不会重新分配新的 MAC。

  2. Docker 会给每个新建的 bridge 随机分配一个 MAC 为了减少与宿主机或其它虚拟网络冲突,Docker 在创建 bridge 时会生成一个看似随机的 MAC 地址。

    • 桥被删掉(机器重启后):重新创建,新 MAC 肯定和上一次不同。

    • 桥存在(仅重启 dockerd):没有走“创建”流程,MAC 保持不变。