【Docker从入门到进阶】05. 实战案例

5. 实战案例

在本章节中,我们将探讨利用Docker技术在实际项目开发和部署中的应用。Docker化是一种将应用程序和其依赖打包进容器的过程,这使得应用更易于分发、管理和运行。

实际项目的 Docker 化

Web 应用程序 Docker 化

Web 应用程序 Docker 化
概述

使用 Docker 将 Web 应用程序容器化,使应用的各个组成部分(服务器、代码、配置、依赖等)变得易于管理。通过容器化,可以简化应用的部署过程,在不同环境中实现一致性,并快速扩展和恢复服务。

流程
  1. Dockerfile 创建

    为 Web 应用编写 Dockerfile 是容器化的第一步,确保应用环境一致。

    dockerfile 复制代码
    # 基础镜像选择
    FROM node:14
    
    # 创建工作目录
    WORKDIR /usr/src/app
    
    # 复制 package.json 和 package-lock.json (如果有)
    COPY package*.json ./
    
    # 安装应用依赖
    RUN npm install
    
    # 如果你正在生产环境构建时,可以使用下面的命令:RUN npm ci --only=production
    
    # 复制应用代码
    COPY . .
    
    # 暴露应用运行端口
    EXPOSE 8080
    
    # 启动应用
    CMD ["node", "server.js"]
    • 基础镜像:选择合适的基础镜像,这里我们用的是 Node.js 官方镜像。
    • 工作目录:设置工作目录来保证容器内文件执行环境的稳定。
    • 安装依赖 :先复制 package.json 文件,再安装依赖,以优化缓存利用。
    • 复制应用代码:将本地代码复制到容器中。
    • 端口暴露:为外部访问指定容器内部服务的端口,比如 Node.js 应用默认端口。
    • 启动命令:定义启动的默认命令。
  2. 镜像构建

    使用 Docker CLI 构建你的应用镜像。

    bash 复制代码
    docker build -t my-web-app .
    • 设置标签 -t 为镜像命名。
    • 最后一个参数 . 指向当前目录为构建上下文。
  3. 容器运行

    一旦镜像创建成功,可以使用它来启动容器。

    bash 复制代码
    docker run -d -p 80:8080 --name my-running-app my-web-app
    • -d:以分离模式运行容器,后台执行。
    • -p 80:8080:将容器的端口 8080 映射至主机的端口 80。
    • --name my-running-app:为容器命名便于管理。
  4. 配置管理和环境变量

    使用环境变量配置应用有助于环境的适配,可以在 docker run 时通过 -e 参数传递环境变量。

    bash 复制代码
    docker run -d -p 80:8080 --name my-running-app -e NODE_ENV=production my-web-app
    • 环境变量管理:通过在启动时传递参数,便于迁移环境变更。
    • 外部配置:使用配置文件时,可以考虑使用 Docker Volumes,确保配置外部化。
高级实践
  • 多阶段构建:在 Dockerfile 中可以配置多阶段构建,以使用特定环境进行构建和生产环境运行。

  • 日志管理:考虑将应用日志配置为输出到标准输出(stdout)和标准错误(stderr),便于集中管理和分析,或者使用容器的日志驱动如 JSON、Syslog 等。

  • 安全与合规

    • 使用安全镜像,并定期进行更新和漏洞扫描。
    • 降低容器权限,避免直接使用 root 用户。
  • 监控和自动伸缩

    • 使用工具如 Prometheus、Grafana 进行资源监控。
    • 借助 Docker Swarm 或 Kubernetes,以实现负载均衡和自动扩展。

通过这些步骤和实践,一个 Web 应用可以在各个开发环境以及生产环境中快速地进行部署,提高工作效率和应用稳定性。

微服务架构应用 Docker 化详解

在微服务架构中,将单体应用拆分为多个功能独立、解耦良好的服务,每个微服务专注于特定业务能力。这种方法既可以提高系统整体的灵活性和可靠性,又可以独立地扩展不同的服务来提升性能。

