Docker 无法连接到本地停靠的devpi容器,以便在另一个容器中安装pip,而没有--net=host";

Docker 无法连接到本地停靠的devpi容器,以便在另一个容器中安装pip,而没有--net=host";,docker,networking,docker-compose,devpi,Docker,Networking,Docker Compose,Devpi,我在docker容器中运行devpi,如下所示: [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

我在docker容器中运行devpi,如下所示:

[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。如果我尝试卷曲,连接会在一段时间后超时


如果使用本文中所述的--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地址上绑定您所需的任意多个端口,但如果您不使用它,您的计算机将充当容器的路由器,并应用一个允许访问internet以获取传出流量,但拒绝传入流量

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


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

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

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

这有助于正确访问devpi。

我的devpi docker容器以及其他docker容器都在同一台pc上运行