我从官方的postgres图像中创建了一个postgres容器。我正在尝试映射端口5432,以便我可以从我的localhost访问容器。
如果我通过Dockerfile
公开端口,则映射不会发生。这是我的Dockerfile
FROM postgres
EXPOSE 5432:5432
当我构建图像并运行它时,这是我运行docker ps
时得到的,它在PORTS
列中看到这个5432/tcp
当我从EXPOSE
中删除Dockerfile
并构建它
FROM postgres
然后构建映像并在命令行docker run -p 5432:5432 -d postgres
上传递端口,端口确实被映射。当我运行docker ps
时,我在0.0.0.0:5432->5432/tcp
专栏中看到了PORTS
。
我究竟做错了什么?如何以能够映射的方式公开Dockerfile
中的端口?
如果要使用EXPOSE命令发布Dockerfile中定义的端口,可以使用-P
标志:
docker run -P <container>
EXPOSE实际上并没有做任何事情。如Docker documentation中所述:
EXPOSE指令通知Docker容器在运行时侦听指定的网络端口。
EXPOSE指令实际上不会发布端口。它在构建映像的人和运行容器的人之间起到一种文档的作用,关于哪些端口要发布。要在运行容器时实际发布端口,请在docker run上使用-p标志发布和映射一个或多个端口,或使用-P标志发布所有公开的端口并将它们映射到高阶端口。