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

Docker EXPOSE vs command line -p option (boot2docker)

在尝试从 boot2docker 实例中的 docker 容器访问我的节点服务器 运行ning 花了太长时间之后,我意识到问题归结为 expose 之间的差异和 docker 运行 -p.

在我的 Dockerfile 中我有 EXPOSE 3001,我无法通过我的主机访问它。

在 运行ning "docker run -p 3001:3001 myappinst myapp" 之后,我能够访问该端口。

到目前为止,我认为 "docker run -p 3001:3001" 与 docker 文件中的 EXPOSE 3001 基本相同。

但是我注意到,当 运行ning 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)

貌似后者在做某种端口转发,而前者只是开放端口?这样对吗?

如果我想访问一个非转发的暴露端口,我该怎么做呢?另外,如果我想在 docker 文件中进行端口转发,正确的语法是什么?

您关于 Dockerfile 中的 EXPOSEdocker run 中的 -p 选项的假设是正确的。正如您在 Docker on line documentation:

中所读到的

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

The EXPOSE instructions informs Docker that the container will listen on the specified network ports at runtime. Docker uses this information to interconnect containers using links (see the Docker User Guide) and to determine which ports to expose to the host when using the -P flag. Note: EXPOSE doesn't define which ports can be exposed to the host or make ports accessible from the host by default. To expose ports to the host, at runtime, use the -p flag or the -P flag.

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

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