我正在尝试在 GCP 实例(Ubuntu 20.04)上构建并运行一个简单的 Docker 容器(使用 docker-compose 来执行此操作),并且该容器似乎无法访问互联网,除非我使用运行它
docker run --net=host [...]
或在我的
docker-compose.yml
中使用类似:
service:
build:
...
network: host
network_mode: host
...
我想知道为什么会这样,使用 Ubuntu 20.04 的标准 GCP 实例上的简单 docker 容器应该需要一些特定的配置才能访问互联网,以及为什么我在网络上搜索此问题时几乎没有看到提及这一点。
我做错了什么吗,有更好的方法吗?
我一直在 C3 实例上遇到这个问题,即使是在问题发布两年后。在容器构建期间以及尝试在 compose 中运行容器时,我都遇到了相同的症状。
有迹象表明该问题与 异常低的 MTU 设置(最大传输单元)有关。
Docker 默认使用 1500 作为 MTU,但在实例上默认为 1460。您可以在
/etc/docker/daemon.json
中编辑设置,添加:
{
"mtu": 1460
}
这解决了容器构建过程中的连接问题,我不再需要添加
--network=host
,但它并没有解决容器在 compose 中运行时的连接问题。
对我来说,最简单的解决方案就是简单地移动到另一个实例类型。虽然我的经验并不详尽,并且在其他机器上也可能发生,但到目前为止,除了 C3 之外我尝试过的所有其他实例类型都没有这个问题。
请参阅 Docker 的容器网络,该原理也适用于其他容器运行时。
使用
--net=host
或 network_mode: host
将容器绑定到主机的网络。
您可以更精确地使用
--publish=[HOST-PORT]:[CONTAINER-PORT]
或 ports
将容器端口公开为主机端口(并可能重新映射这些端口),而不是将容器或服务的所有端口广泛发布到主机网络(从而使它们成为公共主机)。也)。
默认不发布行为的一个(几个优点)是,您必须采取第二步将容器的端口发布到主机,在该主机上,服务可能被(通过其端口)访问的可能性增加不受欢迎的演员。
我怀疑是IP转发问题造成的,您需要在创建实例时设置“启用IP转发”。 (实例创建后就无法更改此字段)
我已经尝试了以下故障排除,但是,它对我不起作用: https://docs.docker.com/engine/daemon/troubleshoot/#ip-forwarding-problems