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
bash
# Linuxbrew
brew install docker-compose docker-completionWindows Scoop
bash
# windows
scoop install main/docker-composeCompose 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
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 应用。
创建 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"]创建 Docker Compose 文件 (
docker-compose.yml)yamlversion: "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"创建 Nginx 配置文件 (
nginx.conf)inievents {} 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; } } }查看项目结构。
bash❯ tree ├── Dockerfile.springboot ├── docker-compose.yml ├── nginx.conf └── target └── springboot-hello-0.0.1-SNAPSHOT.jar构建和运行。
bash❯ docker-compose up -d --build测试访问。
bash❯ curl localhost/hello