Docker Compose容器管理

当容器数量增多后,手动启停、配置、维护每个容器会耗费大量时间且易出错。Docker官方提供的Compose组件,可实现多容器应用的统一编排与管理,大幅提升运维效率。

Compose是用于定义和运行多容器Docker应用程序的工具,核心是通过一个YML格式文件,集中配置应用所需的所有容器服务参数(镜像、端口、挂载、依赖等),后续仅需一条命令,即可完成所有服务的创建、启动、停止、销毁等操作,实现“一键部署多容器应用”。

一、Docker Compose安装(Linux系统)

Compose以二进制文件形式分发,推荐通过官方方式安装,确保版本兼容性(适配Docker 17.06+版本)。

  1. 下载二进制文件:将对应架构的docker-compose文件下载至/usr/local/bin目录(示例为Linux x86_64架构,可替换为最新版本)。

    # 从官方GitHub下载(网络不佳可改用国内镜像) 
    curl -L "https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
    # 国内镜像备选(阿里云),速度更快 
    curl -L "https://mirrors.aliyun.com/docker-toolbox/linux/compose/v2.29.2/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose
    
  2. 添加可执行权限:下载完成后给文件赋予执行权限,否则无法运行命令。

     chmod +x /usr/local/bin/docker-compose
    
  3. 验证安装:执行版本查看命令,确认安装成功。

    docker-compose -v
    

    预期输出示例:docker-compose version v2.29.2, build 3addd8e,若提示“command not found”,需检查文件路径是否正确或重新赋予权限。

  4. 卸载(可选):若需卸载,直接删除二进制文件即可。

     rm -rf /usr/local/bin/docker-compose
    

注:原文中插入的Nginx启动命令与安装无关,已删除,避免干扰流程。

二、docker-compose.yml配置文件

docker-compose.yml是Compose的核心配置文件,采用YAML语法,标准模板需包含version(Compose版本)、services(容器服务)、networks(网络配置)三大部分,其中services和networks是核心必配项,version需与Docker版本兼容(3.x版本适配Docker 17.06+)。

完整配置示例(MySQL、Redis、Tomcat、Nginx环境,统一网络名称为test,密码同步为123456789,修正原文语法错误与参数不一致问题):

