如何在docker文件中发布端口

use*_*mda 25 port public docker

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

EXPOSE 80:8080
Run Code Online (Sandbox Code Playgroud)

我怎样才能通过dockerfile公开暴露的端口?

lar*_*sks 30

你不能.在docker主机上发布的端口严格来说是由本地管理员做出的决定,而不是他们试图运行的图像; 这将是(a)一个安全问题(嘿,我只是打开了对你系统的ssh访问!)和(b)容易出现故障(我的网络服务器容器无法在端口80上绑定,因为我已经在运行服务器港口80).

如果要避免使用长docker run命令行,请考虑使用docker-compose之类的东西来自动执行该过程.然后,您可以通过docker-compose配置:

mywebserver:
  image: myname/mywebserver
  ports:
    - 80:8080
Run Code Online (Sandbox Code Playgroud)

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

更新2017-03-11

回应Willa的评论:

  • 使用docker-compose无助于端口冲突问题.端口冲突问题是图像不能指定主机端口绑定的原因.我只是提供多个端口绑定的docker-composedocker run命令行的替代品.端口冲突问题可能允许容器对您的主机执行拒绝服务攻击:例如,如果容器在主机(或另一个容器)中的Apache服务器之前启动并绑定到端口80,则你刚丢失了你的网络服务.

  • 关于安全问题:如果映像能够指定主机端口绑定,则容器可能会在您不知情的情况下打开对容器的访问.允许远程用户访问主机上的容器会让您在主机中的命名空间功能无法完全隔离容器的情况下遭受主机危害,即使您完全信任隔离,它也会打开您如果该容器用于非法目的,则可能存在法律问题.在任何一种情况下,这都是一个坏主意.

  • 使用 docker-compose 如何解决端口冲突的可能性?另外你能解释一下安全问题吗? (2认同)

小智 17

公开发布之间存在差异.

Expose意味着打开容器端的端口,发布意味着在Docker主机上打开它到外部世界.

例如,如果您的docker run命令具有-p 80:8080,它将在容器上公开端口8080并在主机上公开端口80.

您只能在Dockerfile中公开端口,如果您希望灵活地发布端口,则需要使用-P选择docker run.像这样:

docker run -P your_app
Run Code Online (Sandbox Code Playgroud)

  • 这里还要提到的一件事是发布发生在**随机**端口上:`-P, --publish-all 将所有公开的端口发布到**随机**端口`。要查看确切的映射,请使用“docker port CONTAINER_NAME” (4认同)