卡住暴露了Docker端口

时间:2019-06-20 21:46:22

标签: docker

我被困在Docker中的端口映射上。

我想将容器外部的端口8090映射到容器内部的端口80。

这是容器正在运行:

ea41c430105d        tag-xx   "/usr/local/openrest…"   4 minutes ago     Up 4 minutes          8090/tcp, 0.0.0.0:8090->80/tcp     web

注意,它说端口8090已映射到端口80。

现在在另一个容器中

curl web                                                                                                                                

我收到401的回复。这意味着容器会做出响应。到目前为止一切顺利。

但是当我做curl web:8090时,我得到了:

curl: (7) Failed to connect to web port 8090: Connection refused

为什么端口映射对我不起作用?

谢谢

P.S。我知道我的容器专门以401响应curl web,因为当我停下docker stop web并再次执行curl web时,我得到could not resolve host: web

3 个答案:

答案 0 :(得分:0)

您不能从另一个容器内部连接到已发布的端口,因为这些端口仅在主机上可用。就您而言:

从主持人:

  • release将连接到您的容器
  • debug无法连接到您的容器,因为该端口未发布

从同一网络中的另一个容器

  • curl localhost:8090将起作用
  • curl localhost:80无法正常工作,因为唯一公开并监听Web服务的端口是80。

答案 1 :(得分:0)

除非指定,否则

Docker容器将连接到默认桥网络。此默认网桥网络不支持容器之间的自动DNS解析。看起来您很可能在默认网桥网络上。但是,在默认网桥网络上,您可以使用容器IP地址进行连接,该容器IP地址可以使用以下命令找到

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container name>

因此,curl <IP Address of web container>:8090应该可以工作。

总是最好创建一个用户定义的桥接网络,并将容器连接到该网络。在用户定义的网桥网络上,连接的容器的端口彼此暴露,而不是暴露于外界。用户定义的网桥网络还支持自动DNS解析,您可以引用容器的名称而不是IP地址。您可以尝试使用以下命令来创建用户定义的网桥网络并将其连接到容器。

docker network create --driver bridge my-net
docker attach web
docker attach <other container name>

现在,从另一个容器中,您应该可以在“网络”容器上运行curl。

答案 2 :(得分:0)

您可以创建网络以在容器之间进行连接。 或者,您可以使用--link:

  

docker run --name container1 -p 80:???? -d图片(暴露在端口80上)

     

docker run --name container2 --links lcontainer1:container1

在container2内,您可以使用:

  

curl lcontainer1

希望有帮助