【Docker】(二)使用Dockerfile构建并发布一个SpringBoot服务
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1.前言
在上一篇笔记 Docker基本概念与安装 中我们已经获取到了一个Docker服务并了解了Docker的基本组成及其各个组件的作用。
我们了解到使用Docker的其中一个目的是为了更加简单方便的部署我们编写的服务接下来就以发布一个SpringBoot
的服务为例来学习部署服务需要是用到的API指令。
2.准备工作
首先需要准备一个Springboot
的项目这里准备一个简单的 Hello World 工程
@RestController
@RequestMapping("hello")
public class HelloController {
@GetMapping("sayHello")
public String sayHello(String name) {
return "hello " + name;
}
}
提供一个GET请求的接口在请求参数中输入什么就返回什么这里不过多的赘述。
接下来需要使用Maven
或Gradle
打包工具将这个服务打成jar
包我这里使用的是Gradle
打包完成之后在build目录中就可以找到一个可运行的jar
包。
由于我的Docker是安装在虚拟机中的所以我还需要将这个jar
拷贝到我的虚拟机中完成Docker镜像的构建如果Docker是直接安装在当前系统中的话后续的操作在当前系统中就可以完成了。
此处使用Xftp将生成的jar包拷贝到了虚拟机的/user/hello-boot
下接下来的操作都在这里面完成。
3.Docker镜像构建
下一步就是将刚刚生成的jar
包构建成可供Docker运行的image
文件这一步需要使用到两个知识点
docker build
指令Dockerfile
文件
3.1.docker build
docker build
指令的作用是解析Dockerfile
文件中的的脚本把可执行文件如上面的jar
包打包到Docker镜像文件中这个镜像文件可以在后续使用docker run
时按照Dockerfile
文件中的脚本执行相应的操作。简单的说就是构建出docker的可执行文件。
先看构建语法
docker build [OPTIONS] PATH | URL | -
-
[OPTIONS] 是执行build时的可选项常用是有
-t
-f
- -t给构建的镜像打一个tag标签
- -f指定本次构建使用到的Dockerfile文件路径默认值为Dockerfile
其他先选项可以参考: docker build options
-
PATH 与 URL 是当前构建操作的context它可以是一个文件路径PATH也可以是远程地址URL构建时需要引用的文件就应该放在context中例如刚刚生成的
jar
包。
综上可以进入jar
包所在的文件目录输入构建指令
cd /usr/hello-boot/
docker build -t hello-boot:1.0.0 -f ./Dockerfile .
我们知道默认使用的就是当前路径下的Dockerfile所以构建指令可以简化为
docker build -t hello-boot:1.0.0 .
指令中最后那个.
就是上述语法中的 PATH 在这里的含义就是执行当前目录为构建的context。
现在我们得到了一个完整的构建指令但是仔细观察一下这个指令会发现其中还缺少处理jar
包的指令思考一下这个指令会在什么位置呢
3.2.DockerFile
Dockerfile 是一个脚本文件里面定义了context的各种操作指令以生成SpringBoot
镜像为例
FROM openjdk:8-alpine3.9
MAINTAINER huizhiyimo
RUN mkdir -p /user/my-demo
COPY ./*.jar /user/my-demo
WORKDIR /user/my-demo
EXPOSE 8080
ENTRYPOINT java -Xms256m -Xmx256m -jar -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} *.jar
- FROM指定基础镜像也就是当前需要构建的镜像是哪一个镜像的基础上做构建的当前指定在
openjdk:8-alpine3.9
上构建。 - MAINTAINER作者信息类似于@author
- RUN在容器中运行指令此处是创建文件夹
/user/my-demo
- COPY将宿主机context中的
jar
复制到容器中的/user/my-demo
中 - WORKDIR指定容器中的工作目录类似于
cd /user/my-demo
- EXPOSE应用程序暴露的默认端口
- ENTRYPOINT应用程序切入点在启动容器时运行在这里定义启动
SpringBoot
服务
Docker的镜像是像集装箱那样一层一层往上搭建的通过 FROM 指令可以实现下图的分层效果
FROM后面的镜像会先从本地的镜像仓库中寻找如果本地没有就会从 DockerHub 中寻找此处的openjdk:8-alpine3.9
是一个带有Java
运行环境的轻量级服务器在DockerHub中找到这个镜像打开IMAGE LAYERS就能大概知道这个镜像会怎么运行如下图红框中的内容。
显然通过这个镜像我们就可以得到一个Java的运行环境以此为基础来运行SpringBoot
的服务就是顺理成章的事情了。
3.3.镜像构建
将编写好的DockerFile与jar
包放在同一目录下执行构建指令
docker build -t hello-boot:1.0.0 .
提示构建成功此时再运行查看镜像的指令就可以看到刚才通过FROM下载的openjdk
镜像与hello-boot
镜像
docker images
如果构建的镜像有问题可以通过删除镜像指令删掉再重新构建
docker rmi [name:tag]
docker rmi hello-boot:1.0.0
4.运行镜像
通过docker run
指令可以将镜像运行起来
docker run -d -p 8080:8080 -e SPRING_PROFILES_ACTIVE=test --restart=always --name=hello-1 hello-boot:1.0.0
-d
: 后台运行程序-p
指定端口映射左边的是宿主机端口右边的是容器中的应用端口与-d可以合并为-dp-e
: 指定环境变量此处是指定profiles为test
在Dockerfile的ENTRYPOINT中定义的变量--restart=always
启动docker容器时自动运行--name
指定运行容器的名称- hello-boot:1.0.0指定镜像名称与tag标签
运行起来之后可以通过docker ps
查看
此时容器已经正常启动了通过curl
指令来测试一下是否启动成功
curl "http://127.0.0.1:8080/hello/sayHello?name=zhangsan"
至此SpringBoot
服务就通过Docker发布成功了如果想停止这个服务可以使用下面的指令
# 停止容器hello-1为容器名
docker stop hello-1
# 删除容器
docker rm hello -1
注如果项目迭代到了下一个版本要发布新的服务就需要执行上面的两个指令删除旧的容器再通过新构建的镜像来运行新的容器。
5.指令参考
Docker的运行指令可以参考 官方指令教程
6.结语
本篇通过打包、构建镜像、运行容器、停止容器、删除容器的过程学习了Docker的基本指令
docker build
构建镜像docker images
查看本地镜像docker rmi
删除镜像docker run
运行容器docker ps
查看容器docker stop
停止容器docker rm
删除容器
一些思考
本篇描述的Docker使用方式相对于传统的服务发布方式并没有太大的优势不管是发布新服务还是对服务进行扩展都需要按照流程重新构建镜像。
这是由于没有做到镜像的共享与复用导致的在后续的笔记中使用registry远程镜像仓库管理镜像会介绍如何通过远程镜像仓库来复用镜像来提升部署的效率。
最后如果觉得文章对你有帮助的话可以帮忙点点赞哦你们的支持是我更新最大的动力~