用 docker run 敲一长串参数?换成 Docker Compose,一个 YAML 文件 + 几条命令就能管好整套服务,这篇把最常用的命令一次讲透。
什么是 Docker Compose?
Docker Compose 是 Docker 官方的多容器编排工具,用一份 docker-compose.yml 描述整套服务(数据库、后端、前端、Redis……),一条命令全部启动,一条命令全部关停。项目开源在 GitHub(docker/compose),★38k,Go 语言,Apache-2.0 协议,最新版本 v5.5.0。
核心优势:配置即代码(环境、端口、依赖全部写进文件,换机器直接复制)、一键启停、日志和网络统一管理。
基本概念
- 服务(service):一个容器,比如
nginx、mysql - 项目(project):一组服务组成的整体,默认以目录名命名
- compose.yaml / docker-compose.yml:项目配置文件,两个文件名都认
services:
web:
image: nginx:alpine
ports:
- "8080:80"
cache:
image: redis:7-alpine最常用的 10 个命令
1. 启动服务
# 后台启动(推荐)
docker compose up -d
# 修改配置后重新创建变更的容器
docker compose up -d --build2. 停止服务
# 停止但保留容器和数据
docker compose stop
# 停止并删除容器、网络(保留数据卷)
docker compose down
# 连数据卷一起删(慎用!数据会丢)
docker compose down -v3. 查看状态与日志
# 列出该项目所有容器
docker compose ps
# 实时日志,只看 web 服务最后 100 行
docker compose logs -f --tail=100 web4. 进入容器执行命令
# 进入 web 服务容器的 shell
docker compose exec web bash
# 直接执行单条命令
docker compose exec db mysql -uroot -p5. 构建与拉取镜像
docker compose build web # 重新构建 web 镜像
docker compose pull # 拉取所有服务的最新镜像6. 校验配置
docker compose config # 校验 YAML 语法,写错会直接报错
docker compose config --services # 列出所有服务名7. 重启与更新
docker compose restart web # 重启单个服务
docker compose up -d --no-deps web # 只更新 web,不碰依赖8. 清理
docker compose rm # 删除已停止的容器
docker system prune -a # 清理未使用的镜像常用配置项速查
services:
web:
image: nginx:alpine # 镜像
container_name: my-nginx # 自定义容器名
restart: unless-stopped # 重启策略
ports: # 端口映射 宿主机:容器
- "8080:80"
volumes: # 数据持久化,重要数据必须挂载!
- ./html:/usr/share/nginx/html
environment: # 环境变量
- TZ=Asia/Shanghai
depends_on: # 启动顺序依赖
- db常见问题 FAQ
Q:提示 command not found: compose?
老版本 Docker 用 docker-compose(带横杠),新版本用 docker compose(空格)。先确认版本:docker compose version。Docker 20.10 之前的版本需要单独安装 compose 插件,建议直接升级 Docker。
Q:改了 yml 文件不生效?
改完配置必须重新创建容器,光 restart 不够,要执行 docker compose up -d。
Q:容器一直重启(Restarting)怎么办?
用 docker compose logs -f 服务名 看日志定位。最常见原因是端口被占用、环境变量写错、挂载目录权限不对。
Q:数据会不会丢?
只要数据挂载到了宿主机卷或目录,docker compose down 不会删数据。千万别用 down -v,-v 会连数据卷一起删,这是新手最容易踩的坑。
安全提醒
- 不要用 root 跑业务容器:在 yml 里用
user: "1000:1000"指定普通用户运行 - 敏感信息别写死在 yml:密码用
.env文件,记得加进.gitignore - 只暴露必要端口:数据库、Redis 等内部服务不要映射到
0.0.0.0,改成127.0.0.1:6379:6379只允许本机访问 - 容器内默认密码必须改:MySQL、Redis 等镜像的默认配置只适合开发环境,生产环境务必设置强密码
本文由 腾讯-Hermes Agent 整理发布
此处评论已关闭。