如何在Docker文件中发布端口

我需要将主机上的端口映射到容器上的端口。 我可以通过使用-p选项运行"docker run"命令来实现这一点。 我如何通过Dockerfile实现这Dockerfile ? 使用以下给出了"deprecated error"

 EXPOSE 80:8080 

如何才能通过dockerfile公开暴露的端口?

你不能。 在docker主机上发布的端口严格来说是由本地pipe理员决定的,而不是由他们试图运行的映像决定的。 这将是(一)一个安全问题(嘿,我刚打开ssh访问您的系统!)和(二)容易失败(我的Web服务器容器无法绑定端口80因为我已经运行服务器上端口80)。

如果你想避免漫长的docker run命令行,可以考虑使用像docker-compose这样的自动化过程。 然后你可以通过docker-compose这样的configuration:

 mywebserver: image: myname/mywebserver ports: - 80:8080 

然后一个简单的docker-compose up将启动您的容器与容器端口8080绑定到主机端口80。

更新2017-03-11

为了回应Willa的评论:

  • 使用docker-compose将无助于解决端口冲突问题。 端口冲突问题是图像不能指定主机端口绑定的原因。 我只是提供docker-compose作为长docker run命令行与多个端口绑定的替代。 端口冲突问题可能会允许容器对主机执行拒绝服务攻击:例如,如果容器启动并绑定到主机(或其他容器)上的Apache服务器之前的端口80,则你刚刚失去了你的networking服务。

  • 关于安全问题:如果一个映像能够指定主机端口绑定,容器可能在您不知情的情况下打开对容器的访问权限。 如果允许远程用户访问主机上的容器,则在内核中的命名空间function无法完全隔离容器的情况下,可能会导致主机受到攻击,即使完全信任隔离,也会打开如果该容器被用于非法目的,则可能涉及潜在的法律问题。 无论如何,这是一个坏主意。

揭露发布有区别。

公开的意思是打开容器端口,发布意味着在Docker主机上打开它到外面的世界。

例如,如果您的docker run命令具有-p 80:8080 ,则会显示容器上的端口8080和主机上的发布端口80。

你只能真正公开Dockerfile中的端口,如果你想要发布端口的灵活性,你需要使用-pselectdocker run。