首页 > 其他分享 >图解Docker Compose 架构设计分析与全攻略:构建、扩展和管理你的容器(第一部分)

图解Docker Compose 架构设计分析与全攻略:构建、扩展和管理你的容器(第一部分)

时间:2024-09-30 15:18:26浏览次数:8  
标签:容器 Compose 服务 架构设计 db 网络 全攻略 Docker

在这里插入图片描述

Docker Compose 是 Docker 官方编排工具,它允许用户通过简洁的 YAML 文件定义多容器的 Docker 应用程序。无论是开发者、系统管理员还是 DevOps 工程师,Docker Compose 都能帮助轻松地管理复杂的服务堆栈。通过本文,将深入了解 Docker Compose 的强大功能和使用场景,探索如何利用它来简化开发、测试和部署流程。无论是初学者还是希望优化现有工作流的高级用户,本文都将为提供实用的指导和技巧。让我们开始这段精彩的 Docker Compose 实战之旅吧!

肖哥弹架构 跟大家“弹弹” 高并发锁, 关注公号回复 ‘mvcc’ 获得手写数据库事务代码

欢迎 点赞,关注,评论。

关注公号Solomon肖哥弹架构获取更多精彩内容

历史热点文章

1、docker-compose 架构设计

在这里插入图片描述

设计说明:

  • 用户: 这是使用 Docker Compose 的用户。
  • Docker Compose CLI: 这是 Docker Compose 的命令行界面,用户通过它来运行命令。
  • docker-compose.yml: Docker Compose 的配置文件,定义了服务、网络、卷等。
  • 服务1、服务2、服务3: 这些是配置文件中定义的服务。
  • Docker Engine: Docker 的后台守护进程,负责管理 Docker 对象。
  • 容器: Docker Engine 创建和管理容器。
  • 网络: Docker Engine 管理网络,使容器可以相互通信。
  • : Docker Engine 管理卷,用于数据持久化。
  • 镜像: Docker Engine 管理镜像,服务基于镜像启动。
    在这里插入图片描述

2、docker-compose 工作流程

在这里插入图片描述

流程说明:
  1. 运行 docker-compose up: 用户在命令行中执行 docker-compose up 命令,开始整个工作流程。
  2. Docker Compose: Docker Compose 工具开始处理。
  3. 解析 docker-compose.yml: Docker Compose 解析位于当前目录的 docker-compose.yml 文件,理解服务、网络和卷的配置。
  4. 构建服务镜像: 根据配置文件中的指令,构建服务所需的 Docker 镜像。
  5. 每个服务: Docker Compose 逐个处理配置文件中定义的每个服务。
  6. 启动容器: 对于每个服务,Docker Compose 启动相应数量的容器实例。
  7. 容器运行中: 容器启动并运行服务。
  8. 服务健康检查: Docker Compose 对每个服务执行健康检查,确保服务正常运行。
  9. 服务健康? : Docker Compose 检查服务是否通过健康检查。
  10. 继续监视: 如果服务健康,Docker Compose 继续监视服务状态。
  11. 报告错误并退出: 如果服务不健康,Docker Compose 报告错误并退出。
  12. 所有服务运行完毕: 所有服务都成功启动并运行后,工作流程结束。

3、docker-compose 功能介绍

3.1. 服务定义

使用 YAML 文件定义多个服务(容器),每个服务可以基于不同的镜像或使用构建指令从 Dockerfile 构建。Docker Compose 允许通过 docker-compose.yml 文件定义服务。以下是定义服务时可以使用的所有主要语法选项

