跳到主要内容

Docker Compose 快速入门

当你开始反复复制一长串 docker run,或者服务已经不止一个时,继续靠命令行硬拼通常不是好主意。这个时候,把配置写进 compose.yaml 会更稳。

什么情况下该上 Compose

出现下面任意一种,我就会考虑换 Compose:

  • 服务超过一个
  • 需要固定端口、环境变量、数据卷
  • 想让别人也能一把启动
  • 你已经把启动命令记到了笔记或脚本里

一个最小可用的 compose.yaml

services:
web:
image: nginx:stable
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: unless-stopped

redis:
image: redis:7
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redis-data:/data
restart: unless-stopped

volumes:
redis-data:

这份配置做了几件事:

  • 起一个 nginx 服务,对外暴露 8080
  • 把本地 ./html 作为静态页面目录挂进去
  • 起一个 redis 服务,并把数据持久化到 named volume

最常用的 Compose 命令

启动

docker compose up -d

看服务状态

docker compose ps

跟日志

docker compose logs -f
docker compose logs -f web

进入某个服务容器

docker compose exec web sh
docker compose exec redis redis-cli ping

停掉并删除容器

docker compose down

如果连数据卷也一起删:

docker compose down -v

down -v 会删掉 Compose 创建的 named volume。数据库或缓存数据如果还要留,别顺手就执行它。

我很建议多用的一个命令

在真正启动前,先看 Compose 解析后的结果:

docker compose config

这个命令特别适合排查:

  • YAML 缩进问题
  • 环境变量没有生效
  • 最终挂载和端口是不是自己想要的那份

docker run 的关系

可以把 Compose 理解成:把多条 docker run 需要的参数集中写进一个可版本化的文件里。

它不是和 docker run 对立,而是当下面这些信息开始稳定后,把它们从命令行搬到了 YAML:

  • 镜像
  • 容器名
  • 端口
  • 环境变量
  • 数据卷
  • 网络

命名和文件位置

现在更推荐直接使用:

compose.yaml

命令也统一用:

docker compose ...

而不是旧的 docker-compose 独立命令。

一个很实用的迁移判断

如果你的 docker run 已经长到这样:

docker run -d --name web \
--restart unless-stopped \
-p 8080:80 \
-e APP_ENV=prod \
-v app-data:/data \
--network app-net \
my-app:latest

那就已经值得搬到 Compose 里了。

关联阅读