流程详解
  1. 服务拆分:

    • 分拆分析

      • 识别应用中的独立模块和组件,明确每个模块的功能、接口及数据流。
      • 注意业务边界,尽量保持单一职责原则,确保每个微服务专注于独特的业务功能。
    • 为每个服务编写 Dockerfile

      • 为每个微服务创建一个单独的代码仓库及其自身的 Dockerfile。
      • 保证独立性:每个 Dockerfile 应严格配置其依赖,不与其他微服务共享宿主机环境。
    dockerfile 复制代码
    # Sample Dockerfile for a Node.js microservice
    FROM node:14
    WORKDIR /usr/src/app
    COPY package*.json ./
    RUN npm install
    COPY . .
    EXPOSE 8080
    CMD ["node", "server.js"]
  2. 容器编排工具:

    • Kubernetes(K8s):

      • 适合在生产环境中管理大量容器实例,提供强大的自动化恢复、扩展和滚动更新机制。
      • 能够在节点故障时自动调度容器到健康节点上。
      yaml 复制代码
      # Sample Kubernetes Deployment configuration
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-microservice
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: my-microservice
        template:
          metadata:
            labels:
              app: my-microservice
          spec:
            containers:
            - name: my-microservice-container
              image: my-microservice-image:1.0
              ports:
                - containerPort: 8080
    • Docker Compose

      • 适合在开发与测试环境中使用,提供了简单的命令行界面来管理多个容器的启动、停止和网络连接。
      yaml 复制代码
      # Sample Docker Compose file
      version: '3'
      services:
        web:
          build:
            context: .
            dockerfile: Dockerfile
          ports:
            - "8080:8080"
          depends_on:
            - db
        db:
          image: postgres:latest
          environment:
            POSTGRES_USER: user
            POSTGRES_PASSWORD: password
  3. 服务通信和依赖管理:

    • 服务发现与负载均衡

      • 使用 Consul、Eureka 或内置的 Kubernetes 服务发现机制,使各微服务能够自动发现并通信。
      • Kubernetes 内部通过 Service 资源管理负载均衡,确保各服务实例流量均衡分布。
    • 网络策略与安全

      • 使用 Kubernetes NetworkPolicy 或类似工具定义跨服务通信的规则和限制,避免未经授权的访问。
      • 定义健康检查(liveness 和 readiness probe)提升服务可靠性。
    • 依赖管理

      • 使用环境变量、配置文件或者配置管理工具(如 Spring Cloud Config)管理微服务的配置。
      • 集成 API 网关用于统一入口、鉴权、路由及相应聚合。
实践应用
  • API 网关

    • 通过 Kong、Traefik 或 Envoy 等 API 网关处理请求路由、负载均衡及安全认证。
  • 日志与监控

    • 集成 Elastic Stack, Prometheus, Grafana 等工具,监控微服务性能指标,并统一收集、分析容器日志。
  • CICD 自动化

    • 在 CI/CD 流水线中将每个微服务单独构建、测试并部署到容器环境。

通过以上流程,可以实现对复杂应用系统的解耦,将各个微服务转化为轻量的 Docker 容器进行部署和管理,提升系统的部署敏捷性、资源利用率和故障恢复能力。

数据库服务的容器化
设置和管理 MySQL/PostgreSQL 数据库容器

容器化数据库服务是现代应用部署的常见需求。通过 Docker 来运行 MySQL 或 PostgreSQL,可以提高环境的一致性,简化管理和迁移,同时方便进行版本控制和数据备份。

实践步骤

1.拉取数据库镜像

  • MySQL

    bash 复制代码
    docker pull mysql:latest
    • mysql:latest 表示拉取最新版本的 MySQL 镜像。
    • 可以根据需要选择特定版本来保证一致性,如 mysql:8.0.
  • PostgreSQL

    bash 复制代码
    docker pull postgres:latest
    • 同样,可选择特定的版本以适配项目需求,而非直接使用最新版本。

2.数据持久化配置

要确保数据库的数据能够在容器重启或删除后得以保存,使用数据卷(Docker Volume)来持久化存储数据:

  • MySQL

    bash 复制代码
    docker run -d \
      --name mysql-container \
      -e MYSQL_ROOT_PASSWORD=rootpassword \
      -v mysql-data:/var/lib/mysql \
      mysql:latest
  • PostgreSQL

    bash 复制代码
    docker run -d \
      --name postgres-container \
      -e POSTGRES_PASSWORD=pgpassword \
      -v postgres-data:/var/lib/postgresql/data \
      postgres:latest

