# 进阶版
# 前言
可以看出基础版中会有以下缺点
- 构建jar包时要依赖本地环境, 本地环境必须安装
JDK 14
,gradle 6.5
等工具; order-server
访问数据库的时候需要先查询数据库的IP, 再写入到环境变量中, 不够灵活;
所以我们可以对以上问题进行改进.
# 清除环境
如果做过场景1的实验, 请清除场景1中运行的网络和容器, 具体参考场景1-清除环境
# 构建
编写
order-server
的DockerfilePS: 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
构建
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 \ .
# 启动
启动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
启动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
- Line.5: link到MYSQL容器, 并设置别名为
# 验证
获取容器NAT IP
如果使用docker desktop安装的docker, 可以直接使用127.0.0.1进行容器的访问
如果使用docker toolbox安装的docker, 请运行以下命令获得容器的IP
docker-machine env # 回显关键内容 # DOCKER_HOST=tcp://192.168.99.101:2376 # 其中192.168.99.101为容器的访问IP
调用
order-server
服务接口浏览器中直接打开http://127.0.0.1:38080/order
PS: 如果是docker toolbox方式安装的, 请将上面的
127.0.0.1
部分修改为获取容器NAT IP
章节中获取到的IP, 后面需要访问其它容器也是如此, 就不再重复提示.调用结果:
连接MYSQL查询数据
使用MYSQL连接工具, IP填写为
127.0.0.1
, 端口填写为33060
, 账号密码为shopping-mall-mariadb