Docker系列文章
前言
本文将介绍Docker Compose的常用命令和配置文件解析。
一、基础结构
version: "3.8" # 指定 Compose 文件格式版本(最新规范已移除 version 字段)
services: # 定义所有服务(容器)
web: # 服务名称(自定义)
image: nginx:alpine # 使用的镜像
ports:
- "8001:80" # 端口映射
networks: # 定义网络
volumes: # 定义数据卷
二、services 核心字段
2.1 镜像与构建
2.1.1 指定容器使用的镜像
image: redis:6.2-alpine
2.1.2 通过 Dockerfile 构建镜像
build:
context: . # Dockerfile 所在目录
dockerfile: Dockerfile-dev # 指定 Dockerfile 文件名
args: # 构建参数
NODE_ENV: production
2.2 端口与网络
2.2.1 端口映射
ports:
- "8080:80" # TCP
- "3306:3306/tcp" # 显式指定协议
2.2.2 暴露端口
expose:
- "3000"
2.2.3 自定义网络
networks:
- frontend
- backend
2.3 数据卷
2.3.1 挂载数据卷或目录
volumes:
- db_data:/var/lib/mysql # 命名卷
- ./config:/app/config # 绑定挂载
- /etc/localtime:/etc/localtime:ro # 只读挂载
2.4 环境变量
2.4.1 设置环境变量
environment:
MINIO_ROOT_USER: admin
MYSQL_ROOT_PASSWORD: password
TZ: Asia/Shanghai
2.4.2 从文件加载环境变量
env_file:
- .env # 默认读取 .env 文件
- db.env # 自定义文件
2.5 依赖与启动顺序
2.5.1 定义服务依赖
depends_on:
- redis
- mysql
2.5.2 容器重启
restart: always # 可选值:no, always, on-failure, unless-stopped
2.6 资源限制
2.6.1 限制 CPU 和内存
deploy: # 仅在 Swarm 或 Compose v3+ 生效
resources:
limits:
cpus: "0.5"
memory: 512M
reservations:
memory: 256M
三、networks 网络配置
networks:
frontend: # 自定义网络名称
driver: bridge # 驱动类型(bridge, overlay 等)
ipam: # IP 地址管理
config:
- subnet: 172.16.238.0/24
backend:
external: true # 使用外部已存在的网络
四、volumes 数据卷配置
volumes:
db_data: # 命名卷名称
driver: local # 存储驱动
driver_opts:
type: nfs
o: addr=192.168.1.1,rw
五、其他实用字段
5.1 覆盖容器启动命令
command: ["npm", "start"]
5.2 定义健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
5.3 添加元数据
labels:
com.example.description: "Web Server"
六、docker-compose.yml
version: '2.1'
services:
app:
build: ./
container_name: mis-api-test
ports:
- 7700:7700
depends_on:
- mysql
- redis
- mongo
- minio
mysql:
image: mysql:8.0.20
container_name: mis-mysql
ports:
- 7001:3306
environment:
MYSQL_ROOT_PASSWORD: abc123456
volumes:
- /root/finance/mysql-test/data:/var/lib/mysql
- /root/finance/mysql-test/conf:/etc/mysql/conf.d
- /root/finance/mysql-test/logs:/etc/log/mysql
redis:
image: redis:6.0.10
container_name: mis-redis
ports:
- 7002:6379
volumes:
- /root/finance/redis-test/conf:/usr/local/etc/redis
command: redis-server /usr/local/etc/redis/redis.conf
mongo:
image: mongo:4.4.7
container_name: mis-mongo
ports:
- 7003:27017
volumes:
- /root/finance/mongo-test/mongod.conf:/etc/mongo/mongod.conf
- /root/finance/mongo-test/data/db:/data/db
- /root/finance/mongo-test/data/db:/var/log/mongodb
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: abc123456
command: --config /etc/mongo/mongod.conf
minio:
image: bitnami/minio:latest
container_name: mis-minio
ports:
- 7004:9001
- 7005:9000
volumes:
- /root/finance/minio-test/data:/bitnami/minio/data
environment:
- MINIO_ROOT_USER=root
- MINIO_ROOT_PASSWORD=abc123456