DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全

Docker Compose 介绍

官方文档:Docker Compose | Docker Docs

关于Docker-Compose其他功能可以参考官方文档

Docker Compose是一个用于定义和运行多容器的工具。简单的来说就是在一个YAML配置文件(compose.yml)中把整个应用所需的服务、网络、存储等基础设施全部规划

docker compose 优势

简化控制:在一个yml文件中可以定义多个容器服务,简化编排

高效协作:可共享的 YAML 文件支持开发人员和运维人员之间的顺畅协作,从而改善工作流程和问题解决,提高整体效率。

快速应用开发:Compose 会缓存用于创建容器的配置。当您重启一个未更改的服务时,Compose 会重用现有的容器。重用容器意味着您可以快速地对环境进行更改。

跨环境可移植性:Compose 支持在 Compose 文件中使用变量。您可以使用这些变量为不同的环境或不同的用户定制您的 Compose 代码。

Docker Compose 架构

docker compose up


读取 compose.yaml


解析服务定义


创建网络(Network)


创建数据卷(Volume)


拉取镜像(Image)


创建容器(Container)

启动容器

Docker Compose 核心组件

Docker Compose 本身不是一个独立运行的服务,而是基于 Docker Engine 的编排工具

Compose CLI (客户端)

compose cli :即docker compose的一些命令,比如:docker compose up -d

compose 实际是一个工具, 在执行这些命令时compose实际上在调用Docker Engine。

Compose file(配置文件)

配置文件名:compose.yml

就是在这个文件中定义所有所需要的,如:服务、网络、存储、配置、秘钥等

bash 复制代码
services:      # 服务定义(必需)
  web:
    build: .
    ports: ["8080:80"]
    
networks:      # 网络定义(可选)
  frontend:
    
volumes:       # 数据卷定义(可选)
  data:
    
configs:       # 配置文件(可选)
secrets:       # 密钥管理(可选)

Service(服务)

定义:单个容器的配置抽象,对应一个镜像运行时的完整定义

Container(容器)

定义:Compose 管理的实际运行单元,从服务创建而来

Network(网络)

定义:容器间通信的虚拟网络层,提供服务发现和隔离

bash 复制代码
networks:
  frontend:
    driver: bridge              # 默认,单机桥接网络
  backend:
    driver: overlay             # Swarm模式跨主机
  none-driver:
    driver: none                # 无网络

services:
  web:
    networks:
      - frontend
      - backend                 # 容器可同时连接多个网络
    networks:
      default:                  # DNS会自动发现同网络服务
        aliases:
          - webapi              # 自定义DNS别名

Volume(数据卷)

定义:持久化数据存储,独立于容器生命周期

