我正在学习 docker,我正在测试正在运行的容器。仅当我运行侦听端口 80 的容器时,它才能正常工作。
示例:
工作正常:
docker run -d --name fastapicontainer_4 -p **8090**:80 fastapitest
docker run -d --name fastapicontainer_4 -p **8050**:80 fastapitest
不能正常工作::
docker run -d --name fastapicontainer_4 -p **8050**:**8080** fastapitest
当我更改程序在容器中侦听的端口并放置一个与 80 不同的端口时,该页面不起作用。有人知道是否可以使用与 80 不同的端口?我该怎么做?我正在使用 fastapi。
谢谢, 吉列尔莫
答案 0 :(得分:2)
-p
参数的语法是 <host port>:<container port>
。您可以将主机端口设为任意值,Docker 会安排它重定向到容器端口,但是您不能将容器端口设置为任意值。容器中需要有一个服务监听那个端口。
因此,如果容器中的 Web 服务器在端口 80 上运行,则 <container port>
选项的 -p
部分必须始终为 80
,除非您更改 Web 服务器配置侦听不同的端口。
答案 1 :(得分:0)
你在做什么:
docker run -d --name fastapicontainer_4 -p 8050:8080 fastapitest
说明:这样做是将 Host
端口 8050 转发到 container
端口 8080。如果您的 fastapi 服务未侦听端口 8080,连接将失败。
主机 8050 -> 容器 8080
正确的做法:
docker run -d --name fastapicontainer_4 -p 8080:80 fastapitest
说明:这是将 host
端口 8080 转发到 container
端口 80
主机 8080 -> 容器 80
注意:当您共享一个端口时,Docker 不会验证连接,它只是打开门,这样您就可以使用该开放端口做任何您想做的事情,因此即使您的服务没有在该端口上侦听,docker 也不会'不在乎。
答案 2 :(得分:0)
您需要指定要用于运行 fastapi 的客户端口。 例如
uvicorn.run(app, host="0.0.0.0", port=8050)
现在,如果您在主机上运行映射 8050(或任何其他)端口,容器上为 8050,它应该可以工作:
docker run -d --name fastapicontainer_4 -p 8050:8080 fastapitest