在花了很长时间尝试访问从boot2docker实例中的docker容器运行的节点服务器后,我意识到问题归结为暴露和docker run -p之间的差异。
在我的Dockerfile中,我有EXPOSE 3001,但无法通过主机访问。
运行“docker run -p 3001:3001 myappinst myapp”后,我能够访问该端口。
直到现在,我还认为“docker run -p 3001:3001”与dockerfile中的EXPOSE 3001基本相同。
我注意到,但是,当运行docker ps时
对于“EXPOSE”,我得到以下信息:CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES16341e2b9968 housemation-crawler:latest "npm start" 2 minutes ago Up 2 minutes 3001/tcp housemation-crawler-inst
(注意:3001/tcp)
与下面的docker run -p 3001:3001
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES0b14f736033c housemation-crawler:latest "npm start" 8 seconds ago Up 2 seconds 0.0.0.0:3001->3001/tcp housemation-crawler-inst
(0.0.0.0:3001->3001/tcp)
看起来后者正在执行某种端口转发,而前者只是在开放端口?是这样吗?
如果我想访问未转发的裸露端口,该怎么办?另外,如果我想在dockerfile中进行端口转发,那么正确的语法是什么?
最佳答案
您对EXPOSE
中的Dockerfile
和-p
中的docker run
选项的假设是正确的。如你所见Docker on line documentation:
因此,如果您使用EXPOSE
标志运行容器,则Dockerfile中的-P
指令将指示Docker哪些端口必须映射到主机。但是映射的本地端口不是确定性的,而是由Docker在运行时选择的。除此之外,Docker将使用EXPOSE
中的端口将信息作为环境变量导出到链接容器中。
如果要设置映射的本地端口,则必须使用-p
中的docker run
选项。
关于networking - Docker EXPOSE与命令行-p选项(boot2docker),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28260762/