14、使用 Docker 构建微服务架构应用

使用 Docker 构建微服务架构应用

1. Docker 安装

在开始使用 Docker 构建 ABC - MSA 演示项目之前,需要先完成 Docker 的安装。为了获得最佳的实践学习体验,建议按照以下步骤进行操作。

在安装前,请确保有一个可用的物理或虚拟主机。可以使用 VirtualBox 或 VMWare 等虚拟化软件创建虚拟主机。虽然可以在 Windows 或 Mac 上安装 Docker,但在本演示中,将使用 Ubuntu Server 22.x Linux 环境来安装 Docker 社区版(CE),建议使用类似环境以方便遵循安装步骤。

安装步骤
- 安装 Docker Engine 的最佳方式是遵循 Docker 官方安装指南,可访问 Docker Docs ,从列表中选择适合服务器系统平台的安装指南。
- 也可以在工作站上安装 Docker Desktop,可从上述相同的安装指南中下载。

安装完成后,通过运行以下命令验证 Docker 的功能:

$ docker --version
Docker version 20.10.18, build b40c2f6
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

执行 Docker 命令可能需要 root 权限。

2. Docker 组件

Docker 主要有四个组件:Docker 文件、Docker 镜像、Docker 容器和 Docker 卷。以下是对每个组件的简要描述:
|组件|描述|
| ---- | ---- |
|Docker 文件|是一个文本文件,作为清单描述如何构建 Docker 镜像。它指定用于创建 Docker 镜像的基础镜像,例如 FROM ubuntu 表示使用最新的 Ubuntu 版本作为基础镜像。文件必须命名为 Dockerfile 才能被 Docker 使用。|
|Docker 镜像|是一个二进制文件,作为模板包含创建 Docker 容器的一组指令。可以从 Dockerfile 创建,也可以从公共或私有仓库(如 Docker Hub 或 GitHub)下载。|
|Docker 容器|基于 Docker 镜像运行。使用 docker run 命令启动容器,使用 docker container ls 命令验证容器是否正在运行。|
|Docker 卷|是一种存储形式,Docker 容器可以连接到卷以读写持久数据,用于在容器终止后保留数据。|

3. Docker 组件的详细操作
  • Docker 文件示例
# 使用 Ubuntu 22.10 作为基础镜像
FROM ubuntu:22.10
# 获取最新的软件包列表
RUN apt-get update
# 安装 Python 3 和 PIP
RUN apt-get install -y python3 pip
# 安装 Ansible
RUN apt-get install -y ansible
  • 构建 Docker 镜像
    假设 Dockerfile 位于用户的主目录,使用以下命令构建镜像:
$ docker build -t packt_demo_image ~/

使用 docker image ls 命令验证镜像是否已创建:

$ docker image ls

可添加 -a 选项显示主机上创建的所有镜像。

  • 运行 Docker 容器
$ docker run packt_demo_image

使用 docker container ls 命令验证容器是否正在运行,添加 -a 选项可显示主机上的其他容器,也可以使用 docker ps 命令。

  • 创建 Docker 卷
    customer_management 容器为例,创建 Docker 卷:
$ docker volume create customer_management_volume

使用以下命令列出所有卷并验证新创建的卷:

$ docker volume ls

使用以下命令查看卷的详细信息:

$ docker volume inspect customer_management_volume

创建持久的 customer_management 容器并连接到卷:

$ docker run -itd --mount source=customer_management_volume,target=/app_data --name customer_management_container packt_demo_image

使用 docker container ls 命令验证容器是否正在运行。

4. 创建 ABC - MSA 容器

在 ABC - MSA 系统中,采用每个微服务一个容器的方法。需要确定要构建的主要容器、每个容器所需的组件,然后编写必要的 Dockerfile。

ABC - MSA 系统包括以下服务:
1. API 网关
2. 前端 Web 仪表板界面
3. 客户管理
4. 产品管理
5. 订单管理
6. 库存管理
7. 快递管理
8. 运输管理
9. 支付授权
10. 通知管理
11. 聚合器:“产品订购数量”
12. 管理和编排

可以从 Docker Hub 中获取许多 Docker 镜像来构建微服务,Docker Hub 可通过 https://hub.docker.com/ 访问。

以下是部分服务的详细操作:

API 网关
选择 Tyk 作为 API 网关,因为它易于使用,具有包括身份验证和服务发现在内的全面功能,并且是 100% 开源产品,无功能限制。

