Docker容器无法通过虚拟主机环境变量访问另一个容器 我是docker的新手,所以我不确定我是否在每件事上都是正确的,但我会尽力描述我的情况。

Docker容器无法通过虚拟主机环境变量访问另一个容器 我是docker的新手,所以我不确定我是否在每件事上都是正确的,但我会尽力描述我的情况。,docker,docker-compose,Docker,Docker Compose,我有两个独立的docker容器,一个用于API,另一个用于前端项目。我使用了jwilder/nginx proxy,因此我可以使用主机名(VIRTUAL\u HOSTdocker compose上的环境变量)访问它们。我可以在浏览器上打开我的前端项目,并且可以使用postman访问我的API 但是,当我尝试在前端站点上使用httpclient访问API端点时,它会返回: cURL错误6:无法解析主机 我所尝试的: 使用网络连接容器。我可以确认它是否有效,因为当我对容器名称执行ping操作时,它会

我有两个独立的docker容器,一个用于API,另一个用于前端项目。我使用了
jwilder/nginx proxy
,因此我可以使用主机名(
VIRTUAL\u HOST
docker compose上的环境变量)访问它们。我可以在浏览器上打开我的前端项目,并且可以使用
postman
访问我的API

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

cURL错误6:无法解析主机

我所尝试的:
  • 使用
    网络连接容器。我可以确认它是否有效,因为当我对容器名称执行ping操作时,它会返回一个响应
  • 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上设置了主机名

    更新:
    使用
    AWS
    上托管的
    staging
    域时,前端项目获得了预期的响应数据。因此,我可以说这方面没有问题。

    您的两个nginx容器在同一个网络上都有网络别名
    nginx
    ,这意味着对
    nginx
    的请求将在这两个容器之间进行循环(AFAIK,无论哪种方式都不好)

    您可能希望前端有类似的功能:

    networks:
      default:
        aliases:
          - frontend-nginx
    
    像这样的后端

    networks:
      default:
        aliases:
          - backend-nginx
    
    然后从前端容器只需卷曲到
    后端nginx
    ,它就应该到达后端容器

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

    这适用于我的场景,但我希望会有更好的解决方案: 我将后端的网络别名设置为需要使用的域,以便它通过代理:

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

    参考:

    您应该链接它们,在docker compose for nginx容器中添加链接,这样它们就可以看到彼此了。如果您在nginx contaner中选中/etc/hosts,则会显示数据库容器的名称及其ip地址

    看看这个:

    您在
    /etc/hosts
    文件中有前端和api的主机名吗(假设您处于“nix”状态)?或者您的dns服务是否设置为解析这些
    .local
    地址?是的,我在我的
    /etc/hosts
    上有它们,因此我可以在浏览器和
    邮递员上访问它们。顺便说一句,我现在在Ubuntu上。
    但是,当我试图在我的前端站点上使用httpclient访问我的API端点时,它会返回:
    你是说你正在前端容器中执行并运行
    curl
    对吗?不,我是说使用httpclient
    (比如
    axios
    )我试过这个,当我
    curl
    在容器中时,它会工作。但我需要的是使用
    .local
    域从前端进行API调用,该域目前仍然不起作用。不,它返回的响应与我在
    邮递员
    上收到的响应类似。如果
    无法解析主机
    ,则很可能是主机上的主机或dns出现问题。或者输入错误:p.如果前端项目在使用外部API(托管在internet上)时工作正常,我的终端会出现什么问题?您尝试访问的确切后端域是什么?谢谢,但这不是一个遗留功能吗?我已经为docker容器设置了
    网络
    。只需停止它们并将链接添加到docker-compose.yaml,然后再次启动它们。除了在另一个中添加一个的主机名和ip地址外,它不会更改任何内容。