version: '3'  # Compose版本,3.x为主流稳定版本
services:
  # MySQL服务配置
  mysql:
    image: mysql:5.7  # 指定镜像及版本,避免使用latest导致版本漂移
    privileged: true  # 赋予容器root权限,解决目录挂载权限不足问题
    ports:
      - "3306:3306"  # 端口映射:宿主机3306端口映射到容器3306端口
    environment:  # 容器环境变量,初始化MySQL配置
      - MYSQL_ROOT_PASSWORD=123456789  # root用户密码,与前文保持一致
      - MYSQL_CHARACTER_SET_SERVER=utf8  # 预设数据库字符集为UTF-8
      - MYSQL_COLLATION_SERVER=utf8_general_ci
    volumes:  # 目录挂载,实现配置持久化与数据同步
      - /root/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf  # 配置文件挂载
      - /root/docker/mysql/data:/var/lib/mysql  # 数据目录挂载,避免容器删除丢失数据
      - ./db:/docker-entrypoint-initdb.d  # 初始化脚本目录(可选,启动时自动执行SQL脚本)
    networks:
      - test  # 加入test网络,与其他服务互通
    restart: always  # 新增:容器异常退出时自动重启,提升可用性
    container_name: mysql-pinter  # 新增:指定容器名称,便于识别和管理

  # Redis服务配置
  redis:
    image: redis:7.0.12  # 指定具体版本,确保与前文配置兼容
    privileged: true
    ports:
      - "6379:6379"  # Redis默认端口映射
    volumes:
      - /root/docker/redis/conf/redis.conf:/etc/redis/redis.conf  # 自定义配置文件挂载
      - /root/docker/redis/data:/data  # 新增:Redis数据持久化目录挂载
    networks:
      - test
    command: redis-server /etc/redis/redis.conf  # 覆盖默认启动命令,加载自定义配置
    restart: always
    container_name: redis-pinter

  # Tomcat服务1(主服务)
  tomcat-pinter-1:
    image: tomcat:8.5
    privileged: true
    ports:
      - "8080:8080"  # Tomcat默认端口映射
    volumes:
      - /root/docker/tomcat/webapps:/usr/local/tomcat/webapps  # 项目目录挂载
      - /root/docker/tomcat/logs:/usr/local/tomcat/logs  # 新增:Tomcat日志挂载,便于排查问题
    networks:
      - test
    depends_on:  # 依赖配置,确保MySQL、Redis启动后再启动Tomcat
      - mysql
      - redis
    restart: always
    container_name: tomcat-pinter-1

  # Tomcat服务2(备用/负载均衡节点)
  tomcat-pinter-2:
    image: tomcat:8.5
    privileged: true
    ports:
      - "8081:8080"  # 宿主机8081端口映射,避免与主服务端口冲突
    volumes:
      - /root/docker/tomcat/webapps:/usr/local/tomcat/webapps  # 与主服务共享项目目录
      - /root/docker/tomcat/logs2:/usr/local/tomcat/logs  # 独立日志目录,避免冲突
    networks:
      - test
    depends_on:
      - mysql
      - redis
    restart: always
    container_name: tomcat-pinter-2

  # Nginx服务(反向代理)
  nginx:
    image: nginx:latest
    privileged: true
    ports:
      - "80:80"  # Nginx默认80端口映射
    volumes:
      - /root/docker/nginx/conf.d:/etc/nginx/conf.d  # 站点配置文件挂载
      - /root/docker/nginx/logs:/var/log/nginx  # 日志目录挂载
      - /root/docker/nginx/html:/usr/share/nginx/html  # 静态文件目录挂载
    networks:
      - test
    depends_on:  # 依赖Tomcat服务,确保后端就绪后启动Nginx
      - tomcat-pinter-1
      - tomcat-pinter-2
    restart: always
    container_name: nginx-pinter

# 网络配置
networks:
  test:  # 自定义桥接网络,所有服务加入此网络,实现内部互通
    driver: bridge  # 网络驱动类型,默认桥接模式
    ipam:  # 可选:配置固定子网和网关,避免IP冲突
      config:
        - subnet: 172.18.0.0/16
          gateway: 172.18.0.1

三、yml文件常用指令详解

YAML语法对缩进敏感(建议用2个空格缩进,禁止用Tab),以下是配置文件中核心指令的详细说明:

  • version:指定Compose文件格式版本,需与Docker版本匹配(3.x版本为当前主流,兼容大部分场景)。
  • services:核心节点,用于定义所有容器服务,每个子节点对应一个容器(如mysql、redis)。
  • networks:定义自定义网络,实现服务间隔离与通信,默认桥接模式,支持自定义子网、网关。
  • image:指定服务使用的镜像名称及版本,格式为“镜像名:版本号”,不指定版本则默认拉取latest(不推荐,易导致版本漂移);若本地无此镜像,Compose会自动从Docker Hub拉取。
  • build:替代image指令,基于本地Dockerfile构建镜像,适用于自定义镜像场景,需配合context和dockerfile指令使用。
  • context:配合build使用,指定Dockerfile所在目录(相对路径或绝对路径,相对路径基于docker-compose.yml文件位置),也可指定Git仓库URL,实现远程构建。
  • dockerfile:配合build使用,指定Dockerfile文件名(默认为Dockerfile,若文件名自定义需显式指定,如dockerfile: Dockerfile-tomcat)。
  • command:覆盖容器启动后默认执行的命令,如Redis通过“command: redis-server /etc/redis/redis.conf”加载自定义配置。
  • depends_on:指定服务依赖关系,确保依赖的服务先启动(仅保证启动顺序,不保证依赖服务完全就绪,如需等待服务可用,需额外配置健康检查)。
  • ports:端口映射,格式为“宿主机端口:容器端口”,支持指定宿主机IP(如“192.168.1.100:8080:8080”),实现外部网络访问容器。
  • volumes:目录/文件挂载,格式为“宿主机路径:容器路径”,实现容器数据与宿主机同步,避免容器删除后数据丢失;也可使用命名卷(如“mysql-data:/var/lib/mysql”),更便于管理。
  • environment:设置容器环境变量,支持键值对格式(如“MYSQL_ROOT_PASSWORD=123456789”),也可通过“env_file: .env”加载外部环境变量文件。
  • privileged:是否赋予容器root权限(true/false),开启后容器拥有宿主机大部分权限,可解决目录挂载权限不足、设备访问等问题。
  • restart:容器重启策略,常用值:always(异常退出后始终自动重启)、on-failure(仅在非0状态退出时重启)、no(默认,不自动重启)、unless-stopped(除非手动停止,否则始终重启)。
  • container_name:指定容器名称,默认由“项目名_服务名_序号”组成,自定义名称便于识别和通过命令操作容器。