安装步骤
- 遵循 https://tyk.io/docs/tyk - oss/ce - docker/ 中的说明安装 Tyk Docker 容器。
- 默认情况下,Tyk API 网关监听 TCP 端口 8080。使用以下命令验证安装:

$ curl localhost:8080/hello
{"status":"pass","version":"4.1.0","description":"Tyk GW"}

使用以下命令验证 Tyk Docker 镜像和容器是否成功创建:

$ docker images
$ docker container ls

客户管理微服务示例
客户管理、产品管理、订单管理等微服务在构建和部署容器方面类似。以客户管理微服务为例,需要在运行的容器中安装并运行 Flask,监听 HTTP/8080 端口,同时需要一个内部数据存储,并安装 Python。

以下是创建客户管理镜像所需的 Dockerfile 示例:

# Docker File for "customer_management" microservice
FROM ubuntu
# Install some dependencies/packages
RUN apt-get install -y apt-transport-https
RUN apt-get update
RUN apt-get install -y net-tools mysql-server python3 pip git build-essential curl wget vim software-properties-common;
# Install OpenJDK
RUN apt-get update && \
    apt-get install -y default-jdk
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64/
# Install Flask to run our application and respond to API calls
RUN pip install -U flask
# Expose port TCP/8080 to listen the container's application/flask API calls
EXPOSE 8080
# Create the /app_data directory and make it the working directory in the container
RUN mkdir /app_data
WORKDIR /app_data
ENV PATH $PATH:/app_data
# Download the microservice app code from GitHub repo
ENV GIT_DISCOVERY_ACROSS_FILESYSTEM 1
RUN git config --global init.defaultBranch main
RUN git init
RUN git remote add origin https://github.com/mohameosam/abc_msa.git
RUN git config core.sparseCheckout true
RUN echo "/microservices/customer_management/" > /app_data/.git/info/sparse-checkout
RUN git pull origin main
# Initialize the flask app
ENV FLASK_APP /app_data/microservices/customer_management/customer_management_ms.py
# Specify a mount point in the container
VOLUME /app_data
# Start mysql & flask services and available bash sheel
RUN chmod +x /app_data/microservices/customer_management/start_services
CMD /app_data/microservices/customer_management/start_services && bash

start_services 脚本内容如下:

flask run -h 0.0.0.0 -p 8080 &
usermod -d /var/lib/mysql/ mysql
service mysql start

假设 Dockerfile 位于当前用户主目录,使用以下命令创建客户管理微服务/容器:

$ docker build -t abc_msa_customer_management ~/

创建完成后,使用 docker image ls 命令验证镜像是否成功创建。

最后,创建持久的客户管理容器:

$ docker run -itd -p 8003:8080 --mount source=customer_management_volume,target=/app_data --name customer_management_container abc_msa_customer_management

使用 docker container ls 命令验证容器是否正在运行,使用以下命令以 root 权限连接到容器的 bash shell:

$ docker exec -u 0 -it customer_management_container bash
5. 前端 Web 仪表板界面

仪表板是用户界面(UI)交互的主要组件,与提供给用户的所有服务进行交互。在 ABC - MSA 示例中,创建了一个简单的购物车应用程序,用户可以将产品放入购物车并下单。

通过以上步骤,我们可以使用 Docker 构建一个完整的 ABC - MSA 微服务架构应用,各个组件相互协作,实现系统的各项功能。在实际应用中,可以根据具体需求对各个组件进行调整和优化。

使用 Docker 构建微服务架构应用

6. 容器端口映射与分布

在创建 ABC - MSA 系统的容器时,容器的 TCP 端口需要映射到主机的 TCP 端口,以便从外部访问容器内的服务。由于每个容器有独立的 TCP 栈,容器内的 TCP HTTP/8080 端口与主机或其他容器的该端口不同。

我们采用将主机的 TCP/80nn 端口映射到每个容器的本地 TCP HTTP/8080 端口的模式,其中 nn 是容器的编号。例如,客户管理容器将主机的 8003 端口映射到容器内的 8080 端口:

$ docker run -itd -p 8003:8080 --mount source=customer_management_volume,target=/app_data --name customer_management_container abc_msa_customer_management