Project(项目

定义:由 Compose 文件定义的完整应用单元,包含所有服务、网络、卷

Docker Compose 安装

独立版安装方法:

下载地址:Releases · docker/compose · GitHub

bash 复制代码
cd /data/app/pats_opts/

mkdir docker-compose &&  cd  docker-compose

curl -SL https://github.com/docker/compose/releases/download/v5.1.2/docker-compose-linux-x86_64 -o /data/app/pats_opts/docker-compose/docker-compose

chmod +x docker-compose

ln -s /data/app/pats_opts/docker-compose/docker-compose    /usr/bin/docker-compose

#查看版本
[root@test-01 docker-compose]# docker-compose version
Docker Compose version v5.1.2

Docker Compose 常用命令

使用docker-compose的关键命令:

启动compose.yml中所有定义的服务

docker compose up :启动所有服务、前台运行

docker compose up -d :启动所有服务、后台运行

停止、启动、移除容器

docker compose stop :只是停止容器,停止后后面可以用start 启动

docker compose start

docker compose restart

docker compose down:停止并移除容器

日志查看

docker compose logs

docker compose logs nginx :指定服务查看指定日志

列出所有服务及当前状态

docker compose ps

验证compose.yml文件格式是否正确

docker compose config

Docker Compose redis cluster 案例

docker-compose 目录结构:

bash 复制代码
redis-cluster
    compose.yml
    data
    redis-node-1.conf
    redis-node-2.conf
    redis-node-3.conf
    redis-node-4.conf
    redis-node-5.conf
    redis-node-6.conf


#redis-cluster文件夹下面有compose.yml 配置文件、data文件夹、6个节点的redis配置文件

compose.yml:

bash 复制代码
services:
  redis-node-1:
    image: redis:latest
    container_name: redis-node-1
    ports:
      - "6371:6379"
      - "16371:16379"  # 集群总线端口
    command: redis-server /etc/redis/redis.conf
    volumes:
      - ./redis-node-1.conf:/etc/redis/redis.conf
      - /data/app/pats_opts/docker-compose/redis-cluster/data/node1:/data
    networks:
      - redis-cluster
    environment:
      - REDIS_NODE=node1

  redis-node-2:
    image: redis:latest
    container_name: redis-node-2
    ports:
      - "6372:6379"
      - "16372:16379"
    command: redis-server /etc/redis/redis.conf
    volumes:
      - ./redis-node-2.conf:/etc/redis/redis.conf
      - /data/app/pats_opts/docker-compose/redis-cluster/data/node2:/data
    networks:
      - redis-cluster
    environment:
      - REDIS_NODE=node2

  redis-node-3:
    image: redis:latest
    container_name: redis-node-3
    ports:
      - "6373:6379"
      - "16373:16379"
    command: redis-server /etc/redis/redis.conf
    volumes:
      - ./redis-node-3.conf:/etc/redis/redis.conf
      - /data/app/pats_opts/docker-compose/redis-cluster/data/node3:/data
    networks:
      - redis-cluster
    environment:
      - REDIS_NODE=node3

  redis-node-4:
    image: redis:latest
    container_name: redis-node-4
    ports:
      - "6374:6379"
      - "16374:16379"
    command: redis-server /etc/redis/redis.conf
    volumes:
      - ./redis-node-4.conf:/etc/redis/redis.conf
      - /data/app/pats_opts/docker-compose/redis-cluster/data/node4:/data
    networks:
      - redis-cluster
    environment:
      - REDIS_NODE=node4

  redis-node-5:
    image: redis:latest
    container_name: redis-node-5
    ports:
      - "6375:6379"
      - "16375:16379"
    command: redis-server /etc/redis/redis.conf
    volumes:
      - ./redis-node-5.conf:/etc/redis/redis.conf
      - /data/app/pats_opts/docker-compose/redis-cluster/data/node5:/data
    networks:
      - redis-cluster
    environment:
      - REDIS_NODE=node5

  redis-node-6:
    image: redis:latest
    container_name: redis-node-6
    ports:
      - "6376:6379"
      - "16376:16379"
    command: redis-server /etc/redis/redis.conf
    volumes:
      - ./redis-node-6.conf:/etc/redis/redis.conf
      - /data/app/pats_opts/docker-compose/redis-cluster/data/node6:/data
    networks:
      - redis-cluster
    environment:
      - REDIS_NODE=node6

  # Redis Cluster 初始化工具
  redis-cluster-init:
    image: redis:latest
    container_name: redis-cluster-init
    depends_on:
      - redis-node-1
      - redis-node-2
      - redis-node-3
      - redis-node-4
      - redis-node-5
      - redis-node-6
    networks:
      - redis-cluster
    command: >
      sh -c "
        echo '等待所有 Redis 节点启动...' && sleep 20 && echo 'yes' | redis-cli --cluster create redis-node-1:6379 redis-node-2:6379 redis-node-3:6379 redis-node-4:6379 redis-node-5:6379 redis-node-6:6379 --cluster-replicas 1
      "

networks:
  redis-cluster:
    driver: bridge

volumes:
  redis-data-1:
  redis-data-2:
  redis-data-3:
  redis-data-4:
  redis-data-5:
  redis-data-6:

redis-node-1.conf:

bash 复制代码
#node1到node6的配置文件都一样即可

# 基础配置
port 6379
bind 0.0.0.0
protected-mode no

# 集群配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

# 持久化
appendonly yes
appendfilename "appendonly.aof"

# 内存管理
maxmemory 2gb
maxmemory-policy allkeys-lru

# 日志
loglevel notice
logfile ""

# 数据目录
dir /data

docker-compose ps 命令查看redis 6个节点都启动正常

下一批文章将介绍

"DevOps 生态介绍(十一):从代码提交到镜像仓库的完整流水线(附Jenkinsfile)"

相关推荐
云烟成雨TD1 小时前
Spring AI 1.x 系列【59】容器化开发支持:Docker Compose 与 Testcontainers
人工智能·spring·docker
Plastic garden2 小时前
K8s(10)NFS 的动态 PV 创建数据库给k8s的mysql和redis
docker·容器·kubernetes
与海boy2 小时前
docker compose minio
docker·容器·eureka
JimCarter2 小时前
使用Azure Devops Pipeline将Docker应用部署到你的Raspberry Pi上
docker·azure·树莓派·devops·orangepi·香橙派·raspberrypi
武子康3 小时前
调查研究-167 Docker Compose 详解:从单容器到多服务编排的工程化入口
运维·docker·云原生·容器·kubernetes·k8s·docker-compose
worilb3 小时前
Spring Cloud 学习与实践(8):Spring Cloud Gateway 统一入口、路由转发与双重跨域故障演练
学习·spring·spring cloud
旅僧4 小时前
Ubantu docker环境配置(前置)
运维·docker·容器
“码”力全开4 小时前
解耦异构算力:基于 Docker 与边缘计算的 AI 视频管理平台,实现 GB28181/RTSP 统一接入与源码交付深度解析
人工智能·docker·边缘计算