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

相关推荐
Rain的Java大神之路10 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
九皇叔叔11 小时前
Kubernetes 资源管理方式详解:命令式与声明式管理
docker·容器·k8s
需要82614 小时前
MySQL 索引 B+ 树与“查询为什么变慢了
java·spring boot·spring·spring cloud·tomcat
程序猿小郑17 小时前
Docker Compose 构建完整服务实战指南:从入门到最佳实践
docker·容器
需要82618 小时前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
行百里er20 小时前
5 分钟跑起 Redis(Docker 版)
redis·后端·docker
Mr.朱鹏20 小时前
Docker三剑客实战指南:Docker、Dockerfile 和 Docker Compose
python·docker·devops·dockerfile
鬼先生_sir21 小时前
Docker 完整教程
docker
java_logo21 小时前
Docker 一键部署 Jellyfin:快速搭建私有化媒体服务器
docker·私有化部署·jellyfin·硬件加速·媒体服务器·轩辕镜像·影音库
jianpeng的工程笔记1 天前
WeKnora 搭建研发 EDA 知识库:Docker 部署、RAG 与 Wiki 实践
docker·知识库·eda·rag