我是 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;