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

相关推荐
lichenyang4532 天前
Docker 学习笔记(五):Docker Compose,用一个 YAML 启动前端、后端和 MongoDB
docker
lichenyang4532 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4532 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4532 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
吃饱了得干活3 天前
Spring Cloud Gateway 微服务网关:路由、断言、过滤器
java·spring cloud
Patrick_Wilson6 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy7 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭7 天前
运行你的第一个Docker容器
后端·docker·容器
宋均浩8 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
程序员老赵8 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程