我试图公开node.js
图片的端口,但它没有公开外部端口:
FROM node:4-onbuild
ADD . /opt/app
EXPOSE 8000:8000
CMD ["npm", "start"]
只有当我在运行图像时声明端口时才能正常工作
docker run -p=8000:8000 node
我有什么遗失的吗?
答案 0 :(得分:3)
EXPOSE
指令仅为元数据。如果你检查:
https://docs.docker.com/engine/reference/builder/#expose
您将看到您仍然需要手动公开端口。 EXPOSE
指令对于可能想知道容器期望公开的平台非常有用。例如,在OpenShift上,如果我部署了容器,则建议我公开端口8000。
如果您不想手动公开端口,请尝试以下操作:
docker run --net=host
这会将容器网络控制器绑定到主机网络。但请注意,这是一个安全问题,因为容器和主机之间没有隔离(对于TCPIP或UDP)。这意味着您的容器可以尝试收听主机上的任何端口!有些容器会像这样运行,例如consul客户端:
https://hub.docker.com/_/consul/
这是一个讨厌很多端口的聊天客户端。将它绑定到主机使得快速运行客户端变得更加容易,但除非绝对必要,否则我会避免使用该方法。不幸的是,您可能只需要习惯-p
标志!