Docker Compose 完全指南:从入门到生产实践

Docker Compose 完全指南:从入门到生产实践

1. Docker Compose 简介与核心价值

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用的服务,只需简单命令就能创建和启动所有服务。

核心优势

  • 简化多容器管理:通过单一文件管理多个关联容器
  • 开发环境标准化:团队共享相同的环境配置
  • 快速环境搭建:一条命令启动复杂应用栈
  • 服务依赖管理:自动处理服务间的依赖关系
  • 配置即代码:版本控制环境配置

典型应用场景

  • 开发环境搭建
  • 自动化测试环境
  • 单主机部署
  • 微服务应用演示

2. Compose 文件结构与版本

2.1 基本文件结构

version: "3.8"  # 指定Compose文件格式版本services:  # 容器服务定义webapp:image: nginx:alpineports:- "80:80"database:image: postgres:13environment:POSTGRES_PASSWORD: examplevolumes:  # 持久化卷定义db-data:

版本选择建议

  • 新项目使用 3.8+ 版本
  • 需要 swarm 部署时使用 3.x 版本
  • 旧系统兼容考虑 2.4 版本

2.2 版本演进对比

特性2.x 系列3.x 系列
Swarm 模式支持有限支持完整支持
GPU 支持不支持3.7+ 支持
扩展字段不支持3.4+ 支持
服务依赖depends_on 基本增强的健康检查依赖

3. 核心服务配置详解

3.1 镜像与构建

使用现有镜像

services:redis:image: redis:6.2-alpine

基于 Dockerfile 构建

services:webapp:build:context: ./dirdockerfile: Dockerfile.devargs:NODE_ENV: developmentimage: my-webapp:1.0

参数说明

  • context:构建上下文路径
  • dockerfile:指定 Dockerfile 文件名
  • args:构建时变量传递

3.2 端口映射

services:web:ports:- "80:80"           # 主机端口:容器端口- "443:443/tcp"      # 指定协议- "3000-3005:3000-3005"  # 端口范围- "9090"            # 仅暴露容器端口

最佳实践

  • 开发环境使用明确端口映射
  • 生产环境谨慎暴露端口
  • 考虑使用反向代理管理入口

3.3 环境变量配置

.env 文件

DB_USER=admin
DB_PASS=secret

Compose 文件引用

services:db:environment:POSTGRES_USER: ${DB_USER}POSTGRES_PASSWORD: ${DB_PASS}env_file:- ./db.env

优先级规则

  1. environment 显式定义
  2. env_file 文件定义
  3. 容器内已有环境变量

3.4 数据持久化

services:database:volumes:- db-data:/var/lib/postgresql/data- ./logs:/app/logsvolumes:db-data:driver: local

挂载类型对比

  • 命名卷:docker 管理,适合生产数据
  • 主机路径:开发调试方便
  • 临时卷:内存存储,高性能临时数据

4. 网络配置策略

4.1 默认网络行为

services:web:networks:- frontendapi:networks:- frontend- backendnetworks:frontend:backend:driver: bridge

自动生成规则

  • 默认创建 项目名_default 网络
  • 相同网络内的服务可通过服务名互访
  • 隔离不同项目的网络环境

4.2 自定义网络配置

networks:app-net:driver: bridgeipam:config:- subnet: 172.20.0.0/24gateway: 172.20.0.1attachable: true

高级选项

  • internal: true 创建隔离网络
  • enable_ipv6: true 启用 IPv6
  • labels 添加元数据

5. 服务依赖与健康检查

5.1 依赖控制

services:web:depends_on:db:condition: service_healthyredis:condition: service_starteddb:healthcheck:test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 5stimeout: 3sretries: 5

依赖条件类型

  • service_started:服务容器启动
  • service_healthy:通过健康检查
  • service_completed_successfully:一次性任务成功

5.2 健康检查配置

healthcheck:test: ["CMD", "curl", "-f", "http://localhost/health"]interval: 30stimeout: 10sretries: 3start_period: 5s

检查方式

  • CMD:直接执行命令
  • CMD-SHELL:通过 shell 执行
  • 禁用disable: true

6. 常用命令实战

6.1 基础命令

# 启动所有服务(后台模式)
docker-compose up -d# 查看运行状态
docker-compose ps# 停止服务
docker-compose stop# 停止并删除容器
docker-compose down# 重建服务
docker-compose up -d --build

6.2 调试命令

# 查看服务日志
docker-compose logs -f web# 执行一次性命令
docker-compose run --rm web python manage.py migrate# 进入运行中容器
docker-compose exec db psql -U postgres

6.3 扩展操作

# 水平扩展服务实例
docker-compose up -d --scale web=3# 查看服务资源使用
docker-compose top# 验证配置文件
docker-compose config

7. 生产环境最佳实践

7.1 安全配置

services:db:read_only: truetmpfs: /runsecurity_opt:- no-new-privileges:trueuser: "1000:1000"

安全建议

  • 避免使用 root 用户
  • 限制内存和 CPU
  • 设置只读文件系统
  • 禁用特权升级

