GCP 实例上的 Docker 网络问题

问题描述 投票:0回答:3

我正在尝试在 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 容器应该需要一些特定的配置才能访问互联网,以及为什么我在网络上搜索此问题时几乎没有看到提及这一点。

我做错了什么吗,有更好的方法吗?

docker network-programming google-cloud-platform docker-compose
3个回答
8
投票

我一直在 C3 实例上遇到这个问题,即使是在问题发布两年后。在容器构建期间以及尝试在 compose 中运行容器时,我都遇到了相同的症状。

有迹象表明该问题与 异常低的 MTU 设置(最大传输单元)有关。

Docker 默认使用 1500 作为 MTU,但在实例上默认为 1460。您可以在

/etc/docker/daemon.json
中编辑设置,添加:

{
  "mtu": 1460
}

这解决了容器构建过程中的连接问题,我不再需要添加

--network=host
,但它并没有解决容器在 compose 中运行时的连接问题。

对我来说,最简单的解决方案就是简单地移动到另一个实例类型。虽然我的经验并不详尽,并且在其他机器上也可能发生,但到目前为止,除了 C3 之外我尝试过的所有其他实例类型都没有这个问题。


2
投票

请参阅 Docker 的容器网络,该原理也适用于其他容器运行时。

使用

--net=host
network_mode: host
将容器绑定到主机的网络。

您可以更精确地使用

--publish=[HOST-PORT]:[CONTAINER-PORT]
ports
将容器端口公开为主机端口(并可能重新映射这些端口),而不是将容器或服务的所有端口广泛发布到主机网络(从而使它们成为公共主机)。也)。

默认不发布行为的一个(几个优点)是,您必须采取第二步将容器的端口发布到主机,在该主机上,服务可能被(通过其端口)访问的可能性增加不受欢迎的演员。


0
投票

我怀疑是IP转发问题造成的,您需要在创建实例时设置“启用IP转发”。 (实例创建后就无法更改此字段)

我已经尝试了以下故障排除,但是,它对我不起作用: https://docs.docker.com/engine/daemon/troubleshoot/#ip-forwarding-problems

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.