一文读懂 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.pswp.cn/news/908811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息&#xff0…

单例模式与锁(死锁)

目录 线程安全的单例模式 什么是单例模式 单例模式的特点 饿汉实现方式和懒汉实现方式 饿汉⽅式实现单例模式 懒汉⽅式实现单例模式 懒汉⽅式实现单例模式(线程安全版本) 单例式线程池 ThreadPool.hpp threadpool.cc 运行结果 线程安全和重⼊问题 常⻅锁概念 死…

CSS标题下划线动态进入和移开

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>CSS动态效果</title><style>div .title…

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…

鸿蒙 Stege模型 多模块应用

模块 一个鸿蒙应用可能包含一个或者多个功能模块&#xff0c;在 DevEcoStudio 工程中可以创建对应的一个或多个 Module。Module 又分为 “Ability” 和 “Library”两种类型&#xff0c;“Ability”类型的 Module 对应于编译后的 HAP&#xff08;Harmony Ability Package&…

领域LLM九讲——第4讲 构建可测评、可优化的端到端商业AI Agent 系统

领域LLM九讲——第4讲 构建可测评、可优化的端到端商业AI Agent 系统 以 OpenAI Cookbook 的《receipt_inspection》示例为基础&#xff0c;探讨如何设计一个可测试、可优化的端到端 AI Agent 系统。整体流程分为三个阶段&#xff1a; (1) 端到端 Agent 构建&#xff08;基线测…

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…

Linux线程与进程关系及底层实现

在操作系统中&#xff0c;线程切换相比进程切换更轻量级的关键原因之一是 缓存&#xff08;Cache&#xff09;的有效性&#xff0c;尤其是对 CPU 缓存&#xff08;如 L1/L2/L3&#xff09;和 TLB&#xff08;Translation Lookaside Buffer&#xff09;的影响。以下从缓存角度详…

【论文阅读30】Bi-LSTM(2024)

用于精确实时滑坡检测的双向LSTM模型&#xff1a;以印度梅加拉亚邦毛永格里姆为例的研究 IEEE Internet of Things Journal&#xff08;简称 IoT‑J&#xff09;是一份 IEEE 自 2014 年起双月刊发表的国际顶级学术期刊&#xff0c;专注于物联网各领域的研究。 作者&#xff1a…

Java编程之原型模式

原型模式的定义 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;通过复制已有对象来创建新对象&#xff0c;而非通过常规的手段的new关键字来实例化。适用于对象创建成本较高或需要动态配置的场景。 例如&#xff0c;在一个游戏开发中&am…

RAG质量评估

当完成了一个RAG系统的开发工作以后&#xff0c;还需要对该系统的性能进行评估。如何对RAG系统的性能进行评估呢&#xff1f;仔细分析RAG系统的产出成果&#xff0c;主要涉及以下几点&#xff1a; &#xff08;1&#xff09;检索器组件 检索的相关文档 context, &#xff08;…

LLMs基础学习(八)强化学习专题(1)

LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;1&#xff09; 文章目录 LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;1&#xff09;学习资料资源强化学习是什么强化学习一句话精准定义 强化学习与其他学习类型的对比强化学习 vs 监督学习…

19-Oracle 23 ai Database Sharding-知识准备

小伙伴是不是经常遇见大规模集群和数量的时候&#xff0c;业务就提出要对数据进行sharding。 Oracle 和其他数据库&#xff08;如 MySQL、PostgreSQL、MongoDB 等&#xff09; 为什么要进行分片&#xff08;sharding&#xff09;&#xff0c;分片的原因是什么&#xff0c;实现…

分类与逻辑回归 - 一个完整的guide

线性回归和逻辑回归其实比你想象的更相似 &#x1f603; 它们都是所谓的参数模型。让我们先看看什么是参数模型&#xff0c;以及它们与非参数模型的区别。 线性回归 vs 逻辑回归 线性回归&#xff1a;用于回归问题的线性参数模型。逻辑回归&#xff1a;用于分类问题的线性参数…

英语写作中“每一个”each individual、every individual、every single的用法

一、Individual &#xff1a;个体&#xff0c;相对于团体&#xff0c;例如&#xff1a; Individual competition &#xff08;个人比赛&#xff09;&#xff0c;相对于team competition &#xff08;团体比赛&#xff09; Individual users &#xff08;个人用户&#xff09;…

由于 z(x,y) 的变化导致的影响(那部分被分给了链式项)

✅ 本质问题&#xff1a;为什么链式法则中 ∂ F ∂ x \frac{\partial F}{\partial x} ∂x∂F​ 不考虑 z z ( x , y ) zz(x,y) zz(x,y)&#xff1f; &#x1f50d; 一、关键是&#xff1a;偏导数的定义是什么&#xff1f; 我们从最根本的定义开始&#xff1a; ∂ F ( x , y…

python打卡day44@浙大疏锦行

知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 作业&#xff1a; 尝试在cifar10对比如下其他的预训练模型&#xff0c;观察差异&#xff0c;尽可能和他人选择的不同尝试通过ctrl进入resnet的…

十一(3) 类,加深对拷贝构造函数的理解

class ClassName { public: // 拷贝构造函数&#xff1a;参数是同类型对象的引用&#xff08;通常为 const 引用&#xff09; ClassName(const ClassName& other) { // 复制 other 的成员变量到当前对象 } }; 参数要求&#xff1a;必须是同类型对象的引用&#xff0…

网页后端开发(基础1--maven)

maven的作用&#xff1a; Maven是一款管理和构建Java项目的工具。 1.依赖管理&#xff1a; 方便快捷的管理项目依赖的资源&#xff08;jar包&#xff09; 不用手动下载jar包&#xff0c;只需要中maven中引用&#xff0c;maven会查找本地仓库。若本地仓库没有&#xff0c;会直…

认识电子元器件---高低边驱动

目录 一、基本概念 二、关键参数对比 三、工作原理 &#xff08;1&#xff09;高边驱动 &#xff08;2&#xff09;低边驱动 四、典型的应用场景 五、如何选择 一、基本概念 可以理解成&#xff1a;高低边驱动是MOS/IGBT的一种应用方式 高低边驱动是电路拓扑概念&#…