Skip to content

17 Docker 服务编排

服务编排概念

  • 服务编排是一种按照特定业务规则来集中管理容器的方法。在微服务架构中,应用系统通常包含多个微服务,而每个微服务可能有多个部署实例。

  • 微服务架构中的挑战

    • 微服务架构中,通常存在多个微服务,每个微服务可能需要部署多个实例。
    • 手动管理每个微服务实例的启动、停止和维护工作量大。
  • 服务编排的解决方案

    • 通过服务编排,可以批量管理这些容器,简化了手动操作的复杂性。
  • 服务编排所需的任务

    • 构建镜像:需要编写 Dockerfile 并使用 Docker 命令构建镜像,或者从 Docker Hub 拉取现有镜像。
    • 创建多个容器:需要根据业务规则创建多个容器,每个容器对应一个微服务实例。
    • 容器的生命周期管理:需要对这些容器执行启动、停止、删除等操作,以满足动态需求和业务规则。

Docker Compose 概述

  • Docker Compose 是一个用于编排多容器分布式部署的工具。
  • 它提供一组命令,用于管理容器化应用的完整开发周期,包括服务的构建、启动和停止。
  • 使用步骤:
    • 利用 Dockerfile 定义运行环境镜像。
    • 使用 docker-compose.yml 定义组成应用的各个服务。
    • 运行 docker-compose up 启动整个应用。
yaml
# docker-compose.yml
version: "3"

services:
  webapp:
    build:
      context: .
      dockerfile: Dockerfile.webapp
    ports:
      - "8080:80"

  database:
    image: postgres:latest
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword

安装 Docker Compose

Compose plugin

Linuxbrew

Homebrew — The Missing Package Manager for macOS (or Linux)

bash
# Linuxbrew
brew install docker-compose docker-completion

Windows Scoop

Scoop - A command-line installer for Windows

bash
# windows
scoop install main/docker-compose

Compose standalone

yaml
# linux Compose standalone
curl -SL https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# Windows Server
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Start-BitsTransfer -Source "https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-windows-x86_64.exe" -Destination $Env:ProgramFiles\Docker\docker-compose.exe

安装校验

bash
 docker-compose version
Docker Compose version v2.23.3

卸载 Docker Compose

Uninstall Docker Compose | Docker Docs

bash
# Linuxbrew
brew uninstall docker-compose docker-completion

# windows
scoop uninstall docker-compose

# 查看 Compose standalone 安装位置
docker info --format '{{range .ClientInfo.Plugins}}{{if eq .Name "compose"}}{{.Path}}{{end}}{{end}}'
# 卸载 docker-compose
sudo rm /usr/local/bin/docker-compose -f

使用 docker compose 编排 nginx+springboot 项目

定义两个服务:一个用于 Nginx 作为反向代理服务器,另一个用于 Spring Boot 应用。

  1. 创建 Spring Boot 应用 Dockerfile (Dockerfile.springboot)

    dockerfile
    # 使用 OpenJDK 11 作为基础镜像
    FROM openjdk:11
    
    # 设置工作目录
    WORKDIR /app
    
    # 复制构建好的 Spring Boot JAR 文件到容器
    COPY target/springboot-hello-0.0.1-SNAPSHOT.jar /app/app.jar
    
    # 暴露应用运行的端口
    EXPOSE 8080
    
    # 定义启动命令
    CMD ["java", "-jar", "app.jar"]
  2. 创建 Docker Compose 文件 (docker-compose.yml)

    yaml
    version: "3"
    
    services:
      nginx:
        image: nginx:latest
        ports:
          - "80:80"
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf
        depends_on:
          - springboot
    
      springboot:
        build:
          context: .
          dockerfile: Dockerfile.springboot
        ports:
          - "8080:8080"
  3. 创建 Nginx 配置文件 (nginx.conf)

    ini
    events {}
    
    http {
      server {
        listen 80;
    
        location / {
          proxy_pass http://springboot:8080;
          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;
        }
    
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
          root /usr/share/nginx/html;
        }
      }
    }
  4. 查看项目结构。

    bash
     tree
    ├── Dockerfile.springboot
    ├── docker-compose.yml
    ├── nginx.conf
    └── target
        └── springboot-hello-0.0.1-SNAPSHOT.jar
  5. 构建和运行。

    bash
     docker-compose up -d --build
  6. 测试访问。

    bash
     curl localhost/hello