一、什么是 Docker Compose

Docker Compose‌ 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个 YAML 格式的配置文件(通常为 docker-compose.yml)来声明式地定义应用的服务、网络和存储卷等‌。其主要作用是简化单机环境下多容器应用的部署与管理,适合开发、测试以及小型生产环境。

Compose 项目管理命令的使用

  • up:创建项目并启动容器
  • ls:列出可管理的项目
  • images:列出项目使用的镜像
  • ps:显示项目中容器的状态
  • logs:查看项目中容器的日志
  • start | stop | restart:启动项目 | 停止项目 | 重启项目
  • down:删除项目容器及网络
# 创建工作目录并进入该目录
mkdir test ; cd test

编写docker-compose.yaml文件

name: web
services:
  websvc:
    container_name: nginx
    image: myos:nginx

使用 Docker Compose 管理项目

# -f:指定docker-compose.yaml文件的路径
docker compose -f test/docker-compose.yaml up -d
[+] Running 2/2
 ✔ Network web_default  Created                                                                                                                                                               1.5s 
 ✔ Container nginx      Started                                                                                                                                                               1.3s
# 查看当前可管理的项目
docker compose ls -a
NAME                STATUS              CONFIG FILES
web                 running(1)          /root/test/docker-compose.yaml
# 查看项目的状态 -p:指定项目名
docker compose -p web ps
NAME      IMAGE        COMMAND                  SERVICE   CREATED          STATUS          PORTS
nginx     myos:nginx   "nginx -g 'daemon of…"   websvc    51 seconds ago   Up 50 seconds   80/tcp
# 查看项目使用的镜像
docker compose -p web images
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
nginx               myos                nginx               399bd2cbc51c        265MB

# 停止、启动、重启项目
docker compose -p web stop
[+] Stopping 1/1
 ✔ Container nginx  Stopped                                                                                                                                                                   0.5s 
docker compose -p web start
[+] Running 1/1
 ✔ Container nginx  Started                                                                                                                                                                   1.1s 
docker compose -p web restart
[+] Restarting 1/1
 ✔ Container nginx  Started                                                                                                                                                                   2.5s
# 查看项目中容器的日志
docker compose -p web logs
# 删除项目容器及网络
docker compose -p web down

二、Compose 语法

  • container_name:指定容器名称
  • image:指定为镜像名称或镜像 ID
  • ports:暴露端口信息
  • volumes:数据卷,支持volumebindtmpfsnpipe
  • network_mode:设置网络模式
  • environment:设置环境变量
  • restart:容器保护策略,alwaysnoon-failure
  • command:覆盖容器启动后默认执行的命令
  • healthcheck:配置服务健康检测
  • depends_on:服务依赖关系service_ [ started | healthy | comfpleted_successfully ]

容器服务编排示例

测试文件

<pre>
<?PHP
//phpinfo();
//$arr = array("id" => random_int(0000,9999));
foreach (array("REMOTE_ADDR", "REQUEST_METHOD", "HTTP_USER_AGENT",
  "REQUEST_URI") as $i) {
  $arr[$i] = $_SERVER[$i];
}
if($_SERVER['REQUEST_METHOD']=="POST"){
  $arr += $_POST;
}else{
  $arr += $_GET;
}
print_R($arr);
print_R("php_host: \t".gethostname()."\n");
$n = 0;
$start = 1;
$end = isset($_GET["id"])? $_GET["id"] : 10000 ;
for($num = $start; $num <= $end; $num++) {
    if ( $num == 1 ) continue;
    for ($i = 2; $i <= sqrt($num); $i++) {
        if ($num % $i == 0) continue 2;
    }
    $n++;
}
print_R($n."\n");
?>

修改Compose文件

name: web
services:
  websvc:
    container_name: nginx
    # 默认在私有镜像仓库的library下拉取镜像,若不是则需带标签或者写绝对路径
    image: myos:nginx
    ports:
      - 80:80
    environment:
      - "TZ=Asia/Shanghai"
    volumes:
      - type: bind
        # 此目录下的nginx配置文件需配置动静分离
        source: /var/webconf/
        target: /usr/local/nginx/conf/
      - type: bind
        # 网页文件根目录
        source: /var/webroot/
        target: /usr/local/nginx/html/
  phpsvc:
    container_name: php-fpm
    image: myos:php-fpm
    restart: always
    network_mode: "service:websvc"
    volumes:
      - type: bind
        source: /var/webroot/
        target: /usr/local/nginx/html/

