1. 首页 > Docker教程 > 正文

Docker教程FG019-Docker容器编排与自动化部署实战

本教程风哥教程参考Docker官方文档,详细介绍Docker容器编排与自动化部署的方法,包括使用Docker Compose、Docker Swarm以及与CI/CD工具集成等。内容包括基础概念、编排工具、自动化部署流程、最佳实践以及常见问题解决方案,帮助读者掌握Docker容器编排与自动化部署的核心技术。

本文档适合Docker容器运维工程师、DevOps工程师以及开发人员阅读,通过学习本教程,您将能够实现容器的自动化编排和部署,提高开发和运维效率。

目录大纲

Part01-基础概念与理论知识

1.1 容器编排概述

容器编排是指管理容器的生命周期,包括以下方面:

  • 服务部署:将容器部署到集群中
  • 服务扩展:根据需求扩展服务实例
  • 服务发现:自动发现和注册服务
  • 负载均衡:分发服务请求
  • 健康检查:监控服务健康状态
  • 滚动更新:零停机更新服务

容器编排是容器化应用运维的重要组成部分,通过编排可以实现容器的自动化管理。

1.2 自动化部署概述

自动化部署是指通过脚本或工具自动完成应用的部署过程,包括以下方面:

  • 代码构建:编译和构建应用代码
  • 镜像构建:构建Docker镜像
  • 镜像推送:将镜像推送到镜像仓库
  • 服务部署:将服务部署到集群中
  • 测试验证:验证服务是否正常运行
  • 回滚机制:在部署失败时回滚到之前的版本

自动化部署可以提高部署效率,减少人为错误,确保部署的一致性。

Part02-生产环境规划与建议

2.1 编排工具选择

在生产环境中,建议根据实际需求选择合适的编排工具:

  • Docker Compose:适合单机多容器部署,开发和测试环境
  • Docker Swarm:适合小规模集群部署,简单易用
  • Kubernetes:适合大规模集群部署,功能强大

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

2.2 自动化部署流程设计

自动化部署流程设计建议:

  • 代码提交:开发人员提交代码到版本控制系统
  • 持续集成:自动构建和测试代码
  • 镜像构建:构建Docker镜像
  • 镜像推送:将镜像推送到镜像仓库
  • 持续部署:将服务部署到生产环境
  • 监控验证:监控服务运行状态

2.3 CI/CD集成策略

CI/CD集成策略建议:

  • 使用Jenkins、GitLab CI、GitHub Actions等CI/CD工具
  • 配置自动化构建和部署流程
  • 设置构建和部署触发条件
  • 实施代码质量检查和安全扫描
  • 配置部署环境(开发、测试、生产)
  • 建立部署审批机制,确保生产环境部署安全

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

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

3.1 Docker Compose编排

Docker Compose编排的基本配置:

# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:1.24
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - api
  
  api:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: SecurePassword123!
      MYSQL_DATABASE: fgedudb
      MYSQL_USER: fgedu
      MYSQL_PASSWORD: SecurePassword123!
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

3.2 Docker Swarm编排

Docker Swarm编排的基本配置:

# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:1.24
    ports:
      - "80:80"
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == worker]
  
  api:
    image: myapp/api:latest
    ports:
      - "3000:3000"
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == worker]
  
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: SecurePassword123!
      MYSQL_DATABASE: fgedudb
      MYSQL_USER: fgedu
      MYSQL_PASSWORD: SecurePassword123!
    volumes:
      - mysql-data:/var/lib/mysql
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == worker]

volumes:
  mysql-data:

3.3 CI/CD集成

CI/CD集成的基本配置:

# .gitlab-ci.yml
stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - docker build -t myapp/api:latest .
    - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
    - docker push myapp/api:latest

test:
  stage: test
  script:
    - docker run --rm myapp/api:latest npm test

deploy:
  stage: deploy
  script:
    - docker stack deploy -c docker-compose.yml myapp
  environment:
    name: production
  only:
    - master

Part04-生产案例与实战讲解

4.1 Docker Compose自动化部署实战

