【问题标题】:Communication between several php docker containers几个php docker容器之间的通信
【发布时间】:2019-01-15 15:03:13
【问题描述】:

我有几个 php 服务器,我们将它们命名为 api1、api2。我已经设置了 docker-compose 文件,它成功地与 nginx 链接运行它们,因此它们可以从主机访问并且工作正常。

这是我的 docker-compose.yml 的示例:

version: "3.5"
services:
nginx:
    user: "root:root"
    image: nginx:stable
    container_name: nginx
    ports:
        - "80:80"
        - "443:443"
    volumes:
        - ./cert:/etc/nginx/ssl/
        - ./vhosts/:/etc/nginx/conf.d/:cached
        - ./logs/nginx:/var/log/nginx:cached
        - ${ACCOUNT_PATH}:/var/www/api1:cached
        - ${ACCOUNT_API_PATH}:/var/www/api2:cached
api1:
    image: php-fpm-image
    build:
        context: "."
        dockerfile: "./images/api1/Dockerfile"
    user: "root:root"
    container_name: account
    working_dir:  /var/www/api1/
    volumes:
        - api1path/:/var/www/api1
api2:
    image: php-fpm-image
    build:
        context: "."
        dockerfile: "./images/api2/Dockerfile"
    user: "root:root"
    container_name: api2
    working_dir:  /var/www/api2/
    volumes:
        - api2:/var/www/api2:cached
networks:
    default:
       name: domain.com
       driver: bridge

与这个用于功能测试的 docker-compose 文件有关:

     version: '3.5'
     services:
        apitests:
           image: apitests:latest
           container_name: api_tests
           volumes:
             - ./config/:/opt/project/config/
             - ./test_reports/screenshots:/root/.selene/screenshots/
     networks:
       default:
       driver: bridge
       external:
          name: domain.com

主机可以访问下一个域:

api1.domain.com 127.0.0.1

api2.domain.com 127.0.0.1

我的问题是如何在 docker 中直接连接它们,因为我需要从 api1 到 api2,apitests 到 api1,api2 的请求。

当我请求时,他们的域直接解析到他们的容器,所以我收到下一个错误

无法连接到远程主机 (172.21.0.8):连接被拒绝

来自任何容器。

如您所知,我需要将他们的域解析为 NGINX 容器,这样它才能正常工作,并且 php-fpm 可以通过 nginx 将结果返回给我。

我怎样才能做到这一点?

【问题讨论】:

    标签: php docker nginx docker-compose containers


    【解决方案1】:

    您的问题似乎是当您的要求是为 nginx 容器分配此域名时,您已将 php 容器命名为 api1.domain.com。

    您可以将 api1/api2 别名分配给容器网络内的 nginx。

    services:
       nginx:
          networks:
            default:
              aliases:
                - api1
                - api2
    

    【讨论】:

    • 我想如果你想从 nginx 解析他们的域名,你还应该将它们“链接”到 nginx 容器。
    • 嗨,伊万,非常感谢。它就像一个魅力。我刚刚进行了一些更新以匹配我的示例。网络是默认的,不需要完整的域路径:)
    【解决方案2】:

    如果我没听错的话,你有几个 docker-compose.yml 文件,需要它们的服务来相互交互。逻辑建议是拥有一个全局定义的网络,比如说

    docker network create testapis
    

    并将所有服务链接到它:

    docker-compose.yml

    ...
    networks:
      default:
        external: 
          name: testapis
    

    在这种情况下,来自所有docker-compose 文件的所有服务都将在它们的主机名下看到彼此(api1api2 等),并且不需要暴露端口(除非您想使用来自该网络之外的服务)

    【讨论】:

    • 不,我已经有了网络,而且我的服务通过它们的容器名称相互看到。但我需要向 api1.domain.com 发送请求,并且它必须转到 nginx 容器。但是现在 api.domain.com 上的请求转到 api1 容器,而 php 不继续它,因为它必须通过 web 服务器工作来服务请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2018-04-30
    • 2021-05-03
    • 1970-01-01
    相关资源
    最近更新 更多