如果连接到桥接网络,则无法从我的docker容器内部获取更新

如果连接到桥接网络,则无法从我的docker容器内部获取更新

我试图理解为什么我无法从apt-get update我的docker容器内部运行。debian:latestubuntu:latest

  • 我能够ping 8.8.8.8从容器内的其他地址
  • 我能够ping google.com从容器内访问其他域
  • apt-get update如果我使用以下方式启动容器,则有效--network host
  • apt-get updatebridge如果容器连接到默认网络或任何其他用户定义的网络(适配器设置为桥接),则不起作用
  • 主机是openstack管理的虚拟机
  • 在我的电脑上一切都按预期运行(不是 openstack,不是虚拟的)

apt-get update将超时:

root@66230c3e7572:/# apt update
Err:1 http://deb.debian.org/debian buster InRelease                           
  Connection failed [IP: 199.232.138.132 80]
Err:2 http://security.debian.org/debian-security buster/updates InRelease
  Connection failed [IP: 151.101.194.132 80]
Err:3 http://deb.debian.org/debian buster-updates InRelease              
  Connection failed [IP: 199.232.138.132 80]
Reading package lists... Done
Building dependency tree       
Reading state information... Done
All packages are up to date.
W: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease  Connection failed [IP: 199.232.138.132 80]
W: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease  Connection failed [IP: 151.101.194.132 80]
W: Failed to fetch http://deb.debian.org/debian/dists/buster-updates/InRelease  Connection failed [IP: 199.232.138.132 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

我想找出为什么apt-get udpate当我连接到虚拟机上的任何网络时它不起作用bridge。因此,任何有关如何调试此问题的提示都将不胜感激。

答案1

经过几个小时的努力,我终于解决了这个问题

docker 桥接网络的 MTU 必须与主机网络适配器的 MTU 匹配

在我的情况下,eth0(主机)的 MTU 设置为 1450,而 docker0 的 MTU 设置为 1500

您可以通过以下方式更改 MTU

如果你没有,/etc/docker/daemon.json请创建一个:

# /etc/docker/daemon.json
# adjust the MTU accordingly to the hosts network adapter

{
    "mtu":1450
}

不要忘记重新启动docker.service:systemctl restart docker.service

更多细节:

如果你想检查设置使用ip并比较 mtu 值

$ ip a

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> **mtu 1450** qdisc fq_codel state UP group default qlen 1000
    ...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> **mtu 1500** qdisc noqueue state DOWN group default 
    ...

请注意,docker0 始终处于 1500 状态,并且只有当容器连接到该网络时才会更改其值

$ ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc fq_codel state UP group default qlen 1000
    ...
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default 
    ...
17: vethe4b452f@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP group default 
    ...

定制网络

我还尝试创建一个具有定义的自定义网络,MTU而不是设置MTUvia /etc/docker/daemon.json这没有用,我不知道为什么

docker network create --opt com.docker.network.mtu=1450 CustomMTU

相关内容