如何设置端口以将静态网站作为Nginx Docker容器运行?

时间:2019-07-13 11:18:26

标签: docker nginx gitlab dockerfile

我正在尝试使用docker和nginx运行静态网站。我在我的ubuntu机器上使用jwilder/nginx-proxy作为反向代理。但是调用https://www.example.com会返回502错误。 我认为正确设置端口是有问题的,但是我看不到我的错误。

这是我的Dockerfile ...

FROM nginx:alpine
COPY . /usr/share/nginx/html

EXPOSE 3499

...这就是我配置gitlab ci的方式:

build:
  stage: build
  image: docker:stable
  script:
    - docker build -t ${DOCKER_CONTAINER}:latest .

production:
  stage: release
  image: docker:stable
  variables:
    GIT_STRATEGY: none
  script:
    - docker run
      --name ${DOCKER_CONTAINER}
      --detach
      --restart=always
      -e VIRTUAL_HOST=www.example.com
      -e LETSENCRYPT_HOST=www.example.com
      -p 3499
      ${DOCKER_CONTAINER}:latest
  environment:
    name: production
    url: https://www.example.com

2 个答案:

答案 0 :(得分:5)

问题在于,假设仅使用EXPOSE 3499即可更改nginx配置上的端口。 Nginx仍在容器内的端口80上运行。

EXPOSE表示您的意图是图像确实打算暴露3499。但是内部的服务器需要进行配置,以确保其侦听的端口相同。

由于您使用的是docker nginx官方镜像,因此您可以在下面阅读其文档

https://hub.docker.com/_/nginx

在nginx配置中使用环境变量

开箱即用,nginx不支持大多数配置块中的环境变量。但是如果您需要在nginx启动之前动态生成nginx配置,可以使用envsubst作为解决方法。

以下是使用docker-compose.yml的示例:

web:
  image: nginx
  volumes:
   - ./mysite.template:/etc/nginx/conf.d/mysite.template
  ports:
   - "8080:80"
  environment:
   - NGINX_HOST=foobar.com
   - NGINX_PORT=80
  command: /bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

mysite.template文件随后可能包含这样的变量引用:

listen ${NGINX_PORT};

因此,如您所见,您需要在图像中做一些工作,以确保您的nginx实际上在3499上监听

更新:2019年7月23日

如果您不想使用环境变量执行此操作。然后您可以使用docker-compose

覆盖文件

因此,您将保留一个本地文件default.conf,在其中更改内容

server {
    listen       3499;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

将此文件安装到您的docker-compose.yml

web:
  image: nginx
  volumes:
   - ./default.conf:/etc/nginx/conf.d/default.conf
  ports:
   - "8080:3499"

这将确保文件正确。如果您不想在运行时覆盖,甚至可以将其复制到Dockerfile

答案 1 :(得分:0)

您需要添加

-e VIRTUAL_PORT=3499 to your gitlab configuration.

检查jwilder / nginx-proxy文档的Multiple Ports部分。 https://hub.docker.com/r/jwilder/nginx-proxy