无法连接到本地 dockerized devpi 容器,以便在没有“--net=host”的情况下在另一个容器中安装 pip

unable to connect to local dockerized devpi container for pip install in another container without "--net=host"

我是 运行 devpi 在 docker 容器中,像这样:

[Unit]
Description=devpi docker-container
Requires=docker.service
After=docker.service

[Service]
Restart=always
RestartSec=3
ExecStart=/usr/bin/docker run --rm -p 3141:3141 --name devpi -v /devpi_data:/data -e DEVPI_PASSWORD='********' akailash/docker-devpi
ExecStop=/usr/bin/docker stop -t 2 devpi

[Install]
WantedBy=multi-user.target

运行良好。我可以通过主机上的 URL 访问它,并按预期从中安装软件包。

6f663ba131a1        akailash/docker-devpi   "/docker-entrypoint.…"   3 hours ago         Up 3 hours          0.0.0.0:3141->3141/tcp   devpi

但是,如果我想从这个容器构建另一个 docker 图像安装包,则有一个 ConnectTimeout。如果我尝试 curl 一段时间后连接超时。

如果我按照 issue 中所述使用 --net=host 选项,我可以进行 pip 安装。但是,我不想使用主机网络。我试过 0.0.0.0:3141 和 172.17.0.1:3141,结果相同。在 docker 守护程序服务中添加 --ip=0.0.0.0 对我不起作用。如何从另一个容器访问 devpi 容器而不必每次都使用 --net=host?

如果您不想使用 --net=host,那么您需要在 运行 devpi 机器上打开端口以允许外部客户端连接和使用它。

重点是,当您将主机网络设置为 docker 时,它会使用自己的 IP 地址,然后它可以在该 IP 地址上绑定您需要的任意多个端口,但如果您不使用它您的计算机充当容器的路由器并应用 NAT 以允许传出流量访问互联网但拒绝传入流量。

因此,如果您不想使用主机网络,则必须修改防火墙以添加目标 NAT 规则并允许流量到达服务。

关于如何在 iptables 上允许端口有一些很好的例子here

因为我只需要访问 devpi 来构建我的 docker-compose 文件中所需的 docker 图像,所以我在构建上下文中使用了主机网络:

build:
  network: host
  context: .
  dockerfile: Dockerfile.local

这有助于正确访问 devpi。