在 DockerFile 中为 Nginx 公开另一个端口

在 DockerFile 中为 Nginx 公开另一个端口

我是 DockerFile 的新手。我希望 Nginx 监听端口8080。因此我以这种方式编写了 dockerFile:

FROM nginx:1.11-alpine
COPY index.html /usr/share/nginx/html
EXPOSE 8080
CMD ["nginx", "-g" , "daemon off;"]

但是在使用此命令制作图像并运行容器之后:

docker run -d -p 80:8080 nginxt:v3

并在 localhost 上使用 Curl 时出现此错误:

curl: (56) Recv failure: Connection reset by peer

我做错了什么? EXPOSE 8080 并不意味着必须在 8080 上监听 Nginx?

答案1

通过EXPOSE 8080在 Dockerfile 上定义,你只会改变暴露的集装箱港口,但你的 Nginx 服务器仍然会监听 80 端口(这是默认配置)。

您需要更改 Nginxlisten配置以匹配您的新暴露端口

与大多数 docker 实现不同,Nginx 不支持使用环境变量进行此类配置(请参阅在 Nginx 配置中使用环境变量在他们的 Docker Hub 页面上)。

如果您希望适应 Nginx 默认配置,您需要使用nginx.conf该配置创建一个新的,然后在 Dockerfile 中listen 8080;使用替换原始配置。COPY

如果您更喜欢“单行解决方法”,您可以更改命令以在每次启动时替换配置:

FROM nginx:1.11-alpine
COPY index.html /usr/share/nginx/html
EXPOSE 8080
CMD ["/bin/sh", "-c", "sed -i 's/listen  .*/listen 8080;/g' /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]

更新

自 1.19 版本起Docker 镜像 Nginx 启动前会提取环境变量:

默认情况下,该函数读取模板文件 /etc/nginx/templates/*.template并输出执行结果 envsubst to /etc/nginx/conf.d.

因此,如果你放置templates/default.conf.template包含如下变量引用的文件:

listen ${NGINX_PORT};

输出/etc/nginx/conf.d/default.conf如下:

listen 80;

相关内容