如何避免 dhcpcd 破坏 docker0 网络?

如何避免 dhcpcd 破坏 docker0 网络?

如何重现:

  1. 启动 dhcpcd,除非它已经在运行
  2. 重新启动 docker 守护进程
  3. 跑步docker run -it busybox ping -c 1 1.1.1.1

预期行为:该命令应该成功。

实际行为:该命令报告 100% 数据包丢失。

解决方法:

停止 dhcpcd 服务可以避免此问题,但这当然不是一个可行的选择。

dhcpcd 日志中的相关行:

docker0:删除接口

细节:

$ docker --version
Docker version 18.09.6-ce, build 481bc77156
$ dhcpcd --version
dhcpcd 7.2.1
Copyright (c) 2006-2019 Roy Marples
Compiled in features: INET ARP ARPing IPv4LL INET6 DHCPv6 AUTH
$ systemctl --version
systemd 242 (242.29-1-arch)
+PAM +AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid
$ uname --kernel-name --kernel-release --kernel-version --machine --processor --hardware-platform --operating-system
Linux 5.1.9-arch1-1-ARCH #1 SMP PREEMPT Tue Jun 11 16:18:09 UTC 2019 x86_64 unknown unknown GNU/Linux

tl;dr 解决方法:为每个接口启用 dhcpcd,而不是全局启用。

我没有很好的解释为什么会发生这种情况。希望其他人能够调查这是否是 dhcpcd 错误、docker 错误,或者以其他方式回答为什么在使用最新 dhcpcd 版本六周和最后一个 docker 版本十天后今天会开始出现问题(根据 /var/log /pacman.log)。我docker swarm init昨天和docker swarm leave --force*今天做了,但除此之外我想不出任何最近的相关变化。

解决方法是让 dhcpcd 仅显式管理那些需要 DHCP 的接口。首先全局禁用 dhcpcd:

sudo systemctl stop dhcpcd
sudo systemctl disable dhcpcd

然后,针对您实际用于连接 Internet 的每个接口(请参阅ip link参考资料 的列表):

sudo systemctl enable dhcpcd@INTERFACE
sudo systemctl start dhcpcd@INTERFACE

*--force因为虽然我在此期间没有做任何其他事情,但docker swarm它不会让我离开:

来自守护程序的错误响应:您正在尝试将集群留在作为管理器参与的节点上。删除最后一个管理器会删除集群的所有当前状态。用于--force忽略此消息。

按照我的方式在堆栈中工作,删除节点不起作用:

来自守护进程的错误响应:rpc 错误:code = FailedPrecondition desc = 节点 shbgqin74wuljj9skxt6y6ej7 是集群管理器,并且是 raft 集群的成员。移除前必须先降级为工人

并且降级也不起作用:

来自守护进程的错误响应:rpc 错误:code = FailedPrecondition desc = 尝试降级 swarm 的最后一个管理器

答案1

聚会迟到了,但有些人可能会觉得有用:

https://www.daemon-systems.org/man/dhcpcd.conf.5.html

拒绝接口

         When discovering interfaces, the interface name must not match
         pattern which is a space or comma separated list of patterns
         passed to fnmatch(3).

所以想必你可以做 veth* 并完成它

相关内容