如何实现两个Docker容器间CURL通信及配置优化
问题根因
你的两个site容器均为PHP-FPM服务,仅暴露FastCGI协议的9000端口,不支持直接响应HTTP请求,这是报错的核心原因:
- curl site2:80 报错是因为site2容器没有启动80端口的HTTP服务
- curl site2:9000 报错是因为HTTP请求和FastCGI协议不匹配,对方直接重置连接
所有HTTP请求需要走Nginx服务转发,和生产环境的逻辑一致。
docker-compose 结构优化方案
优先方案:统一走Nginx转发(对齐生产逻辑)
- 先修正挂载路径冲突问题:你原来的webserver服务同时把两个站点代码挂载到
/var/www,后挂载的会覆盖前者,需要调整为分目录挂载:
# site1服务volumes调整 volumes: - ../site1:/var/www/site1 - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini # site2服务volumes调整 volumes: - ../site2:/var/www/site2 - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini # webserver服务volumes调整 volumes: - ../site1:/var/www/site1 - ../site2:/var/www/site2 - ./nginx/conf.d/:/etc/nginx/conf.d/
- 给Nginx配置两个虚拟主机,分别绑定
site1.test、site2.test域名,请求分别转发到对应的site1、site2的9000端口的PHP-FPM服务。 - 在site1、site2服务中添加域名映射,让容器内的站点域名直接解析到Nginx服务:
# site1服务添加配置 extra_hosts: - "site2.test:webserver" # site2服务如果需要请求site1也加对应的配置 extra_hosts: - "site1.test:webserver"
配置完成后在site1容器内直接curl site2.test就能正常请求,和生产环境请求公网域名的逻辑完全一致。
4. 可选优化:去掉webserver服务暴露的9000端口映射,PHP-FPM端口仅需同Docker网络内的服务访问,不需要暴露到宿主机,避免端口冲突。
备选方案:单站点配独立Nginx
如果需要站点完全隔离,可以给每个PHP服务配独立的Nginx服务,比如nginx-site1、nginx-site2,分别挂载对应站点的代码和配置,此时直接curl nginx-site2即可正常请求。
Dockerfile 优化和基础镜像选型建议
基础镜像选型
- 优先升级PHP版本:PHP7.1已经停止官方维护多年,存在大量安全漏洞,如果业务兼容,优先选择官方维护的
php:7.4-fpm-alpine3.16、php:8.1-fpm-alpine等长期支持版本,镜像体积小、安全更有保障。 - 必须使用PHP7.1的场景:选择官方最后发布的稳定版本
php:7.1-fpm-alpine3.7,不要使用第三方未验证的镜像。
Dockerfile优化点
- 合并RUN指令减少镜像层数,安装完成后清理缓存,大幅减小镜像体积
- 指定兼容PHP版本的Composer版本,避免最新版Composer不兼容旧PHP的问题
- 移除不必要的依赖,比如不需要bash的话可以去掉,用Alpine自带的sh即可
优化后的Dockerfile示例(兼容PHP7.1):
FROM php:7.1-fpm-alpine3.7 # 合并依赖安装、扩展编译流程,最后清理缓存 RUN apk --no-cache add \ libzip-dev \ libpng-dev \ libjpeg-turbo-dev \ && docker-php-ext-install zip pdo \ && docker-php-ext-configure gd --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install gd \ && rm -rf /var/cache/apk/* /tmp/* # 安装兼容PHP7.1的Composer 2.2 LTS版本 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer --version=2.2.21
内容的提问来源于stack exchange,提问作者user3412802
相关产品推荐
相关产品推荐

