Docker Compose使用

一、概念介绍

在实际开发中,一个项目通常不只有一个容器。比如一个标准的网页应用通常需要:

  1. 前端容器(Nginx/React)
  2. 后端容器(Python/Node.js)
  3. 数据库容器(MySQL/PostgreSQL)
  4. 缓存容器(Redis)

如果你手动用 docker run 一个个启动,不仅要记长长的参数,还要手动处理它们之间的网络连接。Docker Compose 允许你用一个 .yml 配置文件来定义这些容器,然后只需一行命令就能全部搞定。

Docker Compose 使用 yml 文件管理多个容器,里面列出了容器之间是如何创建以及如何协同工作的。可以简单的把 Docker Compose 文件理解成一个或者多个的 docker run 命令按照特定的格式列到了一个文件里面。


二、示例:从 docker run 到 docker compose

1. 原始 docker run 命令

创建子网和容器,并将对应的容器添加到同一个子网中:

# 创建子网
docker network create network1

# 创建 my_mongodb 容器
docker run -d \
  --name my_mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=name \
  -e MONGO_INITDB_ROOT_PASSWORD=pass \
  -v /my/datadir:/data/db \
  --network network1 \
  mongo

# 创建 my_mongodb_express 容器
docker run -d \
  --name my_mongodb_express \
  -p 8081:8081 \
  -e ME_CONFIG_MONGODB_SERVER=my_mongodb \
  -e ME_CONFIG_MONGODB_ADMINUSERNAME=name \
  -e ME_CONFIG_MONGODB_ADMINPASSWORD=pass \
  --network network1 \
  mongo-express

2. 对应的 docker compose 文件写法

services:
  my_mongodb:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: name
      MONGO_INITDB_ROOT_PASSWORD: pass
    volumes:
      - /my/datadir:/data/db

  my_mongodb_express:
    image: mongo-express
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_SERVER: my_mongodb
      ME_CONFIG_MONGODB_ADMINUSERNAME: name
      ME_CONFIG_MONGODB_ADMINPASSWORD: pass

其中,services 元素中,每一个 service 都对应一个容器。

注意: docker compose 文件中没有 --network network1。这是因为 Docker 会为每一个 compose 文件都自动创建一个子网,同一个 compose 文件里面定义的所有容器都会自动加入到同一个子网中。


三、控制启动顺序(depends_on)

docker compose 中还有一个额外功能,可以自定义容器的启动顺序。

services:
  my_mongodb:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: name
      MONGO_INITDB_ROOT_PASSWORD: pass
    volumes:
      - /my/datadir:/data/db

  my_mongodb_express:
    image: mongo-express
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_SERVER: my_mongodb
      ME_CONFIG_MONGODB_ADMINUSERNAME: name
      ME_CONFIG_MONGODB_ADMINPASSWORD: pass
    depends_on:
      - my_mongodb

my_mongodb_express 下面添加 depends_on: - my_mongodb,表示 my_mongodb_express 容器依赖 my_mongodb 容器,所以程序会先把 my_mongodb 容器启动起来,再去启动 my_mongodb_express 容器。


四、用 AI 生成 docker compose 文件

可以将 docker run 命令给 AI,让它生成等价的 docker compose 文件。

提示词示例:

sudo docker network create network1

sudo docker run -d \
  --name my_mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=gwt \
  -e MONGO_INITDB_ROOT_PASSWORD=gwt123 \
  --network network1 \
  mongo

sudo docker run -d \
  --name my_mongodb_express \
  -p 8081:8081 \
  -e ME_CONFIG_MONGODB_SERVER=my_mongodb \
  -e ME_CONFIG_MONGODB_ADMINUSERNAME=gwt \
  -e ME_CONFIG_MONGODB_ADMINPASSWORD=gwt123 \
  --network network1 \
  mongo-express

帮我将以上命令生成等价的 docker compose 文件

AI 生成的结果:

services:
  mongodb:
    image: mongo
    container_name: my_mongodb
    environment:
      - MONGO_INITDB_ROOT_USERNAME=gwt
      - MONGO_INITDB_ROOT_PASSWORD=gwt123
    networks:
      - network1

  mongodb_express:
    image: mongo-express
    container_name: my_mongodb_express
    ports:
      - "8081:8081"
    environment:
      - ME_CONFIG_MONGODB_SERVER=my_mongodb
      - ME_CONFIG_MONGODB_ADMINUSERNAME=gwt
      - ME_CONFIG_MONGODB_ADMINPASSWORD=gwt123
    networks:
      - network1
    depends_on:
      - mongodb

networks:
  network1:
    driver: bridge

五、执行命令

vim docker-compose.yaml

# 使用该命令时,它会自动识别当前目录下严格叫做 docker-compose.yaml 的文件
# 若名字不一致,就识别不到
sudo docker compose up -d

# 若非标准文件名,可以用 -f 参数指定文件名
sudo docker compose -f test.yaml up -d

# 或在其他目录下
sudo docker compose -f /home/test.yaml up -d

查看运行的容器

sudo docker ps
# 或
sudo docker compose ps

输出示例:

giniclark@giniclark-VMware-Virtual-Platform:~$ sudo docker compose up -d
[+] Running 2/2
 ✔ Container my_mongodb          Started   0.5s
 ✔ Container my_mongodb_express  Started   0.7s

giniclark@giniclark-VMware-Virtual-Platform:~$ sudo docker ps
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS          PORTS                                         NAMES
c72aa9033e1e   mongo-express   "/sbin/tini -- /dock…"   12 seconds ago   Up 11 seconds   0.0.0.0:8081->8081/tcp, [::]:8081->8081/tcp   my_mongodb_express
1cf8fb98e9b2   mongo           "docker-entrypoint.s…"   12 seconds ago   Up 12 seconds   27017/tcp                                     my_mongodb

常见报错:unknown shorthand flag: ‘d’ in -d

unknown shorthand flag: 'd' in -d

这是因为在 Ubuntu 24.04 或类似系统中,docker-compose-v2 插件有时需要单独安装:

sudo apt update
sudo apt install docker-compose-v2

# 查看版本
docker compose version

六、常用命令对照表

操作 命令 说明
启动所有服务 docker compose up -d -d 表示在后台运行
启动容器 docker compose start 启动容器
停止容器 docker compose stop 停止容器
停止并删除容器 docker compose down 停止容器并清理网络,非常干净
查看状态 docker compose ps 查看当前运行的服务列表
查看日志 docker compose logs -f 实时查看所有容器的输出日志
重新构建 docker compose build 当你修改了 Dockerfile 后使用

七、总结

Docker Compose 是一个轻量级的容器编排技术,适合个人使用、单机运行。对于企业级服务器集群大规模的容器编排需求,则需要 Kubernetes。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