Docker 构建打包 SpringBoot 项目

Docker 构建打包 SpringBoot + Angular 整合项目

Docker 构建打包 SpringBoot 项目_第1张图片

1. 环境准备

1.1 安装 Docker

安装 Docker 大家可以自行安装, 建议大家使用 Linux 或者 Mac OS, 因为 Docker 对 windows 支持并不是很完美, 虽然近两年 docker 也为此做了很多努力, 但是我个人认为还并不足以媲美 Linux 支持, 因此如果使用 windows 环境可能在日常使用中发生一些奇奇怪怪的错误.

1.2 SpringBoot 项目

构建 SpringBoot 我们至少应该有一个 SpringBoot 项目, 帅帅我使用的是这段时间一直持续开发的项目 jfoa ,这是一个 SpringBoot 整合 Angular 10 的项目, 具体项目介绍大家可以参考帅帅之前的一篇文章 jfoa 客户端开放下载, 这篇文章中大体罗列了当时使用到的一些技术栈, 当然, 到现在为止, 项目中根据业务需求的变化与新增也已经新增加了很多技术, 大家可以持续关注.

1.3 Docker Hub

如果您需要将您构建的镜像发布到 Docker Hub, 您首先得注册一个 Docker Hub 的账户.

2. Dockerfile

Docker 构建镜像是基于 Dockerfile 的, Dockerfile 大家可以理解为 Docker 构建的配置文件, 大致内容如下:

# Docker image for jfoa
# VERSION 0.0.1
# Author: Jack Li
# base image using java8
FROM java:8
# author
MAINTAINER JavaFamily <[email protected]>

# temp folder. link locale:/var/lib/docker to container:/tmp
VOLUME /tmp

# add jar to container and renaming to app.jar
ADD ./javafamily-oa-*.jar app.jar
# env
ENV JAVA_OPTS "-Xms800m -Xmx800m"
# run command
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar --spring.profiles.active=prod
  • FROM: 指定基础镜像, 我们 SpringBoot 项目就可以使用 java8 或者 openjdk8 等.
  • MAINTAINER: 作者信息.
  • VOLUME: 临时文件夹, Docker 在构建过程中如果需要创建临时文件, 则可以通过配置该值将本地机器的 /var/lib/docker 映射到容器的 /tmp 文件夹.
  • ADD: 添加文件到镜像中(app.jar 为重命名后的名称). SpringBoot 文件一般就是打包后的 jar 包.
  • ENV: 环境变量声明, 可以在其他地方进行引用. 一般格式为 key value 或者 k1=v1 k2=v2
  • ENTRYPOINT: 启动 Docker 容器时要执行的命令. 该命令还可以通过 CMD 指令指定, 区别是 ENTRYPOINT 指令不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序.
    • 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序
    • 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效.
    • 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参

3. 构建 Docker 镜像

3.1 语法

构建 Docker 镜像使用 build 指令, 语法为:

docker build [OPTIONS] contextPath

3.2 示例

jfoa 的构建指令如下(必须得先打包 SpringBoot 项目):

docker build -f ./Dockerfile -t jfoa ./runner/build/libs/
  • -f 指定 Dockerfile 的位置, 默认为上下文的当前路径
  • -t 指定镜像的名字
  • ./runner/build/libs/ 指定了上下文环境的路径, 可以理解为在哪个路径下执行构建, 一般都是将构建所需要的文件和 Dockerfile 拷贝到一个文件夹下进行构建, 这样的话上下文路径就是 ., 这样做的原因是以为 Docker 在执行构建的过程中会将上下文路径下的所有文件到打包发送给 Docker 引擎(Docker 是C/S 架构, 我们相当于客户端, Docker 引擎相当于服务端), 因此, 如果该路径下存在太多不必要的文件的话就是大大当地构建的效率和速度. 帅帅我这里是指定的是 SpringBoot 通过 gradle 打包后的目录, 在项目打包后该目录下只有一个我们需要的 jar 包, 没有多余的无用文件, 由于该目录默认是不存在的, 因此 Dockerfile 我放在项目根路径下.
JackLi:jfoa dreamli$ docker build -f ./Dockerfile -t jfoa ./runner/build/libs/
Sending build context to Docker daemon  105.1MB
Step 1/6 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/6 : MAINTAINER JavaFamily <[email protected]>
 ---> Running in f7b78ce2aa45
Removing intermediate container f7b78ce2aa45
 ---> fd81ef8e990d
Step 3/6 : VOLUME /tmp
 ---> Running in a9a433aede66
Removing intermediate container a9a433aede66
 ---> a7d11c3ccd69
