如何通过一个码头工人,compose.yml文件中的两个SCS和代理服务器连接?

时间:2019-02-01 08:27:00

标签: java docker nginx docker-compose dockerfile

我们有一个项目,我们必须构建两个独立的系统-人员和项目(某些小组必须实施人员,而其他小组必须实施项目-我们必须实施人员)。 每个数据库都有一个单独的数据库,它们必须彼此交换信息。我认为那没有问题。

问题出现在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以外的任何端口,并且我们必须通过“ localhost:8080 / person”调用Person-API。截至目前,当我呼叫本地主机时,我收到带有404消息的Whitelabel错误页面。

当我忽略代理服务器并在Person目录中实现docker-compose(具有相同的Dockerfile)时,看到localhost:8080 / person页面就没有问题,一切正常。

他们没有给我们编写docker-compose文件的背景知识,所以我什至不确定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 Boot。

1 个答案:

答案 0 :(得分:0)

这真的不是问题,这是一个完整的任务。

首先,您需要了解docker的桥接网络的工作原理-它由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"

数据库的所有端口都在您的网络内部内部使用,不应暴露。