# 进阶版

# 前言

可以看出基础版中会有以下缺点

  1. 构建jar包时要依赖本地环境, 本地环境必须安装JDK 14, gradle 6.5等工具;
  2. order-server访问数据库的时候需要先查询数据库的IP, 再写入到环境变量中, 不够灵活;

所以我们可以对以上问题进行改进.

# 清除环境

如果做过场景1的实验, 请清除场景1中运行的网络和容器, 具体参考场景1-清除环境

# 构建

  1. 编写order-server的Dockerfile

    PS: Dockerfile保持到./demo/order-server目录下

    # 构建jar阶段
    FROM gradle:6.5.0-jdk14 AS builder # 给buid阶段命名别名为builder
    WORKDIR /build
    COPY ./ /build
    # 将gradle国内源放入镜像, 加速构建过程
    COPY ./init.gradle /home/gradle/.gradle/init.gradle
    RUN gradle :order-server:build -x test
    
    # 构建order-server运行时镜像阶段
    FROM adoptopenjdk:14.0.1_7-jdk-openj9-0.20.0-bionic
    WORKDIR /app
    ENV TZ="Asia/Shanghai"
    # 从构建jar阶段中将jar产物拷贝到当前阶段容器镜像中
    COPY --from=builder /build/order-server/build/libs/*.jar /app/order-server.jar
    
    CMD ["/bin/bash", "-c", "java ${JVM_ARGS_BEFORE} -jar /app/order-server.jar ${JVM_ARGS_LATER}"]
    
    EXPOSE 38080
    
    
  2. 构建order-server镜像

    • Line.3: # 指定Dockerfile文件路径(所以Dockerfile文件名不一定是Dockerfile)
    • Line.4: # 指定构建镜像后的镜像名和tag
    • Line.5: # 容器外的上下文路径
    # 进入./demo/shopping-mall目录下
    docker build \
      -f ./order-server/Dockerfile \
      -t order-server:0.0.1-SNAPSHOT \
      .
    

# 启动

  1. 启动mysql服务, 这里用的是mariadb:10.5.4

    • Line.1: # 指定容器名称
    • Line.2: # 指定外-内映射端口
    • Line.3: # 指定数据库ROOT密码
    • Line.4: # 指定数据库普通用户名
    • Line.5: # 指定数据库普通用户的密码
    • Line.6: # 指定需要创建的数据库库(schema)名
    • Line.7: # 后台运行
    • Line.8: # 镜像名和tag
    docker run --name shopping-mall-mariadb \
      -p 33060:3306 \
      -e MYSQL_ROOT_PASSWORD=x22x22 \
      -e MYSQL_USER=shopping-mall-mariadb \
      -e MYSQL_PASSWORD=shopping-mall-mariadb \
      -e MYSQL_DATABASE=shopping-mall-mariadb \
      -d \
      mariadb:10.5.4
    
  2. 启动order-server

    • Line.5: link到MYSQL容器, 并设置别名为db
    • Line.6: 设置数据库url, 这里使用的是link中对于MYSQL容器设置的别名
    docker run -it \
      --rm \
      --name order-server \
      -p 38080:38080 \
      --link shopping-mall-mariadb:db \
      -e spring.r2dbc.url=r2dbc:mysql://db:3306/shopping-mall-mariadb \
      order-server:0.0.1-SNAPSHOT
    

# 验证

  1. 获取容器NAT IP

    1. 如果使用docker desktop安装的docker, 可以直接使用127.0.0.1进行容器的访问

    2. 如果使用docker toolbox安装的docker, 请运行以下命令获得容器的IP

      docker-machine env
      # 回显关键内容
      # DOCKER_HOST=tcp://192.168.99.101:2376
      # 其中192.168.99.101为容器的访问IP
      
  2. 调用order-server服务接口

    • 浏览器中直接打开http://127.0.0.1:38080/order

      PS: 如果是docker toolbox方式安装的, 请将上面的127.0.0.1部分修改为获取容器NAT IP章节中获取到的IP, 后面需要访问其它容器也是如此, 就不再重复提示.

    • 调用结果:

      调用服务接口

  3. 连接MYSQL查询数据

    使用MYSQL连接工具, IP填写为127.0.0.1, 端口填写为33060, 账号密码为shopping-mall-mariadb