验证

 docker compose -f test/docker-compose.yaml up -d
[+] Running 2/2
 ✔ Container nginx    Started                                                                                                                                                          0.6s 
 ✔ Container php-fpm  Started                                                                                                                                                          1.1s 
docker compose ls -a
NAME                STATUS              CONFIG FILES
web                 running(2)          /root/test/docker-compose.yaml
docker compose -p web ps
NAME      IMAGE          COMMAND                   SERVICE   CREATED          STATUS          PORTS
nginx     myos:nginx     "nginx -g 'daemon of…"   websvc    59 seconds ago   Up 58 seconds   0.0.0.0:80->80/tcp, [::]:80->80/tcp
php-fpm   myos:php-fpm   "/usr/sbin/php-fpm -…"   phpsvc    59 seconds ago   Up 58 seconds

# 查看动静分离效果
curl http://localhost/info.php
<pre>
Array
(
    [REMOTE_ADDR] => 172.18.0.1
    [REQUEST_METHOD] => GET
    [HTTP_USER_AGENT] => curl/7.76.1
    [REQUEST_URI] => /info.php
)
php_host:       1a15c562f055
1229

# 删除项目及网络
docker compose -p web down
[+] Running 3/3
 ✔ Container php-fpm    Removed                                                                                                                                                        0.1s 
 ✔ Container nginx      Removed                                                                                                                                                        0.3s 
 ✔ Network web_default  Removed     

嵌入式脚本示例

name: testsvc
services:
  initsvc:
    container_name: init
    image: rockylinux:9
    # 以下命令会覆盖启动容器的默认指令
    command:
      - sh
      - -c
      - |
        for i in {1..9}
        do
            sleep 1
            # $${HOSTNAME}:用于查看容器内的主机名
            echo "${HOSTNAME} && $${HOSTNAME}"
        done
  phpsvc:
    container_name: php
    image: myos:php-fpm
    healthcheck:            # 定义健康检查
      test:                 # 健康检查指令
        - CMD
        - sh 
        - -c 
        - exit [0|1]        # 通过退出值判断健康检查状态,0表示成功,其他表示失败
      interval: 3s          # 健康检查的间隔时间
      timeout: 2s           # 健康检查的超时时间
      retries: 2            # 健康检查的重试次数
      start_period: 2s      # 容器启动后延时检查时间
    # 当前容器需要等initsvc成功后才能启动
    depends_on:
      initsvc:
        condition: service_completed_successfully
  nginxsvc:
    container_name: nginx
    image: myos:nginx
    # 当前容器需等待phpsvc启动成功并通过健康检查再启动
    depends_on:
      phpsvc:
        condition: service_healthy

验证

docker compose -f test/testsvc.yaml up -d
[+] Running 4/4
 ✔ Network testsvc_default  Created                                                    0.1s 
 ✔ Container init           Exited                                                    10.0s 
 ✔ Container php            Healthy                                                   15.8s 
 ✔ Container nginx          Started                                                   16.2s
docker compose -p testsvc ls -a
NAME                STATUS                  CONFIG FILES
testsvc             exited(1), running(2)   /root/test/docker-compose.yaml
# 查看项目中容器的状态
docker compose -p testsvc ps -a
# 查看项目内容器的日志
docker compose -p testsvc logs
php  | [18-Mar-2026 15:50:35] NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root
php   | [18-Mar-2026 15:50:35] NOTICE: [pool www] 'group' directive is ignored when FPM is not running as root
init  | test && 5c81f4f2f8d7
init  | test && 5c81f4f2f8d7
init  | test && 5c81f4f2f8d7
init  | test && 5c81f4f2f8d7
init  | test && 5c81f4f2f8d7
init  | test && 5c81f4f2f8d7
init  | test && 5c81f4f2f8d7
init  | test && 5c81f4f2f8d7
init  | test && 5c81f4f2f8d7
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