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    # 指定卷名称
相关推荐
隔窗听雨眠15 小时前
生产级Kubernetes集群部署完全指南:从kubeadm到高可用架构落地
容器·架构·kubernetes
小小洋洋16 小时前
OpenWrt 从U盘迁移到内置 eMMC,并完成扩容与 Docker 安装
java·docker·eureka
Eloudy16 小时前
docker build 与 docker buildx build 的应用场景
docker·构建
瞬间&永恒~16 小时前
【Docker】(三)联合文件系统UnionFS + Overlay2
docker·云原生·容器
数据知道19 小时前
主机入侵检测(HIDS):OSSEC / Wazuh 部署与规则编写
安全·网络安全·docker
逐光老顽童20 小时前
第 5 章:搞懂 K8s Service:从 ClusterIP 到负载均衡
docker·云原生·容器
数智工坊20 小时前
Conda 环境 Docker 标准化迁移完整方案,适配深度学习 GPU 训练
深度学习·docker·conda
花生了什么事o1 天前
Docker 部署 SpringBoot:从镜像构建到服务器运行
服务器·spring boot·docker
Eloudy1 天前
国内加速 docker pull 下载 docker images,特别是 nvidia 的cuda image
docker·gpu·rdma
Chief_fly1 天前
ARM 麒麟系统服务器构建docker镜像
运维·服务器·docker