Java 项目部署学习笔记

1. 项目基本信息与部署目标

  • hmall 项目是一个 Maven 聚合项目,可使用 IDEA 打开。
  • 本次部署的目标为项目中的 hm-service 模块。

2. 配置文件说明

  • hm-service 的配置文件采用多环境方式:
    • application-dev.yaml:用于开发环境(Docker 部署)的配置。
    • application-local.yaml:用于本地运行时的配置。
  • 查看 application.yaml 可知,其中的 JDBC 地址并未写死,而是通过读取变量的方式获取。
  • 上述变量在 application-dev.yamlapplication-local.yaml 中的值并不相同。
  • 在 dev 开发环境(Docker 部署时)采用了 mysql 作为地址,该地址刚好是 mysql 容器名,只要两者在同一网络,就一定能互相访问。

3. 项目打包与部署

  • 对项目进行打包操作。
  • hm-service 目录下的 Dockerfilehm-service/target 目录下的 hm-service.jar 一起上传到虚拟机的 root 目录。
  • 部署项目的步骤:
    1. 构建项目镜像(不指定 tag,则默认为 latest):docker build -t hmall .
    2. 查看镜像:docker images,结果如下:
      1
      2
      3
      4
      5
      REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
      hmall latest 0bb07b2c34b9 43 seconds ago 362MB
      docker-demo 1.0 49743484da68 24 hours ago 327MB
      nginx latest 605c77e624dd 16 months ago 141MB
      mysql latest 3218b38490ce 17 months ago 516MB
    3. 创建并运行容器,通过 --network 将其加入 hmall 网络(以便通过容器名访问 mysql):docker run -d --name hmall --network hmall -p 8080:8080 hmall
  • 测试:通过浏览器访问 http://你的虚拟机地址:8080/search/list

4. 前端部署

  • hmall-portalhmall-admin 是前端代码,需要基于 nginx 部署。课前资料中提供了 nginx 的部署目录,其中:

    • html 是静态资源目录,需将 hmall-portal 以及 hmall-admin 都复制进去。
    • nginx.conf 是 nginx 的配置文件,主要用于完成对 html 下的两个静态资源目录做代理。
  • 将整个 nginx 目录上传到虚拟机的 /root 目录。

  • 创建 nginx 容器并完成两个挂载:

    • /root/nginx/nginx.conf 挂载到 /etc/nginx/nginx.conf
    • /root/nginx/html 挂载到 /usr/share/nginx/html
  • 由于需要让 nginx 同时代理 hmall-portalhmall-admin 两套前端资源,因此需暴露两个端口:

    • 18080:对应 hmall-portal
    • 18081:对应 hmall-admin
  • 命令如下:

    1
    2
    3
    4
    5
    6
    7
    8
    docker run -d \
    --name nginx \
    -p 18080:18080 \
    -p 18081:18081 \
    -v /root/nginx/html:/usr/share/nginx/html \
    -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
    --network hmall \
    nginx
  • 测试:通过浏览器访问 http://你的虚拟机ip:18080

5. Docker Compose

  • 部署一个简单的 Java 项目,包含 3 个容器:MySQL、Nginx、Java 项目。对于稍微复杂的项目,还会有各种其它中间件,需要部署的内容远不止 3 个。若手动逐一部署,会非常麻烦。
  • Docker Compose 可帮助实现多个相互关联的 Docker 容器的快速部署,允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。

