Nginx Docker Compose容器为何始终存在80/tcp端口?如何移除?
问题解决指南
一、移除docker ps中显示的80/tcp端口条目
官方Nginx镜像的Dockerfile默认包含EXPOSE 80声明,这是镜像的元数据,会让docker ps显示该端口条目,即使容器实际未监听80端口。要彻底移除这个显示,需自定义镜像:
- 创建本地Dockerfile
在项目目录下新建Dockerfile:
FROM nginx:latest # 删除镜像默认的Nginx配置文件(避免和挂载的配置冲突) RUN rm /etc/nginx/conf.d/default.conf # 不添加EXPOSE声明,镜像将不再携带80端口的元数据
- 修改docker-compose.yml
替换镜像来源为本地构建:
version: "3.8" services: ng_proxy: build: . # 指向Dockerfile所在目录 restart: always volumes: - ~/ngx/public:/var/www/html - ~/ngx/conf.d:/etc/nginx/conf.d ports: - 8100:100
- 重新构建并启动容器
docker-compose up -d --build
二、解决502 Bad Gateway错误
该错误与主机80端口占用无关,排查方向如下:
- 检查静态文件是否存在
确保主机~/ngx/public目录下有配置的索引文件(如index.html),可创建测试文件验证:
echo "<h1>Test Page</h1>" > ~/ngx/public/index.html
- 修正目录权限
官方Nginx镜像使用nginx用户(UID 101)运行,需保证容器能读取挂载目录的文件:
chmod -R 755 ~/ngx/public chown -R 101:101 ~/ngx/public
- 验证Nginx配置有效性
进入容器检查配置是否合法:
docker exec -it ngx_web-ng_proxy-1 nginx -t
若有错误,根据提示修改default.conf(比如确认listen 100、root /var/www/html等配置项)。
- 确认容器内端口监听状态
验证Nginx是否仅监听100端口:
docker exec -it ngx_web-ng_proxy-1 ss -tulpn | grep nginx
内容的提问来源于stack exchange,提问作者sooon
相关产品推荐
相关产品推荐

