Docker Nginx禁用默认的80端口暴露

5

有没有办法在不创建自己的映像的情况下禁用nginx docker文件中的默认EXPOSE 80 443指令?

我正在使用Docker Nginx映像,并尝试以以下方式公开端口443:

docker run -itd --name=nginx-test --publish=443:443 nginx

但是我可以使用docker ps -a命令查看到该容器也暴露了80端口:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                     NAMES
ddc0bca08acc        nginx               "nginx -g 'daemon off"   17 seconds ago      Up 16 seconds       80/tcp, 0.0.0.0:443->443/tcp              nginx-test

如何禁用它?
4个回答

3
“expose指令”在构建镜像的docker文件中。你需要创建自己定制的镜像。
完成此任务的步骤如下: 首先找到dockerfile官方nginx(库)
然后将dockerfile的“expose”指令编辑为只有“443”。
现在使用官方(定制)dockerfile构建自己修改后的镜像。
回答您编辑后的问题: Docker使用iptables,虽然您可以手动更新防火墙规则使某个端口的服务不可用,但无法解绑Docker代理。因此,端口80仍会在docker主机和docker代理上被占用。

我知道这是默认设置,有没有一种方法可以使用docker命令而不创建自己的镜像来完成它? - TomG
我认为在这种情况下,仅为暴露端口而重新构建镜像是不必要的。 - Joaquin Javi
需要重新构建镜像,暴露命令仍将监听80端口,但nginx服务将拒绝它。e40ba7e86867 nginx "nginx -g 'daemon off'" 4秒前已启动2秒,80/tcp、443/tcp nginx-test - Farhad Farahi
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Joaquin Javi
1
是的,这就是我的回答的重点...链接也来自于我的回答... - Farhad Farahi

0

有个解决方法可以释放端口(但不是取消暴露)。我试过避免发布端口,但它没用,我还是得到了关于端口已经在使用的错误。直到我发现诀窍是发布暴露的端口,但映射到另一个端口。

让我举个例子来说明。

这仍然会尝试使用端口80:

docker up -p 443:443

但是这将使用443端口和您选择的一些其他随机端口

docker up -p 443:443 -p<some free port>:80

您可以在命令、docker-compose或ansible playbooks中执行此操作,以便在同一台机器上启动多个实例。(例如:nginx,默认情况下会公开端口80)

我也是从docker-compose和ansible中执行此操作的。


0

0
根据nginx docker镜像配置,您可以在容器启动之前通过传递环境变量来设置此项,例如:
docker run -itd -e NGINX_PORT=443 --name=nginx-test nginx

看见:

在nginx配置中使用环境变量

然后在你的nginx中你可以设置:
listen ${NGINX_PORT};

1
这只是指示nginx服务停止在端口80上监听,docker仍将占用docker主机上的端口80,docker代理仍将重定向端口80到容器。 - Farhad Farahi
1
只需执行docker ps命令,您就可以看到端口80已经公开了。e40ba7e86867 nginx "nginx -g 'daemon off" 4秒前 上线 2秒 80/tcp, 443/tcp nginx-test - Farhad Farahi
你说得没错,但是服务永远不会听取它,因为你正在传递到监听端口443,我认为这不是端口转发,只是未使用的端口... - Joaquin Javi
重点是,您不能在同一台Docker主机上有另一个容器侦听端口80,因为您正在浪费它在未使用它的容器上。 - Farhad Farahi
Docker内部端口是通过桥接的DNS解析的,这就是为什么您可以将相同的内部端口转发到主机,无论如何,您是正确的,我同意留下一个未使用的地址有点混乱,但我认为这个问题有点主观,只是在处理它的方式上。 - Joaquin Javi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接