从0到1实现项目Docker编排部署

在深入讨论 Docker 编排之前,首先让我们了解一下 Docker 技术本身。Docker 是一个开源平台,旨在帮助开发者自动化应用程序的部署、扩展和管理。自 2013 年推出以来,Docker 迅速发展成为现代软件开发和运维领域不可或缺的重要工具。

Docker 采用容器技术,将应用程序及其所有依赖项封装在一起,从而确保它们能够在不同环境中一致地运行。与传统的虚拟化技术(如虚拟机)相比,Docker 的容器更轻量级,启动时间也显著缩短。这一优势使得开发者能够更高效地进行应用程序开发和测试,尤其是在快速迭代和频繁发布的场景中。

随着 DevOps 思潮的兴起,开发与运维之间的界限变得日益模糊,Docker 在这一转变中提供了强有力的技术支持。然而,随着项目规模的扩大和复杂性的增加,Docker 容器的数量也随之增长,这就引发了对 Docker 编排的需求。

Docker 编排(Orchestration)指的是管理和协调多个 Docker 容器的工具和技术,其主要目的是简化容器的部署、扩展和管理流程。通过编排,用户可以更轻松地管理复杂的应用程序架构,确保各个组件能够高效协同工作。

因此,本文将为读者提供一份从零开始部署 Docker 编排项目的实用指南,帮助您掌握这一关键技术,提升应用程序管理的效率和灵活性。

项目准备

在本节中,我们将以 Java 项目为例,假设您已经拥有一个微服务架构的项目。整体项目结构可能会如下所示:

接下来,我们将逐步开始构建 Docker 容器,并按照一系列系统化的步骤来实现这一过程。

核心概念

我们首先将对一些基本概念进行详细解释,包括 Dockerfile、Docker 构建命令以及 docker-compose.yml 文件的基本概念介绍。理解这些概念后,我们将进入实际操作环节,通过实践加深对这些工具的掌握。

Dockerfile

Dockerfile 是一个文本文件,它包含了一系列构建 Docker 镜像所需的指令。这些指令不仅定义了镜像的基础环境,还详细描述了应用程序的安装步骤、所需的依赖关系、配置的环境变量,以及其他必要的设置。例如:

复制代码
# 使用一个基础镜像
FROM maven:3.8.3-openjdk-17 AS builder

# 设置工作目录
WORKDIR /app

# 复制 pom.xml 和源代码
COPY pom.xml .
COPY src ./src

# 构建项目
RUN mvn clean package

# 使用一个轻量级的基础镜像运行应用
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 从构建阶段复制 JAR 文件
COPY --from=builder /app/target/demo-0.0.1-SNAPSHOT.jar ./myapp.jar

# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "myapp.jar"]

接下来,我们需要将这个配置应用到我们的项目中。为了演示的方便,我们使用了自定义的文件名称来启动项目,这样可以更清晰地展示每个步骤的具体过程。当然,你也可以选择使用默认的文件名,这样操作会更加简单直接。无论你选择哪种方式,最终的效果都是一样的。如下图所示:

构建命令

docker build 是构建 Docker 镜像的核心命令,它用于将 Dockerfile 中定义的指令转换为可执行的镜像。在执行这个命令时,你可以使用一系列可选参数,以便更好地定制构建过程。

docker build [OPTIONS] PATH | URL | -

PATH:指定包含 Dockerfile 的上下文路径。通常是当前目录(.)或具体的目录路径。

URL:可以是 Git 仓库的 URL,Docker 会从该地址获取 Dockerfile。

-:表示从标准输入读取 Dockerfile。

常用选项有以下这些:

  • -t, --tag:为镜像指定一个名称和标签。例如:-t myapp:latest。

  • -f, --file:指定 Dockerfile 的路径。

  • --no-cache:在构建时不使用缓存,确保每个步骤都从头开始运行。

  • --target:如果 Dockerfile 中定义了多阶段构建,可以通过这个选项指定要构建的目标阶段。

docker-compose.yml 文件

docker-compose.yml 文件是用于定义和运行多个 Docker 容器的配置文件,它使得管理应用程序的服务、网络和数据卷变得更加简便和高效。通过这个简单的 YAML 文件,你可以在一个统一的配置中描述整个应用的架构,使得容器的启动、停止和管理变得一目了然。在我们的示例程序中,我们包含了 MySQL 服务。

尽管我们本地已经有一个独立的 MySQL 实例,但为了更好地演示如何同时运行多个 Docker 容器,我们选择将 MySQL 作为一个 Docker 容器来启动。此外,值得一提的是,MySQL 已经有官方提供的预构建镜像,这意味着我们无需花费额外的精力去构建和配置数据库,直接使用现成的镜像即可。

