1. 课程引言
在前面的章节中,我们已经完成了电商项目核心服务的开发。然而,开发完成只是项目生命周期的一部分,如何将这些服务高效、可靠地部署到生产环境,是决定项目成败的关键一步。本章将聚焦于服务的部署,重点介绍当前最主流的容器化技术——Docker,并探讨如何使用Docker来打包、分发和运行我们的微服务。
2. 传统部署方式的痛点
在容器化技术普及之前,应用部署通常直接在物理机或虚拟机上进行。这种方式存在诸多痛点:
- 环境不一致:开发、测试、生产环境的配置(如操作系统、依赖库版本)可能存在差异,导致“在我电脑上能跑”的问题频发。
- 资源隔离性差:多个应用在同一台机器上运行时,可能会因资源竞争(CPU、内存)或依赖冲突而相互影响。
- 部署效率低:应用的部署、迁移和扩容过程复杂且耗时,难以适应快速迭代的业务需求。
- 运维成本高:需要投入大量精力来管理和维护服务器的运行环境。
3. Docker核心概念
Docker的出现革命性地解决了上述问题。它是一个开源的应用容器引擎,可以将应用及其所有依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。
- 镜像 (Image):一个只读的模板,包含了运行应用所需的一切:代码、运行时、库、环境变量和配置文件。镜像是创建容器的基础。
- 容器 (Container):镜像的运行实例。容器之间相互隔离,拥有自己的文件系统、网络和进程空间。可以被启动、停止、删除。
- 仓库 (Repository):集中存放镜像文件的地方。最著名的公共仓库是Docker Hub,我们也可以搭建私有仓库。
3.1 Dockerfile:定义你的应用环境
Dockerfile
是一个文本文件,包含了一系列指令,用于自动化地构建一个Docker镜像。通过Dockerfile
,我们可以将应用环境的配置代码化,实现环境的标准化和版本控制。
示例:为cloudmall-product
服务编写Dockerfile
# Dockerfile for cloudmall-product# 1. 指定基础镜像
# 使用一个包含Java 8运行环境的轻量级镜像
FROM openjdk:8-jre-alpine# 2. 设置工作目录
WORKDIR /app# 3. 将应用的jar包复制到容器中
# TARGET_DIR 和 JAR_NAME 是构建时的参数
ARG TARGET_DIR=target
ARG JAR_NAME=cloudmall-product-0.0.1-SNAPSHOT.jar
COPY ${TARGET_DIR}/${JAR_NAME} /app/app.jar# 4. 声明容器对外暴露的端口
EXPOSE 8001# 5. 定义容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
4. Docker实战:容器化商品服务
接下来,我们将以上述Dockerfile
为例,演示如何将cloudmall-product
服务打包成Docker镜像并运行。
4.1 准备工作
-
安装Docker:请根据你的操作系统,参考Docker官方文档进行安装。
-
打包Spring Boot应用:在项目根目录执行Maven命令,将
cloudmall-product
模块打包成jar文件。# 在cloudmall父工程目录下执行 mvn clean package -DskipTests -pl cloudmall-product -am
4.2 构建Docker镜像
在cloudmall-product
模块的根目录下创建Dockerfile
文件,并将上面的示例内容粘贴进去。然后执行以下命令构建镜像:
# -t: 指定镜像的名称和标签,格式为 <repository>:<tag>
# .: 指定Dockerfile所在的路径为当前目录
docker build -t cloudmall/product:v1.0 .
构建成功后,可以通过docker images
命令查看本地的镜像列表。
4.3 运行Docker容器
使用docker run
命令来启动一个容器:
# -d: 后台运行容器
# -p: 端口映射,格式为 <宿主机端口>:<容器端口>
# --name: 指定容器的名称
docker run -d -p 8001:8001 --name product-service cloudmall/product:v1.0
现在,商品服务就在Docker容器中运行起来了。我们可以通过访问http://localhost:8001
(或Docker宿主机的IP)来测试服务是否正常。
5. 使用Docker Compose编排多服务
在微服务架构中,一个应用通常由多个服务组成。手动管理每个服务的容器非常繁琐。Docker Compose
是一个用于定义和运行多容器Docker应用的工具。通过一个docker-compose.yml
文件,我们可以配置应用的所有服务,然后使用一条命令即可启动或停止所有服务。
示例:docker-compose.yml
编排用户和商品服务
version: '3.8'services:# 商品服务product-service:image: cloudmall/product:v1.0container_name: product-serviceports:- "8001:8001"networks:- cloudmall-net# 用户服务 (假设也已打包成镜像 cloudmall/user:v1.0)user-service:image: cloudmall/user:v1.0container_name: user-serviceports:- "8002:8002"networks:- cloudmall-net# ... 此处可以继续定义Nacos, Redis, MySQL等其他依赖服务networks:cloudmall-net:driver: bridge
将上述内容保存为docker-compose.yml
文件,然后在该文件所在目录执行:
# 启动所有服务
docker-compose up -d# 停止并移除所有服务
docker-compose down
6. 章节总结
本章我们从传统部署的痛点出发,学习了容器化技术Docker的核心概念与巨大优势。我们重点掌握了如何使用Dockerfile
为Spring Boot应用构建标准化的运行环境,并成功将商品服务容器化。最后,我们了解了如何使用Docker Compose
来简化多服务应用的编排和管理。容器化是通向云原生和高效运维的必经之路,为后续学习Kubernetes等更高级的服务编排技术打下了坚实的基础。
##7 资源下载
本章的示例代码可以从以下链接下载:
微服务开发课程第16-26章的源码