系统中的容器并不一定都运行在同一主机上,它们可以分散在不同的主机上,这取决于服务的重要性、系统设计、冗余需求等因素。以下是容器端口映射的示意图:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(主机):::process -->|TCP/8003| B(客户管理容器:8080):::process
    A -->|TCP/8004| C(产品管理容器:8080):::process
    A -->|TCP/8005| D(订单管理容器:8080):::process
    A -->|...| E(其他容器:8080):::process
7. 其他 ABC - MSA 容器的创建

除了 API 网关和客户管理微服务,其他微服务容器的创建过程类似。以下是创建其他微服务容器的通用步骤:
1. 确定需求 :明确每个微服务所需的基础镜像、依赖包、运行环境等。
2. 编写 Dockerfile :根据需求编写 Dockerfile,指定基础镜像、安装依赖、设置环境变量、下载代码等。
3. 构建镜像 :使用 docker build 命令构建镜像。
4. 创建卷(可选) :如果需要持久化数据,创建 Docker 卷并将容器连接到卷。
5. 运行容器 :使用 docker run 命令运行容器,并进行端口映射。

以产品管理微服务为例,假设其 Dockerfile 如下:

# Docker File for "product_management" microservice
FROM ubuntu
# Install some dependencies/packages
RUN apt-get install -y apt-transport-https
RUN apt-get update
RUN apt-get install -y net-tools python3 pip git build-essential curl wget vim software-properties-common;
# Install Flask to run our application and respond to API calls
RUN pip install -U flask
# Expose port TCP/8080 to listen the container's application/flask API calls
EXPOSE 8080
# Create the /app_data directory and make it the working directory in the container
RUN mkdir /app_data
WORKDIR /app_data
ENV PATH $PATH:/app_data
# Download the microservice app code from GitHub repo
ENV GIT_DISCOVERY_ACROSS_FILESYSTEM 1
RUN git config --global init.defaultBranch main
RUN git init
RUN git remote add origin https://github.com/mohameosam/abc_msa.git
RUN git config core.sparseCheckout true
RUN echo "/microservices/product_management/" > /app_data/.git/info/sparse-checkout
RUN git pull origin main
# Initialize the flask app
ENV FLASK_APP /app_data/microservices/product_management/product_management_ms.py
# Specify a mount point in the container
VOLUME /app_data
# Start flask service and available bash sheel
RUN chmod +x /app_data/microservices/product_management/start_services
CMD /app_data/microservices/product_management/start_services && bash

构建镜像:

$ docker build -t abc_msa_product_management ~/

创建持久的产品管理容器:

$ docker run -itd -p 8004:8080 --mount source=product_management_volume,target=/app_data --name product_management_container abc_msa_product_management
8. 微服务间的通信

在 ABC - MSA 系统中,各个微服务需要相互通信以实现系统的整体功能。由于每个微服务运行在独立的容器中,它们可以通过网络进行通信。

以客户管理微服务和产品管理微服务为例,当用户在前端界面下单时,前端会向 API 网关发送请求,API 网关将请求转发给订单管理微服务,订单管理微服务可能需要与客户管理微服务验证客户信息,与产品管理微服务查询产品库存。

以下是微服务通信的流程:

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A(前端界面):::process -->|HTTP 请求| B(API 网关):::process
    B -->|转发请求| C(订单管理微服务):::process
    C -->|验证信息| D(客户管理微服务):::process
    C -->|查询库存| E(产品管理微服务):::process
    D -->|返回信息| C
    E -->|返回信息| C
    C -->|返回结果| B
    B -->|返回结果| A
9. 总结

通过使用 Docker,我们可以方便地构建和管理 ABC - MSA 系统的微服务架构应用。Docker 的各个组件,如 Docker 文件、镜像、容器和卷,为我们提供了强大的工具来创建、部署和运行微服务。

在实际应用中,我们可以根据系统的需求和性能要求,灵活调整容器的分布和配置,优化系统的性能和可靠性。同时,利用 Docker 的特性,如容器的生命周期管理、卷的持久化存储等,确保系统的数据安全和服务的连续性。

以下是构建 ABC - MSA 微服务架构应用的关键步骤总结:
1. 安装 Docker 并验证其功能。
2. 理解 Docker 的组件并掌握其操作方法。
3. 根据微服务的需求编写 Dockerfile 并构建镜像。
4. 创建 Docker 卷以持久化数据。
5. 运行容器并进行端口映射。
6. 实现微服务间的通信。

通过遵循这些步骤,我们可以构建一个高效、灵活、可扩展的微服务架构应用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值