现在,让我们开始这一过程吧!

复制代码
version: '3.8'

services:
  app:
    image: ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest  # 替换为你的 Java 应用镜像
    ports:
      - "18080:18080"  # 映射端口
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:13306/agent?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
      SPRING_DATASOURCE_USERNAME: user
      SPRING_DATASOURCE_PASSWORD: password

  db:
    image: mysql:5.7  # 使用 MySQL 5.7
    environment:
      MYSQL_ROOT_PASSWORD: root_password  # 设置 root 用户密码
      MYSQL_DATABASE: agent  # 创建数据库
      MYSQL_USER: user  # 创建新用户
      MYSQL_PASSWORD: password  # 新用户密码
    ports:
      - "13306:13306"  # 映射 MySQL 端口
    volumes:
      - db_data:/var/lib/mysql  # 数据持久化

volumes:
  db_data:  # 定义一个数据卷

你可以通过运行 docker-compose up 命令来启动所有在 docker-compose.yml 文件中定义的服务。

开始构建

假设我们已经将代码项目成功从仓库部署到了服务器上,接下来,我们就可以直接在服务器上进行操作了。如果你还没有安装过 Docker,可以先自行安装,过程并不复杂。

完成安装后,只需进入项目根目录,并执行相应的命令即可开始使用。

docker build -t my-java-app -f demo.dockerfile .

构建过程的具体步骤和流程如图所示:

我们可以耐心等待接下来的步骤完成,因为此时的过程与生产环境已经非常相似。接下来,我们只需将最终构建的镜像推送到我们的私有仓库中,以便进行后续的部署和管理。

镜像仓库

当然,公司的私有仓库地址是必不可少的。在这里,我们以腾讯云的容器镜像服务为例,来展示如何进行镜像的存储和管理。

推送私库

之前我们已经详细讲解过如何创建私有仓库的步骤,因此在此不再赘述。现在,我们可以直接将构建好的镜像推送到仓库中,以便进行后续的使用和管理。

接下来,我们将对我们的镜像进行标签操作,完成标签操作后,我们将镜像推送到私有仓库中,以便于后续的部署和使用。

sudo docker tag my-java-app:latest ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest

sudo docker push ccr.ccs.tencentyun.com/studiousxiaoyu/my-java-app:latest

最后推送成功如下:

容器编排

接下来,我们将使用编排文件来定义和管理所需的服务。为了实现这一目标,我们需要在指定的目录下创建一个名为 docker-compose.yaml 的文件。该文件的内容将与我们之前展示的配置保持一致。

创建完文件后,我们将直接执行启动命令,来验证我们的配置是否正确,并观察各个服务是否能顺利启动。

docker-compose -f spring-ai.yaml up -d

最后看下日志,我们成功启动:

总结

通过本文,我们深入探讨了 Docker 的核心概念及其编排技术的重要性。从 Docker 的轻量级容器架构到其在现代 DevOps 环境中的应用,Docker 不仅提高了开发和部署的效率,还使得多容器管理变得更加高效。我们逐步介绍了 Dockerfile、构建命令及 docker-compose.yml 文件的使用,帮助读者掌握如何构建和管理微服务架构。

在具体操作中,我们以 Java 项目为例,通过实用的示范引导,展示了如何在本地环境中构建和部署 Docker 容器。随着项目规模的扩大,掌握 Docker 编排将显得尤为重要,它不仅简化了容器管理流程,还增强了应用的灵活性和可扩展性。希望本文所提供的指南对你有所帮助。

文章转载自: ++努力的小雨++

原文链接: https://www.cnblogs.com/guoxiaoyu/p/18474742

体验地址: 引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关推荐
ldj202040 分钟前
Docker的docker-compose类比Spring的ApplicationContext
spring·docker
ldj20201 小时前
docker 自定义网桥作用
docker·容器
java叶新东老师1 小时前
k8s常用命令
云原生·容器·kubernetes
土豆丶杨3 小时前
centos 配置docker
docker·eureka·centos
杰哥的狗3 小时前
nacos连接失败,启动失败常见问题
linux·docker
DarkAthena4 小时前
【GaussDB】构建一个GaussDB的Docker镜像
数据库·docker·gaussdb
张火火isgudi7 小时前
CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服务器
服务器·docker·容器
qq_447705319 小时前
宝塔通过docker部署JupyterHub指南【常见错误处理】
运维·docker·容器
tanxiaomi9 小时前
docker 从主机复制文件到容器外进行编辑
运维·docker·容器
hzulwy9 小时前
docker与k8s的容器数据卷
docker·eureka·kubernetes