案例:使用Docker Compose自动化部署Web应用

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

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

services:
  web:
    image: nginx:1.24
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - api
  
  api:
    build: ./api
    ports:
      - "3000:3000"
    depends_on:
      - db
  
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: SecurePassword123!
      MYSQL_DATABASE: fgedudb
      MYSQL_USER: fgedu
      MYSQL_PASSWORD: SecurePassword123!
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:
EOF

# 创建API应用
$ cat > /Docker/fgdata/webapp/api/Dockerfile << 'EOF'
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
EOF

$ cat > /Docker/fgdata/webapp/api/package.json << 'EOF'
{
  "name": "api",
  "version": "1.0.0",
  "description": "API service",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.18.2",
    "mysql": "^2.18.1"
  }
}
EOF

$ cat > /Docker/fgdata/webapp/api/index.js << 'EOF'
const express = require('express');
const mysql = require('mysql');

const app = express();
const port = 3000;

const connection = mysql.createConnection({
  host: 'db',
  user: 'fgedu',
  password: 'SecurePassword123!',
  database: 'fgedudb'
});

connection.connect((err) => {
  if (err) {
    console.error('Error connecting to MySQL:', err);
    return;
  }
  console.log('Connected to MySQL');
  
  // Create table if not exists
  const createTableQuery = `
    CREATE TABLE IF NOT EXISTS fgedu_users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(50) NOT NULL,
      email VARCHAR(50) NOT NULL
    )
  `;
  
  connection.query(createTableQuery, (err, result) => {
    if (err) {
      console.error('Error creating table:', err);
      return;
    }
    console.log('Table created or already exists');
    
    // Insert test data
    const insertDataQuery = `
      INSERT IGNORE INTO fgedu_users (name, email) VALUES
      ('fgedu01', 'fgedu01@fgedu.net.cn'),
      ('fgedu02', 'fgedu02@fgedu.net.cn')
    `;
    
    connection.query(insertDataQuery, (err, result) => {
      if (err) {
        console.error('Error inserting data:', err);
        return;
      }
      console.log('Test data inserted');
    });
  });
});

app.get('/api/users', (req, res) => {
  connection.query('SELECT * FROM fgedu_users', (err, results) => {
    if (err) {
      res.status(500).json({ error: err.message });
      return;
    }
    res.json(results);
  });
});

app.listen(port, () => {
  console.log(`API server running on port ${port}`);
});
EOF

# 创建前端页面
$ cat > /Docker/fgdata/webapp/html/index.html << 'EOF'

    

