Docker---容器编排工具Docker Compose

Docker Compose核心功能

  • 使用YAML文件定义多容器应用

  • 一键启动/停止/重建整个应用栈

  • 管理服务依赖关系与网络配置

  • 环境变量集中管理,适配多环境部署

  • 核心概念层级

    • Service(服务):一个应用组件,可包含多个相同镜像的容器实例

    • Project(项目):一组关联服务组成的业务单元,由docker-compose.yml定义

    • Container(容器):服务的运行实例,基于镜像创建

YAML文件关键配置项

配置项 说明 示例
image 指定镜像 image: nginx:latest
build 构建镜像 build: {context: ./app, dockerfile: Dockerfile.prod}
ports 端口映射 ports: ["80:80", "443:443"]
expose 内部暴露端口(不映射到主机) expose: ["80"]
environment 环境变量 environment: {MYSQL_ROOT_PASSWORD: lee}
volumes 数据卷挂载 volumes: ["/host/data:/container/data:ro"]
networks 网络连接 networks: [mynet1, mynet2]
command 覆盖默认启动命令 command: ["python","app.py"]
restart 重启策略 restart: always
container_name 指定容器名称 container_name: webserver
network_mode 使用指定网络模式 network_mode: bridge
  • 网络与卷的自定义

    • networks:定义自定义网络驱动、子网、外部网络引用

    • volumes:定义命名卷,支持外部卷引用

常用命令

bash 复制代码
# 启动服务(后台运行)
docker compose up -d

# 指定YAML文件启动
docker compose -f custom.yml up -d

# 启动前重新构建镜像
docker compose up -d --build

# 停止并删除服务、网络、卷
docker compose down

# 启动/停止/重启已存在服务
docker compose start
docker compose stop
docker compose restart

# 查看服务状态
docker compose ps

# 查看服务日志
docker compose logs
docker compose logs -f web      # 跟踪指定服务日志

# 在运行容器中执行命令
docker compose exec web bash

# 拉取服务镜像
docker compose pull

# 验证YAML配置
docker compose config
docker compose config -q        # 静默验证,无输出表示正确

# ===== 构建自定义镜像 =====

# Dockerfile示例
vim Dockerfile
# 内容:
# FROM busybox:latest
# RUN touch /leefile1

# docker-compose.yml示例
vim compose.yml
# 内容:
# version: "3.8"
# services:
#   test1:
#     image: test1
#     build:
#       context: /root/test
#       dockerfile: Dockerfile
#     command: ["/bin/sh","-c","sleep 3000"]
#     restart: always
#     container_name: busybox1

# 构建镜像
docker compose build
docker compose build test1      # 仅构建指定服务

# 启动(自动拉取或构建)
docker compose up -d            # 若镜像不存在会尝试pull
docker compose up -d --build    # 强制先构建再启动

# ===== 企业示例:HAProxy + Nginx负载均衡 =====

# 目录结构
/docker/
├── web/
│   ├── html1/     # web1站点内容
│   └── html2/     # web2站点内容
├── conf/
│   └── haproxy/
│       └── haproxy.cfg
└── docker-compose.yml

# haproxy.cfg示例
vim /docker/conf/haproxy/haproxy.cfg
# 内容:
# global
#   log stdout format raw local0
# defaults
#   mode http
#   timeout connect 5000ms
#   timeout client 50000ms
#   timeout server 50000ms
# frontend http_front
#   bind *:80
#   default_backend http_back
# backend http_back
#   balance roundrobin
#   server web1 web1:80 check
#   server web2 web2:80 check

# docker-compose.yml示例
vim docker-compose.yml
# 内容:
# version: "3.8"
# services:
#   web1:
#     image: nginx:latest
#     container_name: web1
#     restart: always
#     networks: [mynet1]
#     expose: ["80"]
#     volumes: ["/docker/web/html1:/usr/share/nginx/html"]
#   web2:
#     image: nginx:latest
#     container_name: web2
#     restart: always
#     networks: [mynet1]
#     expose: ["80"]
#     volumes: ["/docker/web/html2:/usr/share/nginx/html"]
#   haproxy:
#     image: haproxy:2.3
#     container_name: haproxy
#     restart: always
#     networks: [mynet1, mynet2]
#     volumes: ["/docker/conf/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg"]
#     ports: ["80:80"]
# networks:
#   mynet1:
#     driver: bridge
#   mynet2:
#     driver: bridge

# 启动负载均衡架构
docker compose up -d

# 验证
curl http://<宿主机IP>    # 应轮询返回web1或web2内容

# ===== 高级网络配置示例 =====

vim compose.yml
# 内容:
# services:
#   test:
#     image: busybox
#     container_name: busybox1
#     command: ["/bin/sh","-c","sleep 3000"]
#     restart: always
#     networks:
#       - mynet1
#       - mynet2
# networks:
#   mynet1:
#     driver: bridge
#   mynet2:
#     ipam:
#       driver: default
#       config:
#         - subnet: 172.28.0.0/16
#           gateway: 172.28.0.254
#   default:
#     external: true
#     name: bridge    # 使用外部已有网络

# ===== 数据卷配置示例 =====

vim compose.yml
# 内容:
# services:
#   test:
#     image: busybox
#     container_name: busybox1
#     command: ["/bin/sh","-c","sleep 3000"]
#     restart: always
#     volumes:
#       - data:/test
#       - /etc/passwd:/tmp/passwd:ro
# volumes:
#   data:
#     name: timinglee    # 指定卷名称
相关推荐
lpfasd1232 小时前
MariaDB Docker容器权限配置问题分析与解决方案
数据库·docker·mariadb
姚不倒3 小时前
深入浅出 Kubernetes CRD、Operator 与 CR
云原生·容器·kubernetes
Tattoo_Welkin6 小时前
Docker 入门
运维·docker·容器
有毒的教程7 小时前
Ubuntu 清理 Docker 镜像 / 容器 / 缓存 完整教程
ubuntu·缓存·docker
阿干tkl7 小时前
openEuler 系统 Kubernetes + Harbor 学习测试环境详细部署指南
容器·kubernetes
天草二十六_简村人8 小时前
阿里云SLS采集jvm日志(上)
java·运维·数据库·后端·阿里云·容器·云计算
winfreedoms8 小时前
宿主机有网、Docker 容器不能解析域名?用 daemon.json 一键配置永久 DNS
运维·docker·容器·json
橙露9 小时前
Docker 实战:镜像瘦身、多阶段构建与最佳实践
运维·docker·容器
TT哇9 小时前
【项目】从“本地能跑”到“生产级部署”:Java + Docker 自动化部署深度复盘
java·docker·自动化