当前位置: 首页 > news >正文

一文读懂 Docker Compose(白话版)

一、Docker Compose 是个啥?

想象你开餐厅:

  • 单容器 = 一个厨师 👨🍳
  • Docker Compose = 整个后厨团队 👨🍳👩🍳🧑🍳 + 菜单 + 工作流程
    用个菜单文件(docker-compose.yml)就能一键启动整套服务!

二、它能干啥?(核心作用)

场景传统方式Compose 方式
启动 web服务+数据库手动起2个容器+配网络一句命令搞定
团队共享环境每人自己配环境共享配置文件
管理关联服务手工记录启动顺序自动按依赖启动
模拟生产环境本地和生产环境差异大本地/生产配置一致

三、装它!3步搞定

# 1. 先装好 Docker(略过)
# 2. Linux/macOS 一键安装
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 3. 给执行权限
sudo chmod +x /usr/local/bin/docker-compose# 检查版本(装成功会显示版本号)
docker-compose --version

💡 Windows 用户:安装 Docker Desktop 时默认包含 Compose


四、常用命令速查(每天用的)

命令干啥用的示例
up启动所有服务docker-compose up -d(后台运行)
down关闭并清理docker-compose down -v(连数据卷都删)
ps查看运行中的服务docker-compose ps
logs看实时日志docker-compose logs -f web(只看web服务)
build重新构建镜像docker-compose build(改过Dockerfile后用)
exec进容器内部docker-compose exec db bash(操作数据库容器)
restart重启服务docker-compose restart web
config检查配置文件docker-compose config(验证.yml是否正确)
常用命令示例:

以下是基于 Docker Compose v3 语法规范的常用命令详细说明和具体示例:

# docker-compose.yml v3 示例
version: '3.8'
services:web:image: nginx:latestports:- "8080:80"volumes:- ./html:/usr/share/nginx/htmlnetworks:- frontendapi:build: ./apiports:- "5000:5000"environment:- DB_HOST=dbnetworks:- backend- frontenddb:image: postgres:13volumes:- db-data:/var/lib/postgresql/dataenvironment:POSTGRES_PASSWORD: examplenetworks:- backendvolumes:db-data:networks:frontend:backend:
📋 核心操作命令
启动服务
docker compose up -d
  • 启动所有服务(后台模式)
  • 自动创建网络、卷并构建自定义镜像
  • 服务启动顺序:遵循 depends_on 配置的依赖关系
停止并清理
docker compose down --volumes --remove-orphans
  • --volumes: 删除声明在volumes部分的数据卷
  • --remove-orphans: 删除未在配置文件中定义的服务容器
  • --timeout 5: 设置停止容器的超时时间(默认10秒)
⚙️ 服务管理
查看运行状态
docker compose ps

示例输出:

NAME                SERVICE             STATUS              PORTS
project-web-1       web                 running             0.0.0.0:8080->80/tcp
project-api-1       api                 running             0.0.0.0:5000->5000/tcp
project-db-1        db                  running             5432/tcp
服务启停控制
# 启动单个服务
docker compose start db# 停止服务(保留容器)
docker compose stop api# 重启服务(保持依赖顺序)
docker compose restart web# 强制重启(忽略依赖检查)
docker compose up -d --force-recreate api
🐞 调试与维护
实时日志查看
docker compose logs -f --tail=50 web
  • -f:实时跟踪日志输出
  • --tail=50:显示最后50行日志
  • 查看所有服务:docker compose logs -f
容器内执行命令
# 在db容器中执行bash
docker compose exec db bash# 在web容器中执行命令
docker compose exec web nginx -t# 以特定用户身份执行
docker compose exec -u root db psql -U postgres
服务检查与诊断
# 检查端口映射
docker compose port web 80# 查看资源使用情况
docker compose top# 显示服务进程树
docker compose events
🔧 构建与配置
镜像构建管理
# 构建或重新构建服务镜像
docker compose build --no-cache --pull api# 拉取服务最新镜像
docker compose pull --include-deps db
  • --no-cache:禁用构建缓存
  • --pull:始终尝试拉取最新基础镜像
  • --include-deps:同时更新依赖服务
配置验证
# 验证配置文件语法
docker compose config# 显示最终服务列表
docker compose config --services# 显示所有使用的镜像
docker compose images# 以JSON格式输出配置
docker compose config --format json
🧩 高级操作技巧
跨文件项目部署
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
  • 支持多文件配置叠加(后覆盖前)
  • 常用模式:基础配置+环境覆盖配置
命名项目管理
docker compose -p ecommerce up -d
  • -p:指定项目名称(避免名称冲突)
  • 所有资源按projectname_servicename格式命名
服务伸缩
docker compose up -d --scale web=3 api=2
  • 为无状态服务启动多个副本
  • 需要移除容器的端口映射冲突
