Как соединить два SCS и прокси-сервер через файл docker-compose.yml? - PullRequest
0 голосов
/ 01 февраля 2019

У нас есть проект, в котором мы должны построить две автономные системы - Персоны и Проекты (некоторые группы должны реализовывать людей, а другие - проекты - мы должны реализовывать человека).Для каждого есть отдельный банк данных, и они должны обмениваться информацией друг с другом.Это работает без проблем (я думаю).

Проблема возникает с файлом docker-compose.yml:

version: "3.1"
services:
    proxy:
        image: nginx:1.15-alpine
        ports:
          - 8080:80
        volumes:
          - ./proxy/conf/nginx.conf:/etc/nginx/nginx.conf:ro
          - ./proxy/conf/domain.conf:/etc/nginx/domain.conf:ro
        depends_on:
          - projekt
          - person
    # ========================================
    # Falls Sie das Person-SCS implementieren,
    # überschreiben Sie diesen Teil
    persondb:
        image: mysql
        environment:
          - "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}"
          - "MYSQL_DATABASE=${MYSQL_DATABASE}"
          - "MYSQL_USER=${MYSQL_USER}"
          - "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
        volumes:
          - ./data:/var/lib/mysql
    person:
        #networks:
        #   - default
        build: ./person-scs/.
        depends_on:
          - persondb
        environment:
          - "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}"
          - "MYSQL_DATABASE=${MYSQL_DATABASE}"
          - "MYSQL_USER=${MYSQL_USER}"
    # ========================================
    # Falls Sie das Projekt-SCS implementieren,
    # überschreiben Sie diesen Teil
    projekt:
        image: hashicorp/http-echo
        command: -listen=:8080 -text="Hello from projekt"

    projektdb:
        image: hashicorp/http-echo
        command: -listen=:3306 -text="I am just a dummy"
    # ========================================

Была дана вся прокси-часть docker-composeнам нашим инструктором, а также частями projekt и projektdb (потому что мы не реализуем проект SCS).

Одна из инструкций заключалась в том, что никакой порт, кроме 8080, не будет виден "изснаружи "и что мы должны вызвать Person-API через" localhost: 8080 / person ".На данный момент, когда я вызываю localhost, я получаю страницу ошибки Whitelabel с сообщением 404.

Когда я игнорирую прокси-сервер и внедряю docker-compose внутри моего Person-каталога (с тем же Dockerfile), у меня нет проблем с просмотром страницы localhost: 8080 / person, и все работает просто отлично.

Они не дали нам никакого опыта в написании файлов для создания докеров, поэтому я не уверен, что даже для Google.Надеюсь, кто-то может дать совет.

Редактировать:

nginx.conf выглядит так:

  user  nginx;
  worker_processes  1;

  error_log  /var/log/nginx/error.log warn;
  pid        /var/run/nginx.pid;

  events {
      worker_connections  1024;
  }

  http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;

        include /etc/nginx/domain.conf;

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

        access_log  /var/log/nginx/access.log  main; 

        sendfile        on;
        #tcp_nopush     on;

        keepalive_timeout  65;

        #gzip  on;

        server {
            listen 80 default_server;
            location / {
             proxy_pass http://person:8080/;  
            }
        }
  }

И файл domain.conf:

server {
    listen       80;
    server_name  localhost;

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

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

    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;

   # set maximum allowed files
    client_max_body_size 10M;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location /person {
        proxy_pass http://person:8080/;
    }

    location /projekt {
        proxy_pass http://projekt:8080/;
    }

}

Я знаю, что"...proxy_pass..." часть находится в файлах domain.conf и nginx.conf, похоже, это не проблема.

Не знаю, уместно ли это, но я также использую загрузку Spring.

1 Ответ

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

На самом деле это не вопрос, это целая задача.

Сначала вам нужно понять, как работает мостовая сеть докера - она ​​настраивается автоматически docker-compose, и все службы, объявленные в файле, включены в нее.Вы не должны предоставлять порты между службами - внутри сети все они открыты.

Что вам нужно сделать, это открыть порты снаружи - в вашем случае, согласно задаче, это 8080.Таким образом, это будет единственная точка входа для вашего приложения.Вы выставили это из web - это ошибка.Если у вас есть только один внешний порт, предоставьте его nginx и позвольте nginx выполнить внутреннюю переадресацию соответствующим службам внутри мостовой сети.

Вы должны предоставить свой nginx.conf для подробностей, но в целомэто будет выглядеть примерно так:

...
http {
  server {
    listen 80 default_server; # start listen on 80 inside network
    location / { # forward all requests ...
      proxy_pass http://web/;  # to "web" container
    }
}

Тогда вы выставите nginx снаружи:

docker-compose.yml

...
nginx:
  ports:
    - "8080:80"

Все порты баз данных используются внутри вашей сети, они не должны быть открыты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...