Docker:暴露容器IP上的端口

Docker:暴露容器IP上的端口,docker,dockerfile,Docker,Dockerfile,我试图公开Docker容器上的端口,而不必将其映射到主机上的端口;这对于sql数据库或web系统(如redmine)非常适用,我可以从主机系统访问容器IP地址的端口3000上的redmine,而无需映射端口 我的Dockerfile看起来像这样(为了“清晰”而删除了卷、环境等) 这应该告诉gunicorn将(-b)绑定到端口8000或所有地址;因此,当我使用say运行它时,我希望容器上的端口8000是打开的 docker run myappthing 但是没有,即使是古尼康也在快乐地奔跑。但如

我试图公开Docker容器上的端口,而不必将其映射到主机上的端口;这对于sql数据库或web系统(如redmine)非常适用,我可以从主机系统访问容器IP地址的端口3000上的redmine,而无需映射端口

我的Dockerfile看起来像这样(为了“清晰”而删除了卷、环境等)

这应该告诉gunicorn将(-b)绑定到端口8000或所有地址;因此,当我使用say运行它时,我希望容器上的端口8000是打开的

docker run myappthing
但是没有,即使是古尼康也在快乐地奔跑。但如果我这样做了

docker run -p 127.0.0.1:8028:8000 myappthing
然后,不仅主机上的端口8028打开,容器上的端口8000也打开

这里发生了什么事;我错过了什么

谢谢

docker ps
以不同方式报告端口,如下所示:redmine和mysql显示它们未映射到主机上映射我的尝试的端口

CONTAINER ID        IMAGE               COMMAND                   CREATED             STATUS              PORTS                      NAMES
b68765d57f0b        52adec2834c2        "gunicorn -b 172.18.…"    45 minutes ago      Up 45 minutes       127.0.0.1:8028->8000/tcp   afc-timerec-manual
aaecd3cd319d        9671544d5284        "/docker-entrypoint.…"    7 months ago        Up 7 weeks          3000/tcp                   afc-redmine
fb4e55d352b2        1571059e8458        "docker-entrypoint.s…"    13 months ago       Up 4 days           3306/tcp                   afc-glpi-data
更多插图:如果我打开容器上的外壳,我可以执行以下操作:

lynx http://127.0.0.1:8000
lynx http://172.18.0.28:8000 
(其中172.18.0.28是容器IP地址),这两个命令都允许我访问webapp


同时,回到主机上—容器上的8000端口未打开,因此
lynxhttp://172.18.0.28:8000
失败

端口未使用
EXPOSE
指令发布,您需要使用
-p

EXPOSE指令实际上并不发布端口。信息技术 作为构建文档的人员之间的文档类型 图像和运行容器的人员,关于哪些端口 打算出版的。在运行时实际发布端口 在容器中,使用docker run上的-p标志来发布和映射一个或多个 更多端口,或使用-P标志发布所有公开的端口并映射它们 到高阶端口


端口未使用
EXPOSE
指令发布,您需要使用
-p

EXPOSE指令实际上并不发布端口。信息技术 作为构建文档的人员之间的文档类型 图像和运行容器的人员,关于哪些端口 打算出版的。在运行时实际发布端口 在容器中,使用docker run上的-p标志来发布和映射一个或多个 更多端口,或使用-P标志发布所有公开的端口并映射它们 到高阶端口


谢谢,我明白了-但是其他容器在运行期间如何在没有-p的情况下暴露它们的端口:例如,redmine打开了端口3000,但我在启动容器时没有指定-p。在
docker ps
(我将在上面添加一个示例…@Mack端口通过EXPOSE image指令公开。
-p
参数不是用于公开,而是用于发布。主要区别是:-公开表示端口可以由同一网络中的其他容器连接,-发布表示已公开的端口映射到主机。正如您在中看到的那样de>docker ps,第一行/容器已发布(和公开)端口,第二行和第三行显示公开端口。我能想到的唯一原因是,为什么公开端口也在主机上打开(如您所述)当docker网络和主机网络连接起来时,这可能不是一件好事。@Christian:我以为我已经通过将容器连接到其用户网络来解决了这个问题,但我把自己弄糊涂了。只有当我指定-p时,端口才对主机开放,不像redmine容器-所以我不再像你所说的那么好了运行
docker ps
,这不应该发生。也许可以检查docker信息?谢谢,我明白了-但是其他容器在运行期间如何在没有-p的情况下暴露其端口:例如,redmine打开了端口3000,但我在启动容器时没有指定-p。并且在
docker ps
中报告的情况有所不同(我将在上面添加一个示例…@Mack端口通过EXPOSE image指令公开。
-p
参数不是用于公开,而是用于发布。主要区别是:-公开表示端口可以由同一网络中的其他容器连接,-发布表示已公开的端口映射到主机。正如您在中看到的那样de>docker ps,第一行/容器已发布(和公开)端口,第二行和第三行显示公开端口。我能想到的唯一原因是,为什么公开端口也在主机上打开(如您所述)当docker网络和主机网络连接起来时,这可能不是一件好事。@Christian:我以为我已经通过将容器连接到其用户网络来解决了这个问题,但我把自己弄糊涂了。只有当我指定-p时,端口才对主机开放,不像redmine容器-所以我不再像你所说的那么好了从运行
docker ps
,这不应该发生。也许可以检查docker信息?
lynx http://127.0.0.1:8000
lynx http://172.18.0.28:8000