Nginx 上游不适用于 docker 部署堆栈

Jér*_*eau 5 nginx docker docker-compose docker-swarm

我正在尝试使用 docker 部署堆栈。

这是我的堆栈的工作原理:

  • nginx-proxy(将用户请求重定向到好的容器)
  • 网站(简单的 nginx 服务网站)
  • api(django 应用程序,使用 gunicorn 启动)
  • nginx-api(提供静态文件和上传的文件,如果是端点,则重定向到 API 容器)

这是我的 docker-compose.yml:

version: '3.2'

services:
    website:
        container_name: nyl2pronos-website
        image: nyl2pronos-website
        restart: always
        build:
          context: nyl2pronos_webapp
          dockerfile: Dockerfile
        volumes:
            - ./logs/nginx-website:/var/log/nginx
        expose:
            - "80"
        deploy:
            replicas: 10
            update_config:
                parallelism: 5
                delay: 10s

    api:
        container_name: nyl2pronos-api
        build:
            context: nyl2pronos_api
            dockerfile: Dockerfile
        image: nyl2pronos-api
        restart: always
        ports:
            - 8001:80
        expose:
            - "80"      
        depends_on:
            - db
            - memcached
        environment:
            - DJANGO_PRODUCTION=1
        volumes:
            - ./data/api/uploads:/code/uploads
            - ./data/api/static:/code/static

    nginx-api:
        image: nginx:latest
        container_name: nyl2pronos-nginx-api
        restart: always
        expose:
            - "80"
        volumes:          
            - ./data/api/uploads:/uploads
            - ./data/api/static:/static
            - ./nyl2pronos_api/config:/etc/nginx/conf.d
            - ./logs/nginx-api:/var/log/nginx
        depends_on:
            - api

    nginx-proxy:
        image: nginx:latest
        container_name: nyl2pronos-proxy
        restart: always
        ports:
            - 80:80
            - 443:443
        volumes: 
            - ./proxy:/etc/nginx/conf.d
            - /etc/letsencrypt:/etc/letsencrypt
            - ./logs/nginx-proxy:/var/log/nginx
        deploy:
            placement:
                constraints: [node.role == manager]
        depends_on:
            - nginx-api
            - website
Run Code Online (Sandbox Code Playgroud)

当我使用docker-compose up 时一切正常。但是当我尝试使用 docker stack deploy --compose-file=docker-compose.yml prod进行部署时。我的 nginx 配置文件找不到不同的上游

这是我的服务nginx-api提供的错误:

2019/03/23 17:32:41 [emerg] 1#1: host not found in upstream "api" in /etc/nginx/conf.d/nginx.conf:2
Run Code Online (Sandbox Code Playgroud)

见下面我的nginx.conf

upstream docker-api {
    server api;
}

server {
    listen 80;
    server_name xxxxxxxxxxxxxx;

    location /static {
        autoindex on;
        alias /static/;
    }

    location /uploads {
        autoindex on;
        alias /uploads/;
    }

    location / {
        proxy_pass         http://docker-api;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}

Run Code Online (Sandbox Code Playgroud)

如果您发现我的配置有问题或我可以做得更好,请告诉我!

Efr*_*tan 2

发生这种情况是因为nginx-api服务先于服务启动api

但我添加了depends_on选项?

你是对的,这个选项应该适用于一个docker-compose up案例。但不幸的是,不是在docker stack deploy, 或者 上,正如文档所说:

使用版本 3 Compose 文件以 swarm 模式部署堆栈时,将忽略 dependent_on 选项。

好的,那我现在能做什么呢?

没有什么。它实际上不是一个错误-

docker swarm 节点(您的堆栈服务)应该在出现错误时自动恢复。(这就是您定义该restart: always选项的原因)。所以无论如何它应该对你有用。

如果您仅使用 compose 文件来部署堆栈而不是docker-compose up- 您可以完全删除该depends_on选项,这对 docker stack 没有任何意义。