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    # 指定卷名称
相关推荐
宋均浩3 小时前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
程序员老赵20 小时前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1111 天前
LM Studio Docker 部署——本地大模型一键启动
docker
曲幽2 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
武子康4 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
Alsn867 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
2601_961875247 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj7 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵7 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops
杨浦老苏7 天前
轻量级Docker仪表板Servedash
运维·docker·监控·群晖·仪表板