User List

    EOF # 创建nginx.conf $ cat > /Docker/fgdata/webapp/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.html; location / { try_files $uri $uri/ =404; } location /api/ { proxy_pass http://api:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } } EOF # 启动服务 $ cd /Docker/fgdata/webapp && docker-compose up -d Creating network "webapp_default" with the default driver Creating volume "webapp_mysql-data" with default driver Building api Step 1/6 : FROM node:18-alpine ---> 1234567890ab Step 2/6 : WORKDIR /app ---> Running in 1234567890cd ---> 1234567890ef Step 3/6 : COPY package*.json ./ ---> 1234567890gh Step 4/6 : RUN npm install ---> Running in 1234567890ij npm WARN deprecated mysql@2.18.1: This package is deprecated... added 53 packages, and audited 54 packages in 5s ---> 1234567890kl Step 5/6 : COPY . . ---> 1234567890mn Step 6/6 : CMD ["npm", "start"] ---> Running in 1234567890op ---> 1234567890qr Successfully built 1234567890qr Successfully tagged webapp_api:latest Creating webapp_db_1 ... done Creating webapp_api_1 ... done Creating webapp_web_1 ... done

    风哥提示:使用Docker Compose可以快速部署多容器应用,适合开发和测试环境。

    4.2 Docker Swarm自动化部署实战

    案例:使用Docker Swarm自动化部署Web应用

    # 初始化Swarm集群
    $ docker swarm init --advertise-addr 192.168.1.100
    
    # 创建docker-compose.yml
    $ cat > docker-compose.yml << 'EOF'
    version: '3.8'
    
    services:
      web:
        image: nginx:1.24
        ports:
          - "80:80"
        deploy:
          replicas: 3
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == worker]
        volumes:
          - ./html:/usr/share/nginx/html
          - ./nginx.conf:/etc/nginx/nginx.conf
      
      api:
        image: myapp/api:latest
        ports:
          - "3000:3000"
        deploy:
          replicas: 2
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == worker]
      
      db:
        image: mysql:8.0
        environment:
          MYSQL_ROOT_PASSWORD: SecurePassword123!
          MYSQL_DATABASE: fgedudb
          MYSQL_USER: fgedu
          MYSQL_PASSWORD: SecurePassword123!
        volumes:
          - mysql-data:/var/lib/mysql
        deploy:
          replicas: 1
          restart_policy:
            condition: on-failure
          placement:
            constraints: [node.role == worker]
    
    volumes:
      mysql-data:
    EOF
    
    # 部署服务
    $ docker stack deploy -c docker-compose.yml myapp
    
    Creating network myapp_default
    Creating service myapp_web
    Creating service myapp_api
    Creating service myapp_db
    
    # 查看服务状态
    $ docker stack services myapp
    
    ID             NAME        MODE         REPLICAS   IMAGE          PORTS
    1234567890ab   myapp_web   replicated   3/3        nginx:1.24     *:80->80/tcp
    1234567890cd   myapp_api   replicated   2/2        myapp/api:latest   *:3000->3000/tcp
    1234567890ef   myapp_db    replicated   1/1        mysql:8.0      *:3306->3306/tcp

    学习交流加群风哥QQ113257174

    4.3 CI/CD集成实战

    案例:使用GitLab CI实现自动化部署

    # 创建.gitlab-ci.yml
    $ cat > .gitlab-ci.yml << 'EOF'
    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      script:
        - docker build -t myapp/api:latest .
        - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
        - docker push myapp/api:latest
    
    test:
      stage: test
      script:
        - docker run --rm myapp/api:latest npm test
    
    deploy:
      stage: deploy
      script:
        - docker stack deploy -c docker-compose.yml myapp
      environment:
        name: production
      only:
        - master
    EOF
    
    # 提交代码
    $ git add .
    $ git commit -m "Add CI/CD configuration"
    $ git push origin master
    
    Enumerating objects: 5, done.
    Counting objects: 100% (5/5), done.
    Delta compression using up to 4 threads
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 350 bytes | 350.00 KiB/s, done.
    Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
    remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
    To gitlab.com:myapp/api.git
       1234567..890abcde  master -> master

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

    Part05-风哥经验总结与分享

    5.1 最佳实践

    • 根据实际需求选择合适的编排工具
    • 使用Docker Compose进行开发和测试环境部署
    • 使用Docker Swarm或Kubernetes进行生产环境部署
    • 配置自动化构建和部署流程
    • 实施代码质量检查和安全扫描
    • 设置部署环境(开发、测试、生产)
    • 建立部署审批机制,确保生产环境部署安全
    • 实施监控和告警,及时发现和处理问题
    • 建立回滚机制,在部署失败时快速回滚
    • 定期备份数据,确保数据安全

    5.2 常见问题与解决方案

    问题 解决方案
    部署失败 检查容器日志,找出失败原因
    服务不可用 检查网络配置,确保服务可以访问
    镜像构建失败 检查Dockerfile语法,确保依赖正确
    CI/CD集成失败 检查CI/CD配置,确保环境变量正确
    服务扩展失败 检查集群资源,确保有足够的资源

    5.3 性能优化建议

    • 使用缓存机制,提高构建速度
    • 优化镜像大小,减少部署时间
    • 使用负载均衡,分散服务请求
    • 配置服务资源限制,避免资源竞争
    • 使用健康检查,及时发现服务异常
    • 实施滚动更新,避免服务中断
    • 使用监控工具,及时发现和处理性能问题
    • 优化网络配置,减少网络延迟

    from Docker视频:www.itpux.com

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

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

    联系我们

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

    微信号:itpux-com

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