在花了很长时间尝试访问从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:3001CONTAINER 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/

10-11 08:26