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

Nginx upstream doesn't work with docker deploy stack

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

我的堆栈是这样工作的:

这是我的 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

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

这是我的服务报错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

看下面我的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;
    }
}

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

发生这种情况是因为 nginx-api 服务在 api 服务之前启动。

但我添加了 depends_on 选项?

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

The depends_on option is ignored when deploying a stack in swarm mode with a version 3 Compose file.

好的,那我现在该怎么办?

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

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

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