推荐使用docker-compose批量启动多个关联容器,它支持依赖管理、网络互通、环境隔离和一键启停;通过docker-compose.yml定义服务、网络和卷,执行docker-compose up -d即可自动完成构建、拉取、组网与启动。

批量启动多个关联容器,推荐使用 docker-compose 而非裸写 docker run 命令 —— 它天然支持依赖管理、网络互通、环境隔离和一键启停,是生产与开发中管理多容器应用的标准方式。
用 docker-compose.yml 定义关联容器
在项目根目录创建 docker-compose.yml,声明服务间关系。例如一个 Web 应用(含 Nginx + PHP-FPM + MySQL):
version: '3.8'
services:
web:
image: nginx:alpine
ports: ["8080:80"]
volumes: ["./html:/usr/share/nginx/html"]
depends_on: ["php"]
networks: ["appnet"]
php:
image: php:8.2-fpm-alpine
volumes: ["./html:/var/www/html"]
networks: ["appnet"]
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
volumes: ["dbdata:/var/lib/mysql"]
networks: ["appnet"]
volumes:
dbdata:
networks:
appnet:
driver: bridge
关键点:
- depends_on 控制启动顺序(但不等待服务就绪,需配合健康检查或应用层重试)
- 所有服务默认加入同一自定义网络 appnet,可直接用服务名通信(如 php 连 db 用
mysql://db:3306) - volume 和 network 声明在底部,便于复用和清理
一键启动、停止与状态查看
在 docker-compose.yml 所在目录执行:
-
启动全部容器(后台运行):
docker-compose up -d -
查看运行状态:
docker-compose ps(显示状态、端口、健康检查) -
查看实时日志:
docker-compose logs -f(加--tail=50只看最近 50 行) -
停止全部容器:
docker-compose down(加-v同时删除关联 volume)
注意:up -d 会自动构建镜像(如有 build 配置)、拉取缺失镜像、创建网络和 volume,无需手动准备。
进阶:按需启动子集或带参数启动
并非总要启动全部服务。可指定服务名:
- 只启 web 和 php:
docker-compose up -d web php - 覆盖默认环境变量:
docker-compose up -d --env-file .env.prod - 使用不同 compose 文件:
docker-compose -f docker-compose.prod.yml up -d
若需更灵活控制(如启动前执行数据库迁移),可在 entrypoint 或 command 中封装脚本,或用 docker-compose run --rm migrate sh ./migrate.sh 执行一次性任务。
不推荐:纯 shell 脚本调用 docker run
虽然可用 for 循环或函数启动多个容器,但会丢失以下关键能力:
- 无自动网络连接(需手动
docker network connect) - 无依赖等待逻辑(容易因 db 未就绪导致应用启动失败)
- 无统一生命周期管理(stop/down 清理困难,易留僵尸容器)
- 配置分散(IP、端口、卷路径硬编码,难维护)
仅当临时调试或极简场景(如启动几个独立工具容器)才考虑 shell 方式,例如:
#!/bin/bash docker run -d --name redis -p 6379:6379 redis:7-alpine docker run -d --name nginx -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html nginx:alpine
但这类脚本无法替代 compose 在协作与运维中的作用。











