Docker容器无法通过VIRTUAL_HOST环境变量访问另一个容器

时间:2018-08-09 09:05:43

标签: docker docker-compose

我是docker的新手,所以我不确定自己是否对所有事情都正确,但是我会尽力描述自己的情况。

我有两个单独的docker容器,一个用于API,一个用于前端项目。我使用了jwilder/nginx-proxy,因此可以使用主机名(docker-compose上的VIRTUAL_HOST环境变量)访问它们。我可以在浏览器中打开前端项目,也可以使用postman访问我的API。

但是,当我尝试使用前端站点上的httpclient访问我的API端点时,它返回:

cURL error 6: Could not resolve host

我尝试过的事情:

  1. 使用networks连接容器。我可以确认它是否有效,因为当我ping容器名称时,它会返回一个响应。
  2. 在前端项目的extra_hosts中添加docker-compose。当我curl使用容器bash添加的主机时,我从API得到响应。

仍然,当我尝试打开站点时,错误仍然存​​在。我想念什么?

这是我的项目docker-compose

前端:

version: "2"

services:      
  pixel_nginx:
    build: docker/nginx
    networks:
      default:
        aliases:
          - nginx
    depends_on:
      - pixel_phpfpm
    volumes:
      - ./docker/nginx/symfony.conf:/etc/nginx/conf.d/default.conf
      - ./:/www/
    environment:
      - VIRTUAL_HOST=pixel-project.local
    extra_hosts:
      - "auth-xx-dev.pixel.local:172.18.0.7"
      - "listing-xx-dev.pixel.local:172.18.0.7"

  pixel_phpfpm:
    build: docker/phpfpm
    volumes:
      - ~/.ssh/known_hosts:/root/.ssh/known_hosts
      - ~/.ssh/id_rsa:/root/.ssh/id_rsa
      - ./:/www/
      - ./data/pixel-project/tmp/:/tmp/
    networks:
      default:
        aliases:
          - php
    depends_on:
      - mysql
    environment:
      - ENV=development

networks:
  default:
    external:
      name: pixelstack_pixel

后端:

version: "2"

volumes:
  # this is the mysql data volume we are going to host the data inside
  dev_mysql_data:

services:
  # database container for local development purposes
  dev_database:
    image: mysql:5.6
    networks:
      default:
        aliases:
          - database
    ports:
      - 3400:3306
    volumes:
      # mount the mysql_data docker volume to host the local development database
      - dev_mysql_data:/var/lib/mysql
      # the provision file helps when trying to use the provision script to clone databases
      - ./provision.cnf:/provision.cnf
    environment:
      MYSQL_ROOT_PASSWORD: pixel

  # This is the local development version of the nginx container
  dev_nginx:
    image: api-nginx:latest
    build: ./nginx
    networks:
      default:
        aliases:
          - nginx
    depends_on:
      - dev_phpfpm
    volumes_from:
      - dev_phpfpm
    environment:
      - VIRTUAL_HOST=~^(api|location|feedback|user|phone|loancalculator|seo|media|listing|development|kpi|newsletter|auth|worker|search)-xx-dev.pixel.local

  # This is the local development version of the phpfpm container
  dev_phpfpm:
    image: api-phpfpm:latest
    build:
      context: ./
      args:
        # this build might fail, if so, run in a terminal: export SSH_KEY=$(cat ~/.ssh/id_rsa)
        - SSH_KEY=$SSH_KEY
    networks:
      default:
        aliases:
          - phpfpm
    depends_on:
      - dev_database
    volumes:
      # we override the images /www directory with the code from the live machine
      - ./:/www
    env_file:
      # inside this file, are the shared database secrets such as username/password
      - ./env/common
      - ./env/dev

networks:
  default:
    external:
      name: pixelstack_pixel

编辑: 我正在使用Ubuntu,并在/ etc / hosts上设置了主机名

更新:

使用staging上托管的AWS域时,前端项目按预期获得了响应数据。所以我可以说那边没有问题。

3 个答案:

答案 0 :(得分:1)

您的nginx容器都在同一网络上具有网络别名nginx,这意味着对nginx的请求将在两者之间进行循环(AFAIK,这两种方法都不行)。

您可能想要这样的前端:

networks:
  default:
    aliases:
      - frontend-nginx

类似这样的后端

networks:
  default:
    aliases:
      - backend-nginx

然后从前端容器中卷曲到backend-nginx,它应该到达后端容器。

Tldr:您有重复的别名,并且这些.local域也无法在容器中解析。

答案 1 :(得分:0)

这适用于我的情况,但我希望会有更好的解决方案:

我将后端的网络别名设置为我需要使用的域,以使其通过代理:

networks:
      default:
        aliases:
          - auth-xx-dev.pixel.local
          - listing-xx-dev.pixel.local

参考:docker reverse proxy DNS/networking issues

答案 2 :(得分:0)

您应该链接它们,在docker-compose中为nginx容器添加链接,然后它们可以彼此看到。如果检查nginx contaner中的/ etc / hosts,将有数据库容器的名称及其ip地址。

检查一下: https://docs.docker.com/compose/networking/#update-containers