在命令中,-v <volume-name>:<container-path> 用来将主机存储目录映射到容器中的数据目录,以实现数据持久化。

3.用户和权限设置

  • MySQL

    • 设置环境变量以初始化数据库设置:
      • MYSQL_DATABASE: 创建默认的数据库。
      • MYSQL_USERMYSQL_PASSWORD: 创建一个新的非 root 数据库用户。
    bash 复制代码
    docker run -d \
      --name mysql-container \
      -e MYSQL_ROOT_PASSWORD=rootpassword \
      -e MYSQL_DATABASE=mydatabase \
      -e MYSQL_USER=myuser \
      -e MYSQL_PASSWORD=mypassword \
      -v mysql-data:/var/lib/mysql \
      mysql:latest
  • PostgreSQL

    • 通过环境变量配置初始用户和数据库:
      • POSTGRES_DB: 初始化时创建的默认数据库。
      • POSTGRES_USERPOSTGRES_PASSWORD: 管理这个数据库的用户名和密码。
    bash 复制代码
    docker run -d \
      --name postgres-container \
      -e POSTGRES_USER=myuser \
      -e POSTGRES_PASSWORD=mypassword \
      -e POSTGRES_DB=mydatabase \
      -v postgres-data:/var/lib/postgresql/data \
      postgres:latest

4.验证和管理

  • 连接和访问 : 通过数据库客户端或命令行工具连接至正在运行的数据库容器。了解端口映射,使用 docker inspect 确认默认端口(MySQL 为 3306,PostgreSQL 为 5432)。

  • 备份和恢复:

    • 使用 mysqldumppg_dump 在主机上运行命令,将数据备份到本地。
    bash 复制代码
    # MySQL 备份
    docker exec mysql-container mysqldump -u myuser -pmypassword mydatabase > backup.sql
    
    # PostgreSQL 备份
    docker exec -t postgres-container pg_dump -U myuser mydatabase > backup.sql
  • 日志查看:

    • 使用 docker logs <container-name> 查看数据库容器的日志信息以便诊断问题。

通过此方式,可以有效地启动、管理和使用 MySQL 和 PostgreSQL,在开发过程中确保数据库的一致性,简化迁移,并提高数据管理的便捷性。请注意关注官方文档,随着版本更新策略上的变动,确保基础镜像的安全性和稳定性。

数据备份与恢复的实践

  • 备份流程

    • 定期使用docker exec和数据库工具(如mysqldump/pg_dump)创建备份。
    • 将备份文件保存在持久的外部存储中。
  • 恢复流程

    • 使用docker exec将备份文件中数据还原到数据库容器中。
    • 确保恢复前关闭事务,防止数据损坏。
相关推荐
努力奋斗的小杨4 分钟前
学习MySQL的第十二天
数据库·笔记·学习·mysql·navicat
天下·第二9 分钟前
【Nginx】负载均衡配置详解
运维·nginx·负载均衡
cherishSpring11 分钟前
在windows使用docker打包springboot项目镜像并上传到阿里云
spring boot·docker·容器
LKAI.16 分钟前
k8s存储动态供给StorageClass
docker·微服务·云原生·容器·kubernetes
苹果酱056732 分钟前
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
java·vue.js·spring boot·mysql·课程设计
GanGuaGua42 分钟前
linux:进程的替换
linux·运维·服务器
你可以叫我仔哥呀1 小时前
k8s学习记录(五):Pod亲和性详解
学习·容器·kubernetes
tcoding1 小时前
《MySQL 技术内幕-innoDB 存储引擎》笔记
数据库·笔记·mysql
梓䈑1 小时前
【Linux系统】详解Linux权限
linux·运维·bash
马武寨山的猴子2 小时前
【MinerU】:一款将PDF转化为机器可读格式的工具——RAG加强(Docker版本)
人工智能·docker·容器·pdf·rag