安装 Docker 大家可以自行安装, 建议大家使用 Linux 或者 Mac OS, 因为 Docker 对 windows 支持并不是很完美, 虽然近两年 docker 也为此做了很多努力, 但是我个人认为还并不足以媲美 Linux 支持, 因此如果使用 windows 环境可能在日常使用中发生一些奇奇怪怪的错误.
构建 SpringBoot 我们至少应该有一个 SpringBoot 项目, 帅帅我使用的是这段时间一直持续开发的项目 jfoa ,这是一个 SpringBoot 整合 Angular 10 的项目, 具体项目介绍大家可以参考帅帅之前的一篇文章 jfoa 客户端开放下载, 这篇文章中大体罗列了当时使用到的一些技术栈, 当然, 到现在为止, 项目中根据业务需求的变化与新增也已经新增加了很多技术, 大家可以持续关注.
如果您需要将您构建的镜像发布到 Docker Hub, 您首先得注册一个 Docker Hub 的账户.
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 <javafamily.club@outlook.com> # 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=v2ENTRYPOINT: 启动 Docker 容器时要执行的命令. 该命令还可以通过 CMD 指令指定, 区别是 ENTRYPOINT 指令不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序. 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效. 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参构建 Docker 镜像使用 build 指令, 语法为:
docker build [OPTIONS] contextPathjfoa 的构建指令如下(必须得先打包 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 <javafamily.club@outlook.com> ---> 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第一次运行会下载 java8 基础镜像, 之后就不需要下载了
大家如果参考我的项目 jfoa 的话, 在项目根路径下我创建了 shell 脚本buildDockerImage 可以直接执行进行构建
还有一些常用的构建参数, 如下
-m: 设置内存最大值.--no-cache: 创建镜像的过程中不使用缓存-q: 安静模式, 成功后只输出镜像 ID, 不会显示构建步骤以及构建日志信息.--rm: 设置镜像成功后删除中间容器.--network: 默认 default。在构建期间设置RUN指令的网络模式在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回
创建/运行容器使用 run 执行, 命令如下:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]jfoa 项目可以通过以下命令进行运行
docker run -d -p80:80 -p443:443 --name jfoa jfoa:latest由于帅帅的项目使用了 https 支持, 并且会将 http 访问转化为 https 访问, 因此需要暴露 http 端口 80 和 https 端口 443.
发布镜像使用 push 指令,
docker push [OPTIONS] NAME[:TAG] --disable-content-trust : 忽略镜像的校验,默认开启发布镜像前, 需要先进行登录, 使用 login 指令
docker login [OPTIONS] [SERVER]Option
-u 用户名-p 密码发布镜像到 Docker Hub 则要求镜像名命名格式为 用户名/镜像名:标签名, 我们构建镜像时指定了镜像名为 jfoa, 不符合 Docker Hub 规范, 因此, 可以通过以下命令修改镜像名
docker tag oldRepositoryName:oldTag user/rep:tag 示例 docker tag jfoa javafamily/jfoa:latest该指令不会删除旧的镜像
如果没有登录, 或者镜像名不符合规范, 则会发布失败
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输出
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