Skip to content

12 项目部署 - 部署 Java 应用

黑马商城项目介绍

部署的容器及端口说明

项目容器名端口备注
hmallhmall8080黑马商城后端 API 入口
hmall-portalnginx18080黑马商城用户端入口
hmall-adminnginx18081黑马商城管理端入口
mysqlmysql3306数据库

项目结构

  • hmall: 商城的后端代码
  • hmall-portal:商城用户端的前端代码
  • hmall-admin:商城管理端的前端代码

hmall 项目是一个 maven 聚合项目,使用 IDEA 打开 hmall 项目,查看项目结构如图:

bash
 tree hamll -L 1
├── .idea
├── hm-common # 通用工具模块
├── hm-service # 业务模块
├── logs
├── src
└── pom.xml

我们要部署的就是其中的 hm-service,其中的配置文件采用了多环境的方式:

  • application.yml
  • application-dev.yml 部署到开发环境的配置
  • application-local.yml 本地运行时的配置

查看 application.yaml,会发现其中的 JDBC 地址并未写死,而是读取变量:

yaml
server:
  port: 8080
spring:
  application:
    name: hm-service
  profiles:
    active: dev
  datasource:
    url: jdbc:mysql://${hm.db.host}:3306/hmall?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: ${hm.db.pw}

这两个变量在 application-dev.ymlapplication-local.yml 中并不相同:

yaml
# application-dev.yml
db:
  host: mysql
  pw: 123

# application-local.yml
db:
  host: localhost
  pw: 123456

在 dev 开发环境(也就是 Docker 部署时)采用了 mysql 作为地址,刚好是我们的 mysql 容器名,只要两者在一个网络,就一定能互相访问。

部署项目

部署数据库

之前删除了 mysql 容器的需要重新上传 mysql 文件夹到到虚拟机的 hmall 目录

  1. 将文件上传到 hmall 目录

    bash
     mkcd hmall
     tree -L 2 .
    .
    ├── Dockerfile
    ├── hm-service.jar
    └── mysql # 数据库目录
        ├── conf
        ├── data
        └── init
    
    4 directories, 2 files
  2. 运行 mysql 容器。

    bash
     docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=123 \
      -v ./mysql/data:/var/lib/mysql \
      -v ./mysql/conf:/etc/mysql/conf.d \
      -v ./mysql/init:/docker-entrypoint-initdb.d \
      mysql
    zsh: correct './mysql/conf:/etc/mysql/conf.d' to './mysql/conf/etc/mysql/conf.d' [nyae]? n
    0912ee2dd460814b121d244de2aa154320a0366d085a3e6ba7db7ff2a0bc65a3
  3. 将 mysql 容器添加到 hmall 网络并设置别名为 db。

    bash
     docker network connect hmall mysql --alias db
  4. 查看 hmall 网络中的容器。

    bash
     dkNinc hmall
    0912ee2dd460814b121d244de2aa154320a0366d085a3e6ba7db7ff2a0bc65a3: mysql

部署后端服务

  1. hm-service 目录下的 Dockerfilehm-service/target 目录下的 hm-service.jar 一起上传到虚拟机的 hmall 目录

    bash
     tree -L 2 .
    .
    ├── Dockerfile
    ├── hm-service.jar
    └── mysql
        ├── conf
        ├── data
        └── init
    
    4 directories, 2 files
  2. 查看 Dockerfile 文件内容是否正确。

    bash
     cat Dockerfile
    # 基础镜像
    FROM openjdk:11.0-jre-buster
    # 设定时区
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    # 拷贝 jar 包
    COPY hm-service.jar /app.jar
    # 入口
    ENTRYPOINT ["java", "-jar", "/app.jar"]
  3. 构建 hmall 镜像。省略 tag,默认为 latest。

    bash
     docker build -t hmall .
    [+] Building 2.3s (8/8) FINISHED                                                                                      docker:default
     => [internal] load build definition from Dockerfile                                                                            0.3s
     => => transferring dockerfile: 298B                                                                                            0.1s
     => [internal] load .dockerignore                                                                                               0.2s
     => => transferring context: 2B                                                                                                 0.0s
     => [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster                                                      0.7s
     => [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:569ba9252ddd693a29d39e81b3123481f308eb6d529827a40c93710444e421  0.0s
     => [internal] load build context                                                                                               0.5s
     => => transferring context: 68.24MB                                                                                            0.4s
     => CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone             0.0s
     => [3/3] COPY hm-service.jar /app.jar                                                                                          0.2s
     => exporting to image                                                                                                          0.4s
     => => exporting layers                                                                                                         0.3s
     => => writing image sha256:af4b5ab8d9fccf5efa559b714e733b43934275ffa2b68b5ace7a9167ac273a63                                    0.0s
     => => naming to docker.io/library/hmall                                                                                        0.0s
  4. 查看本地镜像。

    bash
     dk images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    hmall        latest    af4b5ab8d9fc   1 minutes ago    365MB
    mysql        latest    a3b6608898d6   4 weeks ago      596MB
  5. 创建并运行 hmall 容器,并加入 hmall 网络。

    bash
     dk run -d --name hmall --network hmall -p 8080:8080 hmall
    916083d7d274599380295f709611ef21b2eaadc21adcf148109583567c8e305f
  6. 查看 hmall 网络中是否包含 hmall 容器。只有 hmall 容器和 mysql 容器在同一个网络中才能通过容器名访问 mysql

    bash
     dkNinc hmall
    0912ee2dd460814b121d244de2aa154320a0366d085a3e6ba7db7ff2a0bc65a3: mysql
    916083d7d274599380295f709611ef21b2eaadc21adcf148109583567c8e305f: hmall
  7. 查看搜素相关接口。

    bash
     curl localhost:8080/search/list?pageNo=1&pageSize=2
    {"total":"88475","pages":"4424","list":[{"id":"100002624512","name":"......"}]}