Docker EXPOSE vs命令行-p选项(boot2docker)

时间:2015-02-01 08:12:26

标签: networking docker boot2docker

在花了太长时间尝试访问从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 NAMES 16341e2b9968 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 NAMES 0b14f736033c 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中进行端口转发,那么正确的语法是什么?

1 个答案:

答案 0 :(得分:6)

您对EXPOSEDockerfile-pdocker run选项中的EXPOSE <port> [<port>...]如何做出的假设是正确的。正如您在Docker on line documentation中所读到的那样:

  

EXPOSE

     

EXPOSE指令通知Docker容器将侦听   在运行时指定的网络端口上。 Docker使用它   使用链接互连容器的信息(请参阅Docker   用户指南)并确定在何时向主机公开的端口   使用-P标志。注意:EXPOSE不定义哪些端口可以   默认情况下,暴露给主机或使端口可从主机访问。   要在运行时向主机公开端口,请使用-p标志或-P   标志。

因此,如果运行带有-P标志的容器,Dockerfile中的EXPOSE指令将指示Docker哪些端口必须映射到主机;但是映射的本地端口不是确定性的,并且在运行时由Docker选择。除此之外,Docker将使用-p中的端口将信息导出为链接容器中的环境变量。

如果要设置映射的本地端口,则必须使用docker run中的{{1}}选项。