7.2 资源约束

services:worker:deploy:resources:limits:cpus: '0.5'memory: 512Mreservations:memory: 256Mrestart_policy:condition: on-failuremax_attempts: 3

关键配置

  • CPU 限制 (cpus)
  • 内存限制 (memory)
  • 重启策略
  • 容器更新顺序

7.3 多环境配置

base.yml:

services:app:image: my-appenv_file: .env

override.yml:

services:app:environment:DEBUG: "true"ports:- "8080:80"

启动命令

docker-compose -f base.yml -f override.yml up

8. 完整示例分析

8.1 微服务应用示例

version: "3.8"services:frontend:build: ./frontendports:- "3000:3000"depends_on:- apinetworks:- app-netapi:build: ./backendenvironment:DB_URL: postgres://user:pass@db:5432/appvolumes:- ./backend:/appnetworks:- app-net- db-netdb:image: postgres:13environment:POSTGRES_PASSWORD: passPOSTGRES_USER: userPOSTGRES_DB: appvolumes:- db-data:/var/lib/postgresql/datanetworks:- db-nethealthcheck:test: ["CMD-SHELL", "pg_isready -U user -d app"]interval: 5snetworks:app-net:db-net:internal: truevolumes:db-data:

架构特点

  1. 前端服务暴露 3000 端口
  2. API 服务连接数据库
  3. 数据库使用独立内部网络
  4. 数据持久化存储
  5. 健康检查确保依赖顺序

9. 总结与进阶建议

9.1 核心要点回顾

  1. 编排能力:Compose 简化了多容器应用的管理
  2. 声明式配置:YAML 文件定义完整应用栈
  3. 环境一致性:实现开发-测试-生产环境一致
  4. 资源控制:精确管理服务资源分配
  5. 服务发现:内置 DNS 解析简化服务通信

9.2 进阶学习建议

  1. 与 Swarm/K8s 集成

    docker stack deploy -c compose.yml myapp
    
  2. 使用扩展字段

    x-logging: &default-loggingoptions:max-size: "10m"max-file: "3"
    
  3. 性能调优

    • 合理设置 ulimits
    • 优化卷驱动选择
    • 配置 OOM 杀手策略
  4. 监控方案

    services:prometheus:image: prom/prometheusports:- "9090:9090"
    

通过掌握 Docker Compose,您已经具备了高效管理容器化应用的能力。建议从简单项目开始实践,逐步应用到复杂生产环境,最终实现基础设施即代码的现代化运维模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79424.shtml

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

相关文章

Linux 离线安装 Docker 和 Docker Compose 最新版 的完整指南

一、准备工作 1. 下载安装包​(需在有网络的机器操作): Docker 引擎:从官方仓库下载最新二进制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz​Docker Compose:下载最新二进制…

CSS: 选择器与三大特性

标签选择器 标签选择器就是选择一些HTML的不同标签&#xff0c;由于它们的标签需求不同&#xff0c;所以CSS需要设置标签去选择它们&#xff0c;为满足它们的需求给予对应的属性 基础选择器 标签选择器 <!DOCTYPE html> <head><title>HOME</title>…

鸿蒙跨平台开发教程之Uniapp布局基础

前两天的文章内容对uniapp开发鸿蒙应用做了一些详细的介绍&#xff0c;包括配置开发环境和项目结构目录解读&#xff0c;今天我们正式开始写代码。 入门新的开发语言往往从Hello World开始&#xff0c;Uniapp的初始化项目中已经写好了一个简单的demo&#xff0c;这里就不再赘述…

JavaSE核心知识点02面向对象编程02-08(异常处理)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-08&#…

【JVM-GC调优】

一、预备知识 掌握GC相关的VM参数&#xff0c;会基本的空间调整掌握相关工具明白一点&#xff1a;调优跟应用、环境有关&#xff0c;没有放之四海而皆准的法则 二、调优领域 内存锁竞争cpu占用io 三、确定目标 【低延迟】&#xff1a;CMS、G1&#xff08;低延迟、高吞吐&a…

基于单片机的电子法频率计

一、电子计数法测频率原理 通过门控控制闸门开关&#xff0c;闸门时间T自己设定&#xff0c;计数器计数脉冲个数N&#xff08;也就是待测信号&#xff09;&#xff0c;N个脉冲的时间间隔为δt,倒数即为信号的频率f,由此 δtT/N fN/T——信号频率 根据公式&#xff0c;如果考虑…

【C/C++】跟我一起学_C++同步机制效率对比与优化策略

文章目录 C同步机制效率对比与优化策略1 效率对比2 核心同步机制详解与适用场景3 性能优化建议4 场景对比表5 总结 C同步机制效率对比与优化策略 多线程编程中&#xff0c;同步机制的选择直接影响程序性能与资源利用率。 主流同步方式: 互斥锁原子操作读写锁条件变量无锁数据…

判断两台设备是否在同一局域网内的具体方法