环境变量管理
# 使用.env文件
docker compose --env-file .env.prod up -d# 覆盖环境变量
docker compose run -e DEBUG=1 api python app.py
📌 命令选项速查表
选项说明示例
-d后台运行模式up -d
-f指定Compose文件-f production.yml
-p项目名称-p myapp
-v删除关联卷down -v
--no-deps不启动依赖服务up --no-deps web
--remove-orphans删除孤儿容器down --remove-orphans
--build强制重新构建镜像up --build
--no-start创建但不启动容器create --no-start

提示:使用 docker compose help [command] 获取具体命令的详细帮助信息,如 docker compose help up

开始
docker compose up
创建网络
创建卷
构建镜像
启动db服务
启动api服务
启动web服务
运行完成

这些命令基于 Docker Compose v3 语法设计,完整覆盖了开发、测试和部署场景。在实际使用中,应结合 .env 环境变量文件和分环境配置文件,实现开发、测试和生产环境的配置管理。


五、使用前后对比(真实体验)

使用前:
在这里插入图片描述

使用后:
在这里插入图片描述


六、优缺点大实话

👍 优点:

  • 开发效率翻倍:新同事5分钟搭好环境
  • 配置即文档:.yml文件就是环境说明书
  • 隔离不串味:每个项目独立网络(像餐厅后厨分中西厨)
  • 版本可控:配置文件塞进Git,随时回滚

👎 缺点:

  • 单机限制:只能在一台机器玩(想集群?得升级K8s)
  • 生产功能弱:没有自动重启、健康检查等高级功能
  • 安全要手动:默认没限制权限(需自己加安全配置)

七、生产环境防坑指南

  1. 别用 latest 标签

    # 危险写法 ❌
    image: mysql:latest # 安全写法 ✅
    image: mysql:8.0.33
    
  2. 必须设资源限制(防容器吃光内存)

    services:web:deploy:resources:limits:cpus: '0.5'memory: 512M
    
  3. 敏感信息别硬编码

    # 创建 .env 文件(别提交到Git!)
    DB_PASSWORD=mysecretpass
    
    # docker-compose.yml 引用
    environment:MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    
  4. 健康检查不能少

    healthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080/health"]interval: 30stimeout: 5sretries: 3
    
  5. 日志要转存

    logging:driver: "json-file"options:max-size: "10m"max-file: "3"
    

八、什么情况该用它?

场景推荐指数原因
本地开发⭐⭐⭐⭐⭐秒建环境,告别"我电脑正常"
测试环境⭐⭐⭐⭐快速部署测试套件
小微项目生产⭐⭐⭐简单应用直接上线
中大型项目生产功能不够,上K8s!

💡 经验之谈

  • 开发测试闭眼用,效率提升肉眼可见
  • 生产环境若要用,记住三点:
      1. 版本锁死(不用latest)
      2. 资源限制(CPU/内存设上限)
      3. 日志监控(日志存文件+健康检查)
http://www.xdnf.cn/news/950941.html

相关文章:

  • JVM参数调优,让系统可用率从95%提高到99.995%
  • ArcGIS应用与FLUS模型预测:从安装到土地利用建模,数据管理、地图制作、遥感解译、空间分析、地形分析及案例分析攻略
  • LLMs之StructuredOutput:大模型结构化输出的简介、常用方案、前沿框架之详细攻略
  • 安宝特科技丨Pixee Medical产品获FDA认证 AR技术赋能骨科手术智能化
  • Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析
  • C++算法训练营 Day13二叉树专题(1)
  • Flutter状态管理框架RiverPod入门
  • 西电【网络与协议安全】课程期末复习的一些可用情报
  • 若依项目部署--传统架构--未完待续
  • 走进离线语音:安信可 VC‑01 智能模块全面拆解与 MCU 实战
  • Open3D 对点云进行去噪(下采样、欧式聚类分割)01
  • 【论文阅读】大模型优化器(Large Language Models As Optimizers)
  • 第一章-数据通信网络基础
  • 无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
  • 删除远程已经不存在但本地仍然存在的Git分支
  • AWS EKS 集群日志上报观测云实践
  • 1.6 http模块nodejs 对比 go
  • 【字节拥抱开源】字节团队开源视频模型 ContentV: 有限算力下的视频生成模型高效训练
  • 安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(质检)
  • 浅谈 ST 表(Sparse Table,稀疏表)
  • 基于ffmpeg+sdl的audio player
  • uniapp 实现腾讯云IM群文件上传下载功能
  • 基于亚博K210开发板——WiFi 模块联网
  • C语言 学习 文件操作(开关,读写,定位,大小)操作 2025年6月8日12:19:24
  • C语言 学习 模块化编程 2025年6月9日19:39:17
  • 论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
  • 触发DMA传输错误中断问题排查
  • Redis哨兵模式以及主从
  • LLM基础5_从零开始实现 GPT 模型
  • CMIP6气候模式资料概览