类别选项描述
服务定义基础image使用指定的镜像来启动容器。
build指定一个上下文路径和 Dockerfile 来构建镜像。
context构建镜像时的上下文路径(相对于 Compose 文件的路径)。
dockerfile指定构建镜像的 Dockerfile 名称(在 build 指令下)。
容器运行选项command覆盖容器启动后默认执行的命令。
entrypoint覆盖容器的入口点。
environment设置环境变量。
env_file从文件中读取环境变量。
ports映射端口到宿主机。
volumes挂载卷到容器。
volumes_from挂载其他服务的卷。
links链接到其他服务的容器(不推荐使用,建议使用网络)。
网络和依赖networks指定服务连接的网络。
depends_on定义服务依赖,确保按顺序启动。
存储和卷volumes定义要挂载的卷。
volume_driver指定卷的驱动。
部署和扩展deploy使用 Docker Swarm 部署配置。
replicas设置服务的副本数(Swarm 模式)。
健康检查healthcheck定义健康检查指令。
日志记录logging配置日志记录选项。
资源限制cpusCPU 资源限制。
cpu_sharesCPU 共享权重。
cpu_quotaCPU 配额(在 CPU 周期内运行的时间)。
mem_limit内存限制。
mem_reservation内存软限制。
安全选项security_opt指定容器的安全选项。
构建时变量args构建镜像时传递的变量。
隔离模式isolation设置容器的隔离模式。
扩展extra_hosts添加额外的 host 映射。
容器间通信domainname为容器设置域名。
hostname设置容器的 hostname。
ipc设置 IPC 模式。
mac_address为容器设置 MAC 地址。
shm_size设置 /dev/shm 的大小。
sysctls为 Linux 容器设置内核参数。
卷挂载bind_mounts挂载宿主机的文件或目录到容器内部。
tmpfs在容器内挂载临时文件系统。
容器启动和停止init使用 tini 作为容器的 init 进程。
oom_score_adj设置容器的 OOM(Out Of Memory)分数。
pids_limit限制容器内的 PID 数量。
容器重启策略restart设置容器的重启策略。
容器清理策略stop_signal设置容器停止时发送的信号。
stop_grace_period设置容器停止前的宽限期。
容器状态检查read_only将容器的文件系统设置为只读。
userns_mode设置用户命名空间模式。
构建缓存cache_from构建镜像时使用缓存。
服务更新update_config定义服务更新的配置。
rollback_config定义服务回滚的配置。
服务状态status设置服务的状态(如:inactive)。
服务资源限制cpuset设置容器可以使用的 CPU 核心。
服务隔离级别isolation设置容器的隔离级别。
服务扩展配置placement定义服务在 Swarm 集群中的放置策略。
服务配置选项configs挂载配置到服务容器。
服务网络配置network_mode设置网络模式。
networks连接到一个或多个网络。
服务安全性cap_add添加 Linux 内核能力。
cap_drop移除 Linux 内核能力。
security_opt设置容器的安全性选项。
服务依赖x-*添加自定义服务配置。

以下是完整的 docker-compose.yml 文件:

