Docker环境下PHP连接RabbitMQ报错:无法分配请求地址
在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

