在花了太长时间尝试访问从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中进行端口转发,那么正确的语法是什么?
答案 0 :(得分:6)
您对EXPOSE
中Dockerfile
和-p
中docker 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}}选项。