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