version: '3.8'  # 指定 docker-compose.yml 文件的版本
services:  # 定义服务列表
  webapp:  # 服务名称,唯一
    image: my-webapp:latest  # 使用指定的镜像来启动容器
    build:  # 指定一个上下文路径和 Dockerfile 来构建镜像
      context: ./dir  # 构建镜像时的上下文路径
      dockerfile: Dockerfile.dev  # 指定构建镜像的 Dockerfile 名称
      args:  # 构建镜像时传递的变量
        - buildno=1
    command: python app.py  # 覆盖容器启动后默认执行的命令
    entrypoint: /code/entrypoint.sh  # 覆盖容器的入口点
    environment:  # 设置环境变量
      - DEBUG=1
    env_file:  # 从文件中读取环境变量
      - env_vars.env
    ports:  # 映射端口到宿主机
      - "5000:5000"
    volumes:  # 挂载卷到容器
      - "/var/www:/var/www"
      - "data_volume:/var/data"
    networks:  # 指定服务连接的网络
      - webnet
    depends_on:  # 定义服务依赖,确保按顺序启动
      - db
    deploy:  # 使用 Docker Swarm 部署配置
      replicas: 3
      resources:  # 定义服务资源限制
        limits:
          cpus: '0.50'
          memory: 50M
    healthcheck:  # 定义健康检查指令
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    logging:  # 配置日志记录选项
      driver: syslog
      options:
        tag: "webapp-{{.Name}}"
    isolation: "hyperv"  # 设置容器的隔离模式
    extra_hosts:  # 添加额外的 host 映射
      - "host1:192.168.1.1"
      - "host2:192.168.1.2"
    domainname: webapp.example.com  # 为容器设置域名
    hostname: webapp  # 设置容器的 hostname
    ipc: "host"  # 设置 IPC 模式
    mac_address: 02:42:ac:11:00:04  # 为容器设置 MAC 地址
    shm_size: '2gb'  # 设置 /dev/shm 的大小
    sysctls:  # 为 Linux 容器设置内核参数
      - net.core.somaxconn=1024
    tmpfs: /run  # 在容器内挂载临时文件系统
    init: true  # 使用 tini 作为容器的 init 进程
    oom_score_adj: 500  # 设置容器的 OOM 分数
    pids_limit: 50  # 限制容器内的 PID 数量
    restart: on-failure:3  # 设置容器的重启策略
    stop_signal: SIGINT  # 设置容器停止时发送的信号
    stop_grace_period: 1m  # 设置容器停止前的宽限期
    read_only: true  # 将容器的文件系统设置为只读
    userns_mode: "host"  # 设置用户命名空间模式
    cache_from:  # 构建镜像时使用缓存
      - my-base-image:latest
    update_config:  # 定义服务更新的配置
      parallelism: 2
      delay: 10s
      failure_action: continue
      order: start-first
    rollback_config:  # 定义服务回滚的配置
      parallelism: 1
      delay: 10s
      failure_action: pause
      order: stop-first
    status: inactive  # 设置服务的状态(如:inactive)
    cpuset: "0,1"  # 设置容器可以使用的 CPU 核心
    placement:  # 定义服务在 Swarm 集群中的放置策略
      constraints: [node.role == manager]
    configs:  # 挂载配置到服务容器
      - myconfig
    network_mode: "host"  # 设置网络模式
    cap_add:
      - ALL  # 添加 Linux 内核能力
    cap_drop:
      - NET_ADMIN  # 移除 Linux 内核能力
    security_opt:  # 设置容器的安全性选项
      - label:user:USER
      - label:role:ROLE

  db:
    image: postgres:latest  # 使用指定的镜像来启动容器
    volumes:  # 定义要挂载的卷
      - db_data:/var/lib/postgresql/data

volumes:  # 定义卷
  data_volume:
  db_data:

networks:  # 定义网络
  webnet:

configs:  # 定义配置
  myconfig:
    file: ./config.txt
    name: my_config
2. 一键启动和停止
  • 通过 docker-compose updocker-compose down 命令,可以一键启动和停止所有服务。
3. 依赖管理

可以定义服务之间的依赖关系,确保服务按照正确的顺序启动和停止。
在这里插入图片描述

图解释:

  • docker-compose.yml: Docker Compose 的配置文件,定义了所有服务、网络和卷。
  • 服务A、服务B、服务C: 这些是配置文件中定义的服务。
  • 网络: 由 Docker Compose 管理的网络,用于连接所有服务,使它们能够互相通信。
  • 依赖: 服务之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,服务B 依赖于 服务C,服务C 依赖于 服务D。
version: '3.8'  # 指定 Docker Compose 文件的版本

services:
  db:
    image: postgres:13  # 使用 PostgreSQL 13 镜像
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: dbname
    volumes:
      - db-data:/var/lib/postgresql/data  # 定义一个卷,并挂载到容器的 PostgreSQL 数据目录

  web:
    image: nginx:alpine  # 使用 Nginx 的 alpine 版本镜像
    depends_on:  # 定义依赖关系
      - db  # Web 服务依赖于 db 服务
    ports:
      - "80:80"  # 将容器的 80 端口映射到宿主机的 80 端口

volumes:
  db-data:  # 定义一个命名卷

networks:
  default:  # 默认网络配置
    driver: bridge  # 使用桥接网络
配置说明
  • db 服务:这是一个数据库服务,使用 postgres:13 镜像。环境变量 POSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DB 用于初始化数据库配置。一个命名卷 db-data 被挂载到容器的 PostgreSQL 数据目录,用于数据持久化。
  • web 服务:这是一个 Web 服务,使用 nginx:alpine 镜像。它定义了对 db 服务的依赖,使用 depends_on 关键字。这意味着在启动 Web 服务之前,Docker Compose 会确保先启动数据库服务。
  • volumes
    • db-data:这是一个命名卷,用于持久化数据库服务的数据。
  • networks
    • default:定义了一个默认的桥接网络,所有服务都会连接到这个网络,从而实现服务间的通信。
