【问题标题】:Docker. Communication between Laravel containers码头工人。 Laravel 容器之间的通信
【发布时间】:2022-05-13 19:42:49
【问题描述】:

我有一个项目正在尝试使用微服务方法进行开发。我在两个独立的微服务上准备了 API 并完成了它们的测试。当我从容器 A 向容器 B 发送请求时,我收到错误 cURL 错误 7:无法连接到 localhost 端口 8100:连接被拒绝。经过我的研究,我找不到解决方案。 请求架构: 我正在尝试从 127.0.0.1:8000 向运行在 127.0.0.1:8100 的 api 地址发出请求。

我应该怎么做才能解决这个问题?我的问题可能是错误的,所以我提前道歉。

谢谢

我的 Compose File First 容器

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
      build:
          context: ./docker/8.0
          dockerfile: Dockerfile
          args:
              WWWGROUP: '${WWWGROUP}'
      image: sail-8.0/app
      container_name: MP-Main-Service-Laravel
      extra_hosts:
          - 'host.docker.internal:host-gateway'
      ports:
          - 8000:8000
      environment:
          WWWUSER: '${WWWUSER}'
          LARAVEL_SAIL: 2
          XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
          XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
      volumes:
          - '.:/var/www/html'
      networks:
          - sail
      depends_on:
          - mysql
          - redis
    mysql:
        image: 'mysql:8.0'
        container_name: MP-Main-Service-MySql
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_USER: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - "/var/lib/mysql"
        networks:
            - sail
    phpmyadmin:
        image: 'phpmyadmin:latest'
        container_name: MP-Main-Service-PhpMyAdmin
        ports:
            - 8081:80
        environment:
            PMA_HOST: mysql
            MYSQL_ROOT_USER: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
        depends_on:
            - mysql
        networks:
            - sail
    redis:
        image: 'redis:alpine'
        container_name: MP-Main-Service-Redis
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
        healthcheck:
          test: ["CMD", "redis-cli", "ping"]
          retries: 3
          timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
    sailredis:
        driver: local
 

我的撰写文件第二个容器

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./docker/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        container_name: MP-Communication-Service-Laravel
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - 8100:8000
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            - redis
    mysql:
        image: 'mysql:8.0'
        container_name: MP-Communication-Service-MySql
        ports:
            - '${FORWARD_DB_PORT:-33061}:33061'
        environment:
            MYSQL_ROOT_USER: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - "/var/lib/mysql"
        networks:
            - sail
    phpmyadmin:
        image: 'phpmyadmin:latest'
        container_name: MP-Communication-Service-PhpMyAdmin
        ports:
            - 8082:80
        environment:
            PMA_HOST: mysql
            MYSQL_ROOT_USER: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
        depends_on:
            - mysql
        networks:
            - sail
    redis:
        image: 'redis:alpine'
        container_name: MP-Communication-Service-Redis
        ports:
            - '${FORWARD_REDIS_PORT:-63791}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "redis-cli", "ping"]
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
    sailredis:
        driver: local

【问题讨论】:

  • "我正在尝试从 127.0.0.1:8000 向运行在 12.0.0.1:8100 的 api 地址发出请求。" - 你到底是什么意思这个?对于 http-request,我们没有明确定义源地址,它是从 TCP 标头中读取的。
  • 我在这里看不到端口 8100 上运行的服务。如果您将它放在单独的 docker compose 文件中,那么它可能使用的是不同的网络。也许尝试将这两个服务放在同一个 .yml
  • @apokryfos 我已经附上了两个撰写文件。我是 Docker 新手。我做错的事情可能是愚蠢的。对不起
  • 根据stackoverflow.com/questions/38088279/…,您似乎只需在两个.yml 文件之一中将driver: bridge 替换为external: true,然后这两个服务将加入同一个桥接网络。但是,由于您正在复制服务,因此我会警惕这里的端口冲突。也许更好的主意是找到一种方法为每个容器提供一个已知的主机名,以便它们可以通过它而不是“localhost”进行通信(虽然不知道如何做到这一点)
  • 要在 docker 容器之间进行通信,您不必使用 127.0.0.1 地址,它们都有自己的 IP/名称。

标签: laravel docker api guzzle


【解决方案1】:

注意:此解决方案是原始的,用于开发时间:

首先获取容器网关ip:

❯ docker inspect {container id} | grep -i Gateway                                                                                                                                                                                      

其次假设它给你172.25.0.1

您的网址格式将如下所示:

http://{containerIp}:{port}/...

或:

http://172.25.0.1:8585/...

端口与您在docker-compose.yaml 文件中输入的端口相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2021-09-07
    • 2017-02-01
    相关资源
    最近更新 更多