Step 4/6 : ADD ./javafamily-oa-*.jar app.jar
 ---> af8b842bbe7e
Step 5/6 : ENV JAVA_OPTS "-Xms800m -Xmx800m"
 ---> Running in 6a2513fe8645
Removing intermediate container 6a2513fe8645
 ---> 78ac9d58c84b
Step 6/6 : ENTRYPOINT nohup java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar --spring.profiles.active=prod &
 ---> Running in 7949b887e0ef
Removing intermediate container 7949b887e0ef
 ---> 775ccf7b020d
Successfully built 775ccf7b020d
Successfully tagged jfoa:latest

file

第一次运行会下载 java8 基础镜像, 之后就不需要下载了

大家如果参考我的项目 jfoa 的话, 在项目根路径下我创建了 shell 脚本buildDockerImage 可以直接执行进行构建

3.3 一些常用的构建参数

还有一些常用的构建参数, 如下

  • -m: 设置内存最大值.
  • --no-cache: 创建镜像的过程中不使用缓存
  • -q: 安静模式, 成功后只输出镜像 ID, 不会显示构建步骤以及构建日志信息.
  • --rm: 设置镜像成功后删除中间容器.
  • --network: 默认 default。在构建期间设置RUN指令的网络模式

在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回

4. 创建/运行容器

创建/运行容器使用 run 执行, 命令如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

4.1 参数

  • -d: 后台运行
  • -p: 指定端口映射, 格式为 -p本机端口:容器端口
  • -P: 随机端口映射, 将容器端口随机映射到本机端口
  • --name: 指定容器名
  • -i: 以交互模式运行容器,通常与 -t 同时使用
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • -e: 设置环境变量
  • --env-file=[]: 指定环境变量文件, 从文件中读取环境变量
  • -h: 指定容器的 hostname
  • -m: 设置容器使用内存最大值
  • -net: 指定网络连接方式, 支持 bridge/host/none/container: 四种类型
  • --expose=[]: 开放一组端口

4.2 示例

jfoa 项目可以通过以下命令进行运行

docker run -d -p80:80 -p443:443 --name jfoa jfoa:latest

由于帅帅的项目使用了 https 支持, 并且会将 http 访问转化为 https 访问, 因此需要暴露 http 端口 80 和 https 端口 443.

5 发布镜像到 Docker Hub

发布镜像使用 push 指令,

docker push [OPTIONS] NAME[:TAG]
  • --disable-content-trust : 忽略镜像的校验,默认开启

5.1 登录 Docker Hub

发布镜像前, 需要先进行登录, 使用 login 指令

docker login [OPTIONS] [SERVER]

Option

  • -u 用户名
  • -p 密码

5.2 修改镜像名

发布镜像到 Docker Hub 则要求镜像名命名格式为 用户名/镜像名:标签名, 我们构建镜像时指定了镜像名为 jfoa, 不符合 Docker Hub 规范, 因此, 可以通过以下命令修改镜像名

docker tag oldRepositoryName:oldTag user/rep:tag
  • 示例
docker tag jfoa javafamily/jfoa:latest

该指令不会删除旧的镜像

file

如果没有登录, 或者镜像名不符合规范, 则会发布失败

JackLi:~ dreamli$ docker push jfoa
The push refers to repository [docker.io/library/jfoa]
95620512ea79: Preparing 
35c20f26d188: Preparing 
c3fe59dd9556: Preparing 
6ed1a81ba5b6: Preparing 
a3483ce177ce: Preparing 
ce6c8756685b: Waiting 
30339f20ced0: Waiting 
0eb22bfb707d: Waiting 
a2ae92ffcd29: Waiting 
denied: requested access to the resource is denied

5.3 发布示例

docker push javafamily/jfoa:latest

输出

JackLi:~ dreamli$ docker push javafamily/jfoa:latest
The push refers to repository [docker.io/javafamily/jfoa]
95620512ea79: Pushed 
35c20f26d188: Pushed 
c3fe59dd9556: Pushed 
6ed1a81ba5b6: Pushed 
a3483ce177ce: Pushed 
ce6c8756685b: Pushed 
30339f20ced0: Pushed 
0eb22bfb707d: Pushed 
a2ae92ffcd29: Pushed 
latest: digest: sha256:6b66b577d220efb4e1fd9a648f6bc007b34742ba3632300815c4083475d1e060 size: 2212

Docker 构建打包 SpringBoot 项目_第2张图片

Docker 构建打包 SpringBoot 项目_第3张图片

你可能感兴趣的:(Docker,SpringBoot,Angular,10,Dockerfile,docker,java)