我试图理解为什么我无法从apt-get update
我的docker容器内部运行。debian:latest
ubuntu:latest
- 我能够
ping 8.8.8.8
从容器内的其他地址 - 我能够
ping google.com
从容器内访问其他域 apt-get update
如果我使用以下方式启动容器,则有效--network host
apt-get update
bridge
如果容器连接到默认网络或任何其他用户定义的网络(适配器设置为桥接),则不起作用- 主机是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
- 按照以下说明编辑 docker.servicehttps://stackoverflow.com/questions/35300497/docker-container-not-connecting-to-https-endpoints
- 添加“mtu”:到
/etc/docker/daemon.json
和systemctl restart docker
如果你没有,/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
而不是设置MTU
via /etc/docker/daemon.json
。这没有用,我不知道为什么
docker network create --opt com.docker.network.mtu=1450 CustomMTU