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)"

相关推荐
VIP_CQCRE3 小时前
给团队搭一个 AI 工作台:Open WebUI 接入 Ace Data Cloud 实战
docker·ai·rag·open webui·ace data cloud
2501_933923256 小时前
SpringCloud组件:Eureka服务注册与发现
java·开发语言·后端·spring cloud·eureka
程序员老赵7 小时前
Docker 部署 Portainer CE:轻松搭建容器管理平台
docker·容器·开源
TTATTC7 小时前
Gmail、Drive、日历共用一套命令:gws 如何在运行时把 Discovery 文档编译成 CLI
docker·开源
大侠归来8 小时前
Docker 部署 Dolibarr:从零开始的完整指南
运维·docker·容器
七月吃橘子8 小时前
WSL2+Docker+Ollama,本地部署大模型实践(Qwen1.8b)
运维·docker·容器
Nontee9 小时前
K3s vs K8s:差的不是功能,是交付方式
云原生·容器·kubernetes
做运维的阿瑞9 小时前
Docker常见故障全方位排查指南
运维·docker·云原生·容器
木子欢儿9 小时前
Zabbix 7.4 Alpine 版 Docker Compose 部署
android·运维·docker·容器·zabbix
朱包林9 小时前
iTerm2终端配置指南
linux·javascript·python·云原生·容器·kubernetes·云计算