Docker仅监听80端口。

3
我是一名翻译助手,以下是您需要翻译的内容:

我正在学习Docker,并测试运行容器。只有在运行监听端口80的容器时才能正常工作。

例如:

正常运行:

docker run -d --name fastapicontainer_4 -p **8090**:80 fastapitest
docker run -d --name fastapicontainer_4 -p **8050**:80 fastapitest

不工作OK:
docker run -d --name fastapicontainer_4 -p **8050**:**8080** fastapitest

当我在容器中更改程序侦听的端口并放置一个不同于80的端口时,页面无法工作。有人知道是否可以使用不同于80的端口?如何做到呢?我正在使用fastapi。
谢谢, Guillermo

问题不是Docker的问题。如你在前两个示例中所看到的,端口映射正常工作。尝试在没有Docker的情况下运行FastAPI,看看是否能正确配置它以侦听80端口之外的另一个端口,然后再转移到容器中。 - undefined
3个回答

6
-p参数的语法为:<host port>:<container port>。您可以将主机端口设置为任何想要的值,Docker会将其重定向到容器端口,但是您不能将容器端口设置为任意值。容器中必须有一个正在监听该端口的服务。
因此,如果容器中有一个运行在80端口上的Web服务器,则-p选项的<container port>部分必须始终为80,除非您更改Web服务器配置以侦听不同的端口。

0
你在做什么:
docker run -d --name fastapicontainer_4 -p 8050:8080 fastapitest

说明:这样做的目的是将主机端口8050转发到容器端口8080。如果你的fastapi服务没有监听端口8080,连接将会失败。
主机8050 -> 容器8080
正确的实现方式:
docker run -d --name fastapicontainer_4 -p 8080:80 fastapitest

说明:这是将 host 端口 8080 转发到 container 端口 80。

主机 8080 -> 容器 80

注意:Docker 在共享端口时不会验证连接,它只是打开门让你可以对该开放端口做任何想做的事情,因此即使您的服务没有在该端口上监听,Docker 也不会关心。


0
您需要指定要用于运行FastAPI的自定义端口。 例如:
uvicorn.run(app, host="0.0.0.0", port=8050)

现在,如果您在主机上运行映射8050(或任何其他)端口,并在容器中使用8050,则应该可以正常工作:
docker run -d --name fastapicontainer_4 -p 8050:8080 fastapitest

<Host Port>:<Container Port> docker run -d --name fastapicontainer_4 -p 8080:8050 fastapitest - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接