如何工作
  1. 启动服务:运行 docker-compose up 命令时,Docker Compose 会根据 depends_on 关键字来决定服务的启动顺序。在这个例子中,db 服务会首先启动。
  2. 服务发现:一旦 db 服务启动,web 服务就可以通过服务名称 db 来访问数据库服务。
  3. 端口映射web 服务的 80 端口被映射到宿主机的 80 端口,使得可以通过宿主机的 IP 地址或域名来访问 Web 应用。
4. 网络管理

在这里插入图片描述

在 Docker Compose 中,网络管理是一个关键特性,它允许不同容器之间相互发现和通信。Docker Compose 提供了强大的网络功能,可以自动配置服务之间的网络,使得容器像在同一个主机上一样轻松通信。

4.1. 默认网络

当运行 Docker Compose 时,它会自动创建一个默认网络,所有服务都会连接到这个网络,除非明确指定了其他网络。默认网络允许服务之间通过服务名称进行通信。

4.2. 自定义网络

除了默认网络,还可以创建自定义网络,以实现更复杂的网络拓扑结构或隔离特定的服务。

创建自定义网络

docker-compose.yml 文件中,定义一个或多个网络:

version: '3.8'  # 指定 Docker Compose 文件的版本

services:
  web:
    image: "nginx:alpine"  # 使用 Nginx 的 Alpine 版本镜像
    ports:
      - "80:80"  # 将容器的 80 端口映射到宿主机的 80 端口
    networks:
      - webnet  # 将 Web 服务连接到 webnet 网络

  db:
    image: "postgres:alpine"  # 使用 PostgreSQL 的 Alpine 版本镜像
    environment:
      POSTGRES_DB: mydatabase  # 设置数据库名
      POSTGRES_USER: user  # 设置数据库用户
      POSTGRES_PASSWORD: password  # 设置数据库密码
    networks:
      - dbnet  # 将 DB 服务连接到 dbnet 网络

networks:
  webnet:  # 定义 webnet 网络
  dbnet:  # 定义 dbnet 网络

此例子中,我们定义了两个网络 webnetdbnetweb 服务连接到了 webnet 网络,而 db 服务连接到了 dbnet 网络。

使用网络

服务可以通过网络名称来发现和访问其他服务。例如,如果 web 服务需要访问 db 服务,它可以通过网络名称来实现:

services:
  web:
    image: "nginx:alpine"
    networks:
      - webnet
      - dbnet
    # Web 服务可以使用 dbnet 网络来访问 db 服务

  db:
    image: "postgres:alpine"
    networks:
      - dbnet

networks:
  webnet:
  dbnet:

在这个修改后的例子中,web 服务同时连接到了 webnetdbnet 网络,因此它可以通过 db 服务的名称来访问数据库。

DATABASE_URL=db:5432/mydatabase

这里的 db 是数据库服务的名称,5432 是 PostgreSQL 的默认端口,mydatabase 是数据库名。

4.3. 网络模式

Docker Compose 支持多种网络模式,包括桥接、宿主机、覆盖和 Macvlan。每种模式都有其特定的用例:

  • 桥接(bridge) :默认模式,创建一个虚拟的网络环境,容器可以通过网络地址相互通信。
  • 宿主机(host) :容器将使用宿主机的网络栈。
  • 覆盖(overlay) :用于跨多个 Docker 守护进程的容器通信,常见于 Docker Swarm 模式。
  • Macvlan:将容器直接连接到物理网络,使容器拥有物理网络上的真实 MAC 地址。
4.4. 网络的动态发现

Docker Compose 允许服务动态发现其他服务,只需通过服务名称即可实现通信。这种发现机制简化了服务间的连接和通信。

4.5. 网络的持久性

定义的网络在 Docker Compose 栈的生命周期内是持久的,即使容器停止或重启,网络依然存在。

其他内容在第二篇文章《图解Docker Compose 架构设计分析与全攻略:构建、扩展和综合案例(第二部分)》中。。。
在这里插入图片描述

