我需要将主机上的端口映射到容器上的端口。我可以通过使用"docker run"
选项运行-p
命令来实现此目的。我如何通过Dockerfile
实现这一目标?
使用以下内容可以得到"deprecated error"
EXPOSE 80:8080
如何通过dockerfile公开暴露的端口?
答案 0 :(得分:22)
你不能。在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,则你刚丢失了网络服务。
关于安全问题:如果图像能够指定主机端口绑定,则容器可能会在您不知情的情况下打开对容器的访问。允许远程用户访问主机上的容器会让您在主机中的命名空间功能无法完全隔离容器的情况下遭受主机危害,即使您完全信任隔离,它也会打开您如果该容器用于非法目的,则可能存在法律问题。在任何一种情况下,这都是一个坏主意。
答案 1 :(得分:17)
公开和发布之间存在差异。
Expose意味着打开容器端的端口,发布意味着在Docker主机上打开它到外部世界。
例如,如果您的docker run命令具有 -p 80:8080 ,则它会在容器上公开端口8080并在主机上公开端口80.
你只能在Dockerfile中公开端口,如果你想要灵活地发布端口,你需要使用-P选择与docker run。像这样:
docker run -P your_app
答案 2 :(得分:0)
您可以做的是Title
EXPOSE
上的端口列表,然后运行命令Dockerfile
以发布Dockerfile上公开的所有端口
答案 3 :(得分:0)
EXPOSE
Dockerfile上的端口列表。
运行docker run -d -P --name app_name app_image_name
。
在完成上述步骤后,
运行docker port app_name
,将显示如下输出:
80/tcp -> 0.0.0.0:32769
443/tcp -> 0.0.0.0:32768