1. 首页 > Docker教程 > 正文

Docker教程FG014-Docker Compose多容器部署实战

本教程风哥教程参考Docker官方文档,详细介绍Docker Compose的使用方法,包括多容器部署、服务编排、网络配置等。内容包括基础概念、配置文件编写、命令操作、最佳实践以及常见问题解决方案,帮助读者掌握Docker Compose多容器部署的核心技术。

本文档适合Docker容器运维工程师、开发人员以及DevOps工程师阅读,通过学习本教程,您将能够使用Docker Compose高效管理多容器应用。

目录大纲

Part01-基础概念与理论知识

1.1 Docker Compose概述

Docker Compose是Docker官方提供的多容器编排工具,具有以下特点:

  • 定义和运行多容器Docker应用
  • 使用YAML文件配置应用服务
  • 一键启动和停止所有服务
  • 支持服务编排和依赖管理
  • 适合开发、测试和生产环境

Docker Compose是管理多容器应用的重要工具,通过它可以简化多容器应用的部署和管理。

1.2 Compose配置文件

Compose配置文件是一个YAML格式的文件,通常命名为docker-compose.yml。它包含以下主要部分:

  • version:Compose文件版本
  • services:定义应用的服务
  • networks:定义网络配置
  • volumes:定义数据卷配置
  • configs:定义配置文件
  • secrets:定义敏感信息

配置文件是Docker Compose的核心,通过它可以定义整个应用的结构和配置。

Part02-生产环境规划与建议

2.1 多容器架构规划

在生产环境中,建议以下多容器架构规划:

  • 服务拆分:将应用拆分为多个微服务
  • 职责分离:每个服务负责特定的功能
  • 依赖管理:明确服务之间的依赖关系
  • 扩展性:设计可扩展的服务架构
  • 容错性:考虑服务故障的处理机制

更多视频教程www.fgedu.net.cn

2.2 网络与存储配置

网络与存储配置建议:

  • 网络配置:使用自定义网络,实现服务之间的隔离和通信
  • 存储配置:使用数据卷,实现数据持久化
  • 安全配置:配置网络访问控制,保护服务安全
  • 性能配置:优化网络和存储性能

2.3 服务编排策略

服务编排策略建议:

  • 启动顺序:根据依赖关系设置服务启动顺序
  • 健康检查:配置服务健康检查,确保服务正常运行
  • 自动重启:配置服务自动重启,提高服务可靠性
  • 资源限制:设置服务资源限制,避免资源竞争
  • 日志管理:配置日志收集和管理

学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 Compose配置文件编写

Compose配置文件编写示例:

# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:1.24
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - php
    networks:
      - frontend
  
  php:
    image: php:8.2-fpm
    volumes:
      - ./html:/var/www/html
    networks:
      - frontend
      - backend
  
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: SecurePassword123!
      MYSQL_DATABASE: fgedudb
      MYSQL_USER: fgedu
      MYSQL_PASSWORD: SecurePassword123!
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - backend
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3

networks:
  frontend:
  backend:

volumes:
  mysql-data:

3.2 服务部署与管理

服务部署与管理的基本命令:

# 启动服务
$ docker-compose up -d

# 查看服务状态
$ docker-compose ps

# 查看服务日志
$ docker-compose logs
$ docker-compose logs web

# 停止服务
$ docker-compose down

# 重启服务
$ docker-compose restart

# 进入容器
$ docker-compose exec web bash

3.3 服务扩展与更新

服务扩展与更新的基本命令:

# 扩展服务
$ docker-compose up -d --scale web=3

# 更新服务
$ docker-compose up -d --build

# 查看服务状态
$ docker-compose ps

# 滚动更新
$ docker-compose up -d --no-recreate

Part04-生产案例与实战讲解

4.1 简单Web应用部署

案例:部署一个简单的Nginx+PHP+MySQL应用

# 创建项目目录
$ mkdir -p /Docker/fgdata/webapp/{html,conf}

# 创建docker-compose.yml
$ cat > /Docker/fgdata/webapp/docker-compose.yml << 'EOF'
version: '3.8'

services:
  web:
    image: nginx:1.24
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./conf/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - php
    networks:
      - frontend
  
  php:
    image: php:8.2-fpm
    volumes:
      - ./html:/var/www/html
    networks:
      - frontend
      - backend
  
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: SecurePassword123!
      MYSQL_DATABASE: fgedudb
      MYSQL_USER: fgedu
      MYSQL_PASSWORD: SecurePassword123!
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - backend

networks:
  frontend:
  backend:

volumes:
  mysql-data:
EOF

# 创建nginx.conf
$ cat > /Docker/fgdata/webapp/conf/nginx.conf << 'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    sendfile on;
    keepalive_timeout 65;
    
    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
        index index.php index.html;
        
        location / {
            try_files $uri $uri/ =404;
        }
        
        location ~ \.php$ {
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}
EOF

