Docker 容器共享网络命名空间,集成 Bird 实现 Anycast 高可用
正好一年前,我在 DN42 网络内用 Docker 建立了 Anycast 服务。当时我的方法是,自定义容器的镜像,在其中安装一个 Bird,然后加入 OSPF 协议的配置文件来广播 Anycast 路由。但是随着时间推移,这套方案出现了以下问题:安装 Bird 本身是个较花时间的过程。我的 Bird 不是用 apt-get 装的,因为我的 Dockerfile 需要支持多种 CPU 架构,而 Debian 有些架构的软件源里没有 Bird。而又因为我的构建服务器是 AMD64 架构,使用 qemu-user-static 支持其它架构的镜像运行,为其它架构制作镜像、编译程序时就涉及到大量的指令集翻译,效率非常低。构建一个镜像在不同架构下的版本可能需要 2 小时以上,而安装应用本身的 apt-get 流程只需要几分钟。自己定制镜像也比较花时间。因为容器中需要同时运行目标应用(例如之前的 PowerDNS)和 Bird,就不能直接把目标应用作为 ENTRYPOINT 了,而添加其它的管理程序(supervisord、s6-supervise、tini、自己写 Bash 脚本)...