我有3个docker应用程序(容器),其中一个容器正在与其他2个容器进行通信。如果我使用以下命令运行该容器,则容器3可以访问容器1和容器2。
docker run -d --network="host" --env-file container1.txt -p 8001:8080 img1:latest
docker run -d --network="host" --env-file container2.txt -p 8080:8080 img2:latest
docker run -d --network="host" --env-file container3.txt -p 8000:8080 img3:latest
但是,如果我删除了--network =“ host”选项,则这仅适用于主机网络,这样我将无法在外部(通过Web浏览器)访问此应用程序。为了在外部访问它,我需要使主机端口和容器端口与以下相同。
docker run -d --env-file container1.txt -p 8001:8001 img1:latest
docker run -d --env-file container2.txt -p 8080:8080 img2:latest
docker run -d --env-file container3.txt -p 8000:8000 img3:latest
使用上述命令,我可以在Web浏览器上访问我的应用程序,但是容器3无法与容器1通信。在这里,容器3可以访问容器2,因为我要暴露8080主机+容器端口。但是我无法再次暴露容器3的8080主机端口。
如何解决此问题? 最终,我的目标是应在不使用主机网络的情况下在浏览器上访问该应用程序,而应使用 bridge 网络。并且容器3需要与容器1和2通信。
答案 0 :(得分:0)
在这种情况下,当您使用--network = host时,您是在告诉docker不要隔离网络,而是使用主机的网络。因此,所有容器都在同一网络上,因此可以相互通信而没有任何问题。但是,当您删除--newtork = host时,docker将通过限制容器3与容器1通信来隔离网络。
您将需要某种编排服务,例如docker compose,docker swarm等。
答案 1 :(得分:0)
在用户定义的网络上,容器不仅可以通过IP地址进行通信,还可以将容器名称解析为IP地址。此功能称为自动服务发现。
阅读this了解有关Docker容器网络的更多详细信息。
您可以执行以下步骤来获得所需的结果。
创建专用桥接网络。
docker network create --driver bridge privet-net
现在启动应用程序容器以及添加到docker run命令中的--network private-net
。
docker run -d --env-file container1.txt -p 8001:8001 --network private-net img1:latest
docker run -d --env-file container2.txt -p 8080:8080 --network private-net img2:latest
docker run -d --env-file container3.txt -p 8000:8000 --network private-net img3:latest
通过这种方式,所有三个容器都将能够相互通信并可以与Internet通信。