docker容器之间的代理

时间:2017-05-13 21:08:34

标签: ruby-on-rails nginx docker docker-compose

我有一个使用以下

的泊坞设置
  1. rails api backend
  2. mysql db
  3. redis db
  4. node / react frontend(webpack)
  5. nginx服务于前端
  6. (rails后端目前通过内置的puma服务器提供服务 - 我想我会将它移动到运行节点应用程序的同一个nginx服务器上)

    我的问题是前端会在后端请求内容,但这不起作用。

    我在nginx上设置了一个代理,如下所示:

    #nginx.conf
    
    server {
        listen 8080;
    
        # Always serve index.html for any request
          location / {
            # Set path
            root /wwwroot/;
            try_files $uri /index.html;
          }
    
          location /api/ {
            proxy_pass http://127.0.0.1:3000;
          }
    }
    

    但是当我发起api调用时,我在nginx日志中得到以下内容:

    nginx-server | 2017/05/13 20:56:08 [error] 5#5: *19 connect() failed (111: Connection refused) while connecting to upstream, client: 172.21.0.1, server: , request: "POST /api/authenticate HTTP/1.1", upstream: "http://127.0.0.1:3000/api/authenticate", host: "localhost:8080", referrer: "http://localhost:8080/"
    nginx-server | 172.21.0.1 - - [13/May/2017:20:56:08 +0000] "POST /api/authenticate HTTP/1.1" 502 575 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" "-"
    

    我没有看到任何东西撞到美洲狮服务器。

    我不确定我应该在哪里看。这是我的docker-compose文件的问题还是nginx问题(或两者兼而有之)。 我在下面包含了我的docker-compose.yml:

    version: '2'
    
    services:
      nginx:
        build:
          context: .
          dockerfile: docker.nginx
        image: pt-nginx
        container_name: nginx-server
        ports:
          - "8080:8080"
        volumes:
          - wwwroot:/wwwroot
    
      webpack:
        build:
          context: ./frontend
          dockerfile: docker.webpack
        image: pt-webpack
        container_name: react-frontend
        ports:
          - "35729:35729"
        volumes:
          - ./frontend:/app
          - /app/node_modules
          - wwwroot:/wwwroot
      db:
        build:
          context: ./backend
          dockerfile: docker.mysql
        image: pt-mysql
        container_name: mysql-server
    
        env_file: ./backend/.env
        ports:
          - "3306:3306"
        volumes:
          - ./sql/data/:/var/lib/mysql
    
      redis:
        build:
          context: ./backend
          dockerfile: docker.redis
        image: pt-redis
        container_name: redis-server
    
      app:
        build:
          context: ./backend
          dockerfile: docker.rails
        image: pt-rails
        container_name: rails-server
    
        command: >
          sh -c '
          rake resque:start_workers;
          bundle exec rails s -p 3000 -b 0.0.0.0;
          '
        env_file: ./backend/.env
        volumes:
          - ./backend:/usr/src/app
          - /Users/mh/Pictures/ROR_PT/phototank:/Users/martinhinge/Pictures/ROR_PT/phototank
        ports:
          - "3000:3000"
        expose:
          - "3000"
        depends_on:
          - db
          - redis
    
    volumes:
      wwwroot:
        driver: local
    

1 个答案:

答案 0 :(得分:2)

问题是您的nginx服务正在请求localhost(127.0.0.1)的上游。但是应用程序位于另一个容器中(使用另一个IP)。您可以在app通过DNS引用rails应用程序,因为它们都在默认网络中。 nginx配置中的上游看起来像proxy_pass http://app:3000;

详细了解https://docs.docker.com/compose/networking/的网络,特别是:

  

在Web容器中,到db的连接字符串看起来像postgres:// db:5432,并且从主机看,连接字符串看起来像postgres:// {DOCKER_IP}:8001。