以下是判断两台设备是否在同一局域网内的具体方法&#xff1a; 1. 检查IP地址和子网掩码 操作步骤&#xff1a; Windows系统&#xff1a; 按 Win R 键&#xff0c;输入 cmd 并回车。输入 ipconfig&#xff0c;查看 IPv4 地址 和 子网掩码&#xff08;如 192.168.1.5/255.255.2…

在R语言中如何将列的名字改成别的

在 R 中&#xff0c;更改数据框&#xff08;data frame&#xff09;中列的名字可以通过多种方法实现。以下是几种常见的方法&#xff1a; 方法 1&#xff1a;使用 names() 函数 names() 函数可以获取或设置数据框的列名。 示例 假设我们有一个数据框 data&#xff1a; dat…

JUC并发编程(上)

一、JUC学习准备 核心知识点&#xff1a;进程、线程、并发&#xff08;共享模型、非共享模型&#xff09;、并行 预备知识&#xff1a; 基于JDK8,对函数式编程、lambda有一定了解 采用了slf4j打印日志 采用了lombok简化java bean编写 二、进程与线程 进程和线程概念 两者对比…

单地平面6层PCB设计实战:如何兼顾电源与信号完整性?

摘要&#xff1a;面对复杂系统&#xff08;SDRAM、WiFi、电机驱动等&#xff09;且仅有1层地平面的6层板设计挑战&#xff0c;本文从层叠规划、电源噪声抑制、高速信号处理等角度&#xff0c;总结可落地的设计技巧与避坑指南。 一、层叠设计&#xff1a;6层板如何“挤”出最优布…

spark:map 和 flatMap 的区别(Scala)

场景设定 假设有一个包含句子的 RDD&#xff1a; scala val rdd sc.parallelize(List("Hello World", "Hi Spark")) 目标是&#xff1a;将每个句子拆分成单词。 1. 用 map 的效果 代码示例 scala val resultMap rdd.map(sentence > sentence…

基于VSCode+PlatformIO环境的ESP8266的HX1838红外模块

以下是针对ESP8266开发板的红外遥控解码系统开发教程&#xff0c;基于VSCodePlatformIO环境编写 一、概述 本实验通过ESP8266开发板实现&#xff1a; 红外遥控信号解码自定义按键功能映射串口监控输出基础设备控制&#xff08;LED&#xff09; 硬件组成&#xff1a; NodeMC…

Kubernetes排错(十四):Pod状态异常排查手册

当你在凌晨三点收到告警&#xff0c;发现Pod在崩溃循环中挣扎时&#xff0c;如何快速定位问题&#xff1f;本文将为你梳理一套生产环境通用的Pod排错流程&#xff0c;并附上救火队员必备的实用命令清单&#xff01; 一、5分钟快速定位&#xff1a;四步锁定问题方向 步骤1&…

医院药品管理系统(准备工作)

准备工作 创建数据库表 搭建Springboot框架 创建工程 定位maven 其他准备工作 创建数据库表 建了九张表 搭建Springboot框架 创建工程 定位maven 把镜像改为国内的 其他准备工作 安装Lombok插件 额外添加依赖 如果添加依赖的过程中一直爆红&#xff0c;可以刷新…

SpringBoot异步处理@Async深度解析:从基础到高阶实战

一、异步编程基础概念 1.1 同步 vs 异步 特性同步异步执行方式顺序执行&#xff0c;阻塞调用非阻塞&#xff0c;调用后立即返回线程使用单线程完成所有任务多线程并行处理响应性较差&#xff0c;需等待前任务完成较好&#xff0c;可立即响应新请求复杂度简单直观较复杂&#…

简单的强化学习举例

1&#xff0c;定义奖励函数 首先&#xff0c;需要根据具体的任务需求来定义奖励函数。例如&#xff0c;对于机器人导航任务&#xff0c;可以根据机器人与目标点的距离来定义奖励函数&#xff1a; import numpy as npdef navigation_reward(robot_position, target_position):…

css背景相关

背景书写 background: url(src); // 注意&#xff1a;在写动态样式时&#xff0c;backgournd赋值格式错误&#xff0c;是不会在浏览器dom的style上显示的 // 但是可以创建不可见的img&#xff0c;预加载来提高性能背景也会加载图片资源 同img的src一样&#xff0c;background也…

opencascade.js stp vite 调试笔记

Hello, World! | Op enCascade.js cnpm install opencascade.js cnpm install vite-plugin-wasm --save-dev 当你不知道文件写哪的时候trae还是有点用的 ‘’‘ import { defineConfig } from vite; import wasm from vite-plugin-wasm; import rollupWasm from rollup/plug…

线程的一些事(2)

在java中&#xff0c;线程的终止&#xff0c;是一种“软性”操作&#xff0c;必须要对应的线程配合&#xff0c;才能把终止落实下去 然而&#xff0c;系统原生的api其实还提供了&#xff0c;强制终止线程的操作&#xff0c;无论线程执行到哪&#xff0c;都能强行把这个线程干掉…