Docker:在容器IP上公开端口

时间:2020-04-13 22:39:58

标签: docker dockerfile

我试图在Docker容器上公开端口,而不必将其映射到主机上的端口;这对于s​​ql数据库或web系统(例如redmine)来说很好用,我可以在不映射端口的情况下从主机系统访问容器IP地址的端口3000上的Redmine。

我的Dockerfile看起来像这样(为了清晰起见,删除了一些卷,envs等)

FROM python:2.7

RUN pip install gunicorn

EXPOSE 8000

CMD ["gunicorn", "-b", "0.0.0.0:8000", "myapp.wsgi" ]

这应该告诉gunicorn将(-b)绑定到端口8000或所有地址;所以当我说“运行”时,我希望在容器上打开端口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端口未打开,因此lynx http://172.18.0.28:8000失败

1 个答案:

答案 0 :(得分:0)

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

请参见https://docs.docker.com/engine/reference/builder/#expose

EXPOSE指令实际上并未发布端口。它 充当构建者之间的一种文档类型 图片和运行容器的人,关于哪些端口是 打算出版。在运行时实际发布端口 容器,使用docker run上的-p标志发布并映射一个或 更多端口,或使用-P标志发布所有公开的端口并映射它们 到高阶端口。