原创不易,请给作者打赏,您的支持是我坚持原创和分享的最大动力! 文章有帮助的话,在看,转发吧。

谢谢支持哟 (__

标签:容器,Compose,服务,架构设计,db,网络,全攻略,Docker
From: https://blog.csdn.net/alises1314/article/details/142654241

相关文章

  • Rocky9.2安装docker-docker-compose
    1.更换阿里云源(不换下载很慢)sed-e's|^mirrorlist=|#mirrorlist=|g'-e's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g'-i.bak/etc/yum.repos.d/rocky-*.repodnfmakecache2.更新系统包sud......
  • centos发送邮件教程:从配置到发送全攻略!
    centos发送邮件的方法?Centos配置邮件发送教程指南?无论是系统监控、自动化任务还是用户通知,邮件都是最直接和有效的沟通方式之一。AokSend将详细介绍如何在CentOS系统上配置和发送邮件,帮助你掌握这一关键技能。centos发送邮件:基本配置在开始centos发送邮件之前,首先需要进行......
  • 淘客APP的多租户架构设计与实现
    淘客APP的多租户架构设计与实现大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们要讨论的是淘客APP中的多租户架构设计与实现。在淘客系统中,多租户架构是为了支持多个商户(租户)使用同一个应用实例,但彼此数据隔离,同时能够共享应用资源。接......
  • 【2024精华版】从零开始的大模型LLM学习全攻略:一文掌握从入门到精通
    ChatGPT的出现在全球掀起了AI大模型的浪潮,2023年可以被称为AI元年,AI大模型以一种野蛮的方式,闯入你我的生活之中。从问答对话到辅助编程,从图画解析到自主创作,AI所展现出来的能力,超出了多数人的预料,让不少人惊呼:“未来是属于AI的”。AI大模型——成为互联网从业者必备技能。......
  • 【60天备战2024年11月软考高级系统架构设计师——第25天:分布式系统设计——BASE理论】
    BASE理论与CAP定理相对,主要用于高可用性需求较强的系统中。BASE理论提供了一种在高可用性和最终一致性之间进行权衡的方法。BASE理论的定义BASE理论是对CAP定理中一致性与可用性权衡的一种延展,它更倾向于牺牲强一致性以换取更高的可用性和容错性。BASE代表以下含义:Basica......
  • 《伊苏:塞尔塞塔的树海》遭遇Specialk32.dll缺失?《伊苏:塞尔塞塔的树海》Specialk32.dll
    《伊苏:塞尔塞塔的树海》作为一款深受玩家喜爱的动作角色扮演游戏,如果在游戏过程中遭遇Specialk32.dll缺失的问题,可能会导致游戏无法正常运行。针对这一问题,以下是一份全面的解决方案攻略:一、了解Specialk32.dll文件Specialk32.dll是一个动态链接库文件,它可能是游戏依赖的某......
  • MySQL 性能剖析全攻略
    在使用MySQL数据库的过程中,性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题,我们需要对MySQL进行性能剖析。那么,如何在MySQL中进行性能剖析呢?本文将为你详细介绍。一、为什么要进行性能剖析?MySQL数据库在运行过程中,可能会出现各种性能问题,如查询速度慢......
  • 甄选范文“论分布式存储系统架构设计”,软考高级论文,系统架构设计师论文
    论文真题分布式存储系统(DistributedStorageSystem)通常将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式存储系统采用可扩展的系统结......
  • 甄选范文“论企业应用系统的分层架构风格”,软考高级论文,系统架构设计师论文
    论文真题软件架构用来处理软件高层次结构的设计和实施,它以精心选择的形式将若干结构元素进行装配,从而满足系统的主要功能和性能需求。软件架构设计的首要问题是如何表示软件架构,即如何对软件架构建模。根据建模的侧重点不同,可以将软件架构模型分为结构模型、框架模型、动......
  • 甄选范文“论软件系统架构风格”,软考高级论文,系统架构设计师论文
    论文真题系统架构风格(SystemArchitectureStyle)是描述某一特定应用领域中系统组织方式的惯用模式。架构风格定义了一个词汇表和一组约束,词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起来的。软件系统架构风格反映了领域中众多软件系......