坚持暴露Docker的端口

t5zmwmid  于 11个月前  发布在  Docker
关注(0)|答案(4)|浏览(92)

我在Docker中遇到了端口Map问题。
我想将容器外部的端口8090Map到容器内部的端口80。
下面是运行的容器:

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

字符串
注意,它说端口8090Map到端口80。
现在在另一个容器里,

curl web


我得到一个401响应。这意味着容器响应了。到目前为止一切顺利。
当我做curl web:8090时,我得到:

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


为什么端口Map对我不起作用?
谢谢
P.S.我知道我的容器对curl web的响应是401,因为当我停止docker stop web并再次执行curl web时,我会得到could not resolve host: web

gupuwyp2

gupuwyp21#

您无法从另一个容器内部连接到已发布的端口,因为这些端口仅在主机上可用。在您的情况下:
从主机:

  • curl localhost:8090将连接到您的容器
  • curl localhost:80无法连接到您的容器,因为端口未发布

来自同一网络中的另一个容器

  • curl web可以用
  • curl web:8090无法工作,因为唯一暴露并侦听Web服务的端口是80。
dwbf0jvd

dwbf0jvd2#

除非指定,否则Docker容器连接到默认网桥网络。此默认网桥网络不支持容器之间的自动DNS解析。看起来您最有可能在默认网桥网络上。但是,在默认网桥网络上,您可以使用容器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>


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

xmakbtuz

xmakbtuz3#

您可以创建网络来连接容器之间。或者您可以使用--link:
docker run --name container1 -p 80:?-d image(expose on port 80)
docker run --name container2 --links lcontainer1:container1
在容器2内,您可以用途:
curl l容器1
希望它能帮助

xtfmy6hx

xtfmy6hx4#

看这个端口主要被docker-proxy使用

为了加深您的理解,请按照以下步骤获取更多知识。
首先,使用以下命令之一来检查端口是否已被使用。

sudo netstat -tulpn | grep LISTEN
sudo ss -tulpn | grep LISTEN

字符串
如果你遇到这样的事情:

tcp 0  0 0.0.0.0:8090  ...


如果端口已在使用中,则可以运行此命令来标识使用它的进程。

sudo ss -lptn 'sport = :8090'


检查结果以确定谁正在使用端口。

State    Recv-Q   Send-Q Local Address:Port Peer Address:Port Process
LISTEN   0  4096   0.0.0.0:8090  0.0.0.0:*  users:(("docker-proxy",pid=1175,fd=4))

相关问题