四、Docker Compose常用命令

所有命令需在docker-compose.yml文件所在目录执行,若文件名称不是默认的docker-compose.yml,需通过“-f 文件名”指定(如“docker-compose -f docker-compose-prod.yml up -d”)。以下为常用命令整理(按功能分类,可直接复制使用):

# 一、核心操作命令
# 后台启动所有服务(推荐,不阻塞终端)
docker-compose up -d
# 启动指定服务(仅启动mysql和redis,不影响其他服务)
docker-compose up -d mysql redis
# 前台启动服务(输出实时日志,按Ctrl+C停止)
docker-compose up

# 停止服务
# 停止所有服务(容器不删除,仅停止运行)
docker-compose stop
# 停止指定服务
docker-compose stop nginx

# 重启服务
# 重启所有服务
docker-compose restart
# 重启指定服务
docker-compose restart tomcat-pinter-1

# 停止并删除服务
# 停止并删除所有容器、网络(数据卷和镜像不删除)
docker-compose down
# 停止并删除容器、网络、数据卷(谨慎使用,数据卷数据会丢失)
docker-compose down -v
# 停止并删除指定服务
docker-compose down nginx

# 二、状态查看命令
# 查看服务状态
# 查看所有服务状态(运行中、停止等)
docker-compose ps
# 查看指定服务状态
docker-compose ps mysql

# 查看服务日志
# 查看所有服务日志(实时输出,按Ctrl+C停止)
docker-compose logs
# 查看指定服务日志,添加-f参数实时跟踪
docker-compose logs -f nginx
# 查看指定服务最近100行日志
docker-compose logs --tail=100 nginx

# 三、其他实用命令
# 构建镜像(当使用build指令时,构建/重新构建镜像)
docker-compose build
# 强制重新构建(忽略缓存)
docker-compose build --no-cache

# 删除镜像(删除Compose管理的服务对应的镜像)
docker-compose rm -f

# 查看依赖关系(展示服务间的依赖关系)
docker-compose config --services --quiet

五、注意事项

  1. YAML语法严格区分大小写,缩进需统一(建议2个空格),否则会导致配置文件解析失败。
  2. 服务依赖(depends_on)仅保证启动顺序,不保证依赖服务完全就绪(如MySQL启动完成但未初始化完成),生产环境需添加健康检查(healthcheck指令)确保服务可用。
  3. 数据卷挂载时,宿主机路径建议使用绝对路径,避免相对路径导致的解析错误;若权限不足,需开启privileged: true或调整宿主机目录权限。
  4. 镜像版本建议显式指定(如mysql:5.7),避免使用latest版本,防止版本更新导致兼容性问题。
  5. 多环境部署时,可创建多个配置文件(如docker-compose-dev.yml、docker-compose-prod.yml),通过-f参数切换环境。
  6. 停止并删除服务(docker-compose down)不会删除数据卷和镜像,若需清理数据卷,需添加-v参数(谨慎使用,避免数据丢失)。
posted @ 2026-01-26 16:30  向闲而过  阅读(2)  评论(0)    收藏  举报