You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下PHP连接RabbitMQ报错:无法分配请求地址

问题:Docker环境下Apache+PHP无法连接RabbitMQ,报错Cannot assign requested address

在Docker环境中部署Apache+PHP和RabbitMQ服务时,PHP代码无法连接RabbitMQ,报错信息如下:

Uncaught PhpAmqpLib\Exception\AMQPRuntimeException: Error Connecting to server(99): Cannot assign requested address in /usr/local/apache2/htdocs/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php:27 Stack trace: #0 /usr/local/apache2/htdocs/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Connection/AMQPStreamConnection.php(21): PhpAmqpLib\Wire\IO\StreamIO->__construct('localhost', '5672', 3, 3, NULL) #1 /usr/local/apache2/htdocs/queueProducer.php(12): PhpAmqpLib\Connection\AMQPStreamConnection->__construct('localhost', '5672', 'guest', 'guest') #2 {main} thrown in /usr/local/apache2/htdocs/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php on line 27

当前使用的docker-compose.yml配置:

version: "3.9"
services:
  apache:
    container_name: apache
    build: ./docker/apache
    links:
      - php
    ports:
      - "80:80"
    volumes:
      - ./src:/usr/local/apache2/htdocs
  php:
    container_name: php
    build: ./docker/php
    links:
      - mysql
    ports:
      - "9000:9000"
    volumes:
      - ./src:/usr/local/apache2/htdocs
    working_dir: /usr/local/apache2/htdocs
  mysql:
    image: mysql:8.0.27
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'test'
      MYSQL_DATABASE: helloworld
      MYSQL_USER: helloworld
      MYSQL_PASSWORD: 'test'
    ports:
      - "3306:3306"
    volumes:
      - ./database/mysql:/var/lib/mysql
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: pma
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
      PMA_ARBITRARY: 1
    restart: always
    ports:
      - 8085:80
  rabbit1:
      image: rabbitmq:3-management
      hostname: rabbit1
      ports:
          - "5672:5672"
          - "15672:15672"
          - "25672:25672"
secrets:
    erlang_cookie:
        file: ./RabbitConfig/erlang_cookie.txt
解决方法
  • 修正PHP代码中的RabbitMQ连接地址
    PHP容器内的localhost指向容器自身,而非RabbitMQ容器。将连接代码中的localhost替换为RabbitMQ服务的容器名称rabbit1:

    // 修改前
    // $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
    // 修改后
    $connection = new AMQPStreamConnection('rabbit1', 5672, 'guest', 'guest');
    
  • 确保PHP与RabbitMQ在同一Docker网络
    Docker Compose默认会创建共享网络,但显式配置网络可避免潜在问题。在docker-compose.yml中添加网络定义,并让php和rabbit1服务加入:

    version: "3.9"
    services:
      # 保留原有其他服务配置...
      php:
        # 原有配置...
        networks:
          - app-network
      rabbit1:
        # 原有配置...
        networks:
          - app-network
    
    networks:
      app-network:
        driver: bridge
    
  • 检查RabbitMQ服务状态
    查看RabbitMQ容器日志,确认服务正常启动:

    docker-compose logs rabbit1
    

    日志中出现Server startup complete即说明服务就绪。

  • 验证容器间网络连通性
    进入PHP容器,ping RabbitMQ容器名称检查网络可达性:

    docker exec -it php ping rabbit1
    

    若能正常ping通,说明网络无问题;若不通,检查容器是否正常启动或网络配置。

内容的提问来源于stack exchange,提问作者BullEye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:11:03