Не удается найти контейнерный сервис за контейнером nginx - PullRequest
0 голосов
/ 24 февраля 2019

Я получил эту архитектуру, и она почти работает.

  • Я могу curl напрямую обратиться к службе, и она отправляет запросы репликам, работающим позади.
  • Также я могу свернуть контейнер nginx.
  • Кроме того, я могу без проблем запустить docker exec -i nginx curl http://articleservice:8080/somemethod.

Но что-то не так с моимконфигурации.Nginx и контейнер находятся в одной сети.

Архитектура:

                                             [replica 2]
                                            /
[incoming traffic] -> [nginx] -> [service a]
                                            \
                                             [replica 1]

docker-compose.yml

version: "3"
services:
  articleservice:
    image: elps/articleservice:1.1.0.5
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.role == manager
    ports:
      - "8080:8080"
    environment:
      - MYSQL_HOST=192.168.178.96
      - MYSQL_DB=catalog
      - MYSQL_USER=root
      - MYSQL_PASSWORD=root
    networks:
      - webnet     

  nginx-default:
    image: nginx
    deploy:
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.role == manager
    ports:
      - "80:80"
    networks:
      - webnet

networks:
  webnet:

nginx-config

server {
  listen 80;
  listen [::]:80;

  server_name example.com;

  location /article {
      proxy_pass http://articleservice:8080/; 
  }
}

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Вам следует создать том в службе nginx-default, чтобы он мог использовать файл nginx.conf.

Пример:

  nginx-default:
    image: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    deploy:
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.role == manager
    ports:
      - "80:80"
    networks:
      - webnet

Другая проблема заключается в том, что при обращении к URL-адресу example.com / article / someMethod будет переведен на articleservice: 8080 / article / someMethod
Чтобы удалить префикс "/ article", вы можете переписать его:

  location /article {
      proxy_pass http://articleservice:8080/; 
      rewrite ^/article(.*)$ $1 break;
  }

Теперь вы можете использовать curl example.com/article/someMethod для использования articleService

0 голосов
/ 24 февраля 2019

Еще раз я забыл добавить хост в шапку.

Решение:

curl -H 'host: example.com' http://articleservice:8080/somemethod

...