咨询:基于同一Docker镜像创建独立并发容器用于PHPUnit测试
解决方案:创建独立的并发Docker容器组用于PHPUnit测试
核心结论
完全可以创建最多5个完全独立、无通信的容器组(PHP+MySQL),用于并行运行PHPUnit测试,测试完成后自动销毁实例。
先解决当前的MySQL连接错误(ERROR 1130)
这个错误是因为MySQL默认只允许localhost连接,你的PHP容器从其他IP访问时,需要授权用户允许远程访问:
- 在你的SQL初始化脚本
init.sql中添加以下内容,创建允许任意IP访问的测试用户:
CREATE USER 'testuser'@'%' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'%'; FLUSH PRIVILEGES;
- 确保PHP容器连接MySQL时使用这个授权用户,而非仅允许localhost的用户。
架构优化:用Docker Compose项目隔离实现多实例
手动创建php-2、mysql-2这类命名容器会导致管理复杂,推荐用Docker Compose的项目隔离(-p参数)来批量创建独立实例:
1. 编写通用的docker-compose.yml
version: '3.8' services: php: build: ./php # 指向你的PHP镜像构建目录 volumes: - ./your-tests:/var/www/tests # 挂载本地测试代码到容器内 depends_on: - mysql command: ["phpunit", "/var/www/tests"] # 启动后直接运行测试 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: test_root_pass MYSQL_DATABASE: test_db MYSQL_USER: testuser MYSQL_PASSWORD: test_pass volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql # 挂载初始化脚本 - type: tmpfs # 使用临时存储,容器销毁后数据自动清除 target: /var/lib/mysql
2. 启动多个独立实例
每个实例通过-p <项目名>参数隔离,自动创建独立的网络、容器名和资源:
# 启动第1个实例 docker-compose -p test1 up --abort-on-container-exit --remove-orphans # 启动第2个实例(可同时运行) docker-compose -p test2 up --abort-on-container-exit --remove-orphans # 最多可以启动5个,依次用test3到test5作为项目名
--abort-on-container-exit:PHPUnit测试完成后自动停止容器--remove-orphans:清理无关的孤立容器- 临时卷
tmpfs:确保测试数据不会持久化,销毁容器即清空数据库
3. 批量并行启动(可选)
如果需要同时启动5个实例,写个简单的bash脚本:
#!/bin/bash # 并行启动5个测试实例 for i in {1..5}; do docker-compose -p test$i up --abort-on-container-exit --remove-orphans & done # 等待所有实例完成 wait
额外优化建议
- 资源限制:避免单个实例占用过多资源,在
docker-compose.yml中添加资源限制:
services: php: deploy: resources: limits: cpus: '0.5' memory: 512M mysql: deploy: resources: limits: cpus: '0.5' memory: 512M
- 单容器方案(可选):如果不需要拆分PHP和MySQL,可以把两者打包到同一个镜像,用
supervisord管理两个进程,每个容器就是一个独立测试单元,减少容器间通信的复杂度。
内容的提问来源于stack exchange,提问作者chugged
相关产品推荐
相关产品推荐

