如何在 docker 个文件中发布端口

How to publish ports in docker files

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

EXPOSE 80:8080

我还能如何通过 dockerfile 公开端口 public?

你不能。在 docker 主机上发布哪些端口完全是本地管理员应该做出的决定,而不是他们试图 运行 的图像;这将是 (a) 一个安全问题(嘿,我刚刚打开了对你系统的 ssh 访问!)和 (b) 容易失败(我的网络服务器容器无法绑定到端口 80,因为我已经 运行在端口 80 上设置服务器)。

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

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

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

更新2017-03-11

回复 Willa 的评论:

  • 使用docker-compose 对解决端口冲突问题没有帮助。端口冲突问题是图像不能指定主机端口绑定的原因。我只是提供 docker-compose 作为具有多个端口绑定的长 docker run 命令行的替代方法。端口冲突问题可能会允许容器对您的主机执行拒绝服务攻击:例如,如果一个容器在您的主机(或另一个容器)上的 Apache 服务器之前启动并绑定到端口 80,那么你刚刚丢失了网络服务。

  • 关于安全问题:如果镜像能够指定主机端口绑定,则容器有可能在您不知情的情况下打开对容器的访问。如果内核中的命名空间功能无法完全隔离容器,允许远程用户访问您主机上的容器,您就有可能受到主机危害,即使您完全信任隔离,它也会打开您的大门如果该容器用于非法目的,可能会引发潜在的法律问题。无论哪种情况,这都是一个坏主意。

公开发布有区别。

Expose表示在容器端开放端口,publish表示在Docker宿主机对外开放

例如,如果您的 docker 运行 命令有 -p 80:8080,它会在容器和发布端口上公开端口 8080主机上 80 个。

你只能在 Docker 文件中真正公开端口,如果你想灵活地发布端口,你需要使用 -P 选择 docker 运行.像这样:

docker run -P your_app

你可以做的是 EXPOSEDockerfile 上的端口列表,然后 运行 命令 docker run -P your_app 发布 Dockerfile 上公开的所有端口

  1. EXPOSE Dockerfile 上的端口列表。

  2. 运行 docker run -d -P --name app_name app_image_name.

  3. 前面步骤成功后,

    运行 docker port app_name 将显示如下输出:

    80/tcp -> 0.0.0.0:32769 443/tcp -> 0.0.0.0:32768