# 创建index.php
$ cat > /Docker/fgdata/webapp/html/index.php << 'EOF'
connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 创建表
$sql = "CREATE TABLE IF NOT EXISTS fgedu_users (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(50) NOT NULL)";
if ($conn->query($sql) === TRUE) {
    echo "表创建成功
"; } else { echo "创建表错误: " . $conn->error . "
"; } // 插入数据 $sql = "INSERT INTO fgedu_users (name, email) VALUES ('fgedu01', 'fgedu01@fgedu.net.cn'), ('fgedu02', 'fgedu02@fgedu.net.cn')"; if ($conn->query($sql) === TRUE) { echo "数据插入成功
"; } else { echo "插入数据错误: " . $conn->error . "
"; } // 查询数据 $sql = "SELECT id, name, email FROM fgedu_users"; $result = $conn->query($sql); echo "

用户列表

"; echo ""; echo ""; if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo ""; } } else { echo ""; } echo "
ID姓名邮箱
" . $row["id"]. "" . $row["name"]. "" . $row["email"]. "
没有数据
"; $conn->close(); ?> EOF # 启动服务 $ cd /Docker/fgdata/webapp && docker-compose up -d Creating network "webapp_frontend" with the default driver Creating network "webapp_backend" with the default driver Creating volume "webapp_mysql-data" with default driver Creating webapp_php_1 ... done Creating webapp_mysql_1 ... done Creating webapp_web_1 ... done # 查看服务状态 $ docker-compose ps Name Command State Ports webapp_mysql_1 docker-entrypoint.s… Up 3306/tcp, 33060/tcp webapp_php_1 docker-php-entrypoi… Up 9000/tcp webapp_web_1 /docker-entrypoint.… Up 0.0.0.0:8080->80/tcp

风哥提示:使用Docker Compose可以快速部署多容器应用,简化了应用的管理和维护。

4.2 复杂多容器应用部署

案例:部署一个包含前端、后端、数据库和缓存的复杂应用

# 创建docker-compose.yml
$ cat > /Docker/fgdata/complex-app/docker-compose.yml << 'EOF'
version: '3.8'

services:
  frontend:
    image: nginx:1.24
    ports:
      - "80:80"
    volumes:
      - ./frontend:/usr/share/nginx/html
      - ./conf/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - backend
    networks:
      - frontend
  
  backend:
    image: node:18
    working_dir: /app
    volumes:
      - ./backend:/app
    command: npm start
    depends_on:
      - mysql
      - redis
    networks:
      - frontend
      - backend
  
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: SecurePassword123!
      MYSQL_DATABASE: fgedudb
      MYSQL_USER: fgedu
      MYSQL_PASSWORD: SecurePassword123!
    volumes:
      - mysql-data:/var/lib/mysql
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - backend
  
  redis:
    image: redis:7.0
    command: redis-server --requirepass SecurePassword123!
    volumes:
      - redis-data:/data
    networks:
      - backend

networks:
  frontend:
  backend:

volumes:
  mysql-data:
  redis-data:
EOF

# 启动服务
$ cd /Docker/fgdata/complex-app && docker-compose up -d

Creating network "complex-app_frontend" with the default driver
Creating network "complex-app_backend" with the default driver
Creating volume "complex-app_mysql-data" with default driver
Creating volume "complex-app_redis-data" with default driver
Creating complex-app_mysql_1 ... done
Creating complex-app_redis_1 ... done
Creating complex-app_backend_1 ... done
Creating complex-app_frontend_1 ... done

学习交流加群风哥QQ113257174

4.3 服务扩展与更新实战

案例:扩展和更新服务

# 扩展后端服务
$ cd /Docker/fgdata/complex-app && docker-compose up -d --scale backend=3

Creating complex-app_backend_2 ... done
Creating complex-app_backend_3 ... done

# 查看服务状态
$ docker-compose ps

Name                    Command              State          Ports
complex-app_frontend_1   /docker-entrypoint.…   Up      0.0.0.0:80->80/tcp
complex-app_backend_1    npm start              Up      3000/tcp
complex-app_backend_2    npm start              Up      3000/tcp
complex-app_backend_3    npm start              Up      3000/tcp
complex-app_mysql_1      docker-entrypoint.s…   Up      3306/tcp, 33060/tcp
complex-app_redis_1      redis-server --requ…   Up      6379/tcp

# 更新前端服务
$ docker-compose up -d --build frontend

Building frontend
Step 1/3 : FROM nginx:1.24
 ---> 1234567890ab
Step 2/3 : COPY ./frontend /usr/share/nginx/html
 ---> Using cache
Step 3/3 : COPY ./conf/nginx.conf /etc/nginx/nginx.conf
 ---> 1234567890cd
Successfully built 1234567890cd
Successfully tagged complex-app_frontend:latest
Recreating complex-app_frontend_1 ... done

更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 最佳实践

  • 使用版本控制管理Compose配置文件
  • 为服务设置合理的命名和标签
  • 使用环境变量管理配置,避免硬编码
  • 配置服务健康检查,确保服务正常运行
  • 使用数据卷实现数据持久化
  • 合理配置网络,实现服务隔离和通信
  • 设置服务资源限制,避免资源竞争
  • 定期备份数据卷,确保数据安全
  • 使用Compose的扩展功能,如profiles和extends
  • 与CI/CD流程集成,实现自动化部署

5.2 常见问题与解决方案

问题 解决方案
服务启动失败 检查服务依赖关系,确保依赖服务正常启动
网络连接问题 检查网络配置,确保服务在同一网络中
数据持久化失败 检查数据卷配置,确保数据卷正确挂载
服务扩展失败 检查服务配置,确保服务支持扩展
更新服务失败 检查镜像版本,确保镜像可用

5.3 性能优化建议

  • 使用轻量级基础镜像,减少容器大小
  • 优化服务启动顺序,减少启动时间
  • 使用缓存机制,提高服务响应速度
  • 合理配置服务资源限制,提高资源利用率
  • 使用负载均衡,分散服务负载
  • 优化网络配置,减少网络延迟
  • 定期清理未使用的资源,释放空间
  • 使用监控工具,及时发现和处理性能问题

from Docker视频:www.itpux.com

通过以上优化措施,可以显著提高Docker Compose多容器部署的效率和质量,为容器化应用提供更好的运行环境。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息