我被困在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
。
答案 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
希望有帮助