Docker EXPOSE vs命令行-p选项(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)

vs 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中进行端口转发,那么正确的语法是什么?

你对EXPOSE中的DockerfileEXPOSE中的-p选项的假设是正确的。 正如你可以在Docker在线文档中阅读:

EXPOSE <port> [<port>...]

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

所以, EXPOSE中的EXPOSE指令将指示Docker如果使用-P标志运行容器,哪些端口必须映射到主机; 但映射的本地端口是不确定的,并在运行时由Dockerselect。 除此之外,Docker将使用EXPOSE的端口将信息导出为链接容器中的环境variables。

如果你想设置映射的本地端口,你必须在docker run使用-p选项。