5.1 基本语法

  • docker-compose.yml 文件的基本语法可参考官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3/

  • docker-compose 文件中可定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于 service 是在定义某个应用的运行时参数,因此与 docker run 参数非常相似。

  • 举例:用 docker run 部署 MySQL 的命令如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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 \
    --network hmall
    mysql

    docker-compose.yml 文件来定义,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    version: "3.8"

    services:
    mysql:
    image: mysql
    container_name: mysql
    ports:
    - "3306:3306"
    environment:
    TZ: Asia/Shanghai
    MYSQL_ROOT_PASSWORD: 123
    volumes:
    - "./mysql/conf:/etc/mysql/conf.d"
    - "./mysql/data:/var/lib/mysql"
    networks:
    - new
    networks:
    new:
    name: hmall
  • 对比关系如下:

    docker run 参数 docker compose 指令 说明
    –name container_name 容器名称
    -p ports 端口映射
    -e environment 环境变量
    -v volumes 数据卷配置
    –network networks 网络
  • 黑马商城部署文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    version: "3.8"

    services:
    mysql:
    image: mysql
    container_name: mysql
    ports:
    - "3306:3306"
    environment:
    TZ: Asia/Shanghai
    MYSQL_ROOT_PASSWORD: 123
    volumes:
    - "./mysql/conf:/etc/mysql/conf.d"
    - "./mysql/data:/var/lib/mysql"
    - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
    - hm-net
    hmall:
    build:
    context: .
    dockerfile: Dockerfile
    container_name: hmall
    ports:
    - "8080:8080"
    networks:
    - hm-net
    depends_on:
    - mysql
    nginx:
    image: nginx
    container_name: nginx
    ports:
    - "18080:18080"
    - "18081:18081"
    volumes:
    - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
    - "./nginx/html:/usr/share/nginx/html"
    depends_on:
    - hmall
    networks:
    - hm-net
    networks:
    hm-net:
    name: hmall

5.2 基础命令

  • 编写好 docker-compose.yml 文件后,即可部署项目。常见命令可参考:https://docs.docker.com/compose/reference/

  • 基本语法:docker compose [OPTIONS] [COMMAND],其中 OPTIONSCOMMAND 都是可选参数,常见的有:

    | 类型 | 参数或指令 | 说明 |

| ——– | ———- | ————————————————————————————— |
| Options | -f | 指定 compose 文件的路径和名称 |
| | -p | 指定 project 名称(project 是当前 compose 文件中设置的多个 service 的集合,是逻辑概念) |
| Commands | up | 创建并启动所有 service 容器 |
| | down | 停止并移除所有容器、网络 |
| | ps | 列出所有启动的容器 |
| | logs | 查看指定容器的日志 |
| | stop | 停止容器 |
| | start | 启动容器 |
| | restart | 重启容器 |
| | top | 查看运行的进程 |
| | exec | 在指定的运行中容器中执行命令 |

  • 教学演示:

    1. 进入 root 目录:cd /root

    2. 删除旧容器:docker rm -f $(docker ps -qa)

    3. 删除 hmall 镜像:docker rmi hmall

    4. 清空 MySQL 数据:rm -rf mysql/data

    5. 启动所有(-d 参数是后台启动):docker compose up -d,结果如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      [+] Building 15.5s (8/8) FINISHED
      => [internal] load build definition from Dockerfile 0.0s
      => => transferring dockerfile: 358B 0.0s
      => [internal] load .dockerignore 0.0s
      => => transferring context: 2B 0.0s
      => [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster 15.4s
      => [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3 0.0s
      => [internal] load build context 0.0s
      => => transferring context: 98B 0.0s
      => CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 0.0s
      => CACHED [3/3] COPY hm-service.jar /app.jar 0.0s
      => exporting to image 0.0s
      => => exporting layers 0.0s
      => => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71 0.0s
      => => naming to docker.io/library/root-hmall 0.0s
      [+] Running 4/4
      ✔ Network hmall Created 0.2s
      ✔ Container mysql Started 0.5s
      ✔ Container hmall Started 0.9s
      ✔ Container nginx Started 1.5s
    6. 查看镜像:docker compose images,结果如下:

      1
      2
      3
      4
      CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
      hmall root-hmall latest 32eebee16acd 362MB
      mysql mysql latest 3218b38490ce 516MB
      nginx nginx latest 605c77e624dd 141MB
    7. 查看容器:docker compose ps,结果如下:

      1
      2
      3
      4
      NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
      hmall root-hmall "java -jar /app.jar" hmall 54 seconds ago Up 52 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
      mysql mysql "docker-entrypoint.s…" mysql 54 seconds ago Up 53 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
      nginx nginx "/docker-entrypoint.…" nginx 54 seconds ago Up 52 seconds 80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp
  • 打开浏览器,访问:http://yourIp:8080