我试图在Docker容器上公开端口,而不必将其映射到主机上的端口;这对于sql数据库或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
失败
答案 0 :(得分:0)
该端口未使用EXPOSE
指令发布,您需要使用-p
。
请参见https://docs.docker.com/engine/reference/builder/#expose
EXPOSE指令实际上并未发布端口。它 充当构建者之间的一种文档类型 图片和运行容器的人,关于哪些端口是 打算出版。在运行时实际发布端口 容器,使用docker run上的-p标志发布并映射一个或 更多端口,或使用-P标志发布所有公开的端口并映射它们 到高阶端口。