使用Docker部署Spring boot项目
一、前提条件
1.有一个Spring boot项目
编译打包(mvn package)后在工程target目录下生成文件springBootDocker.jar
项目源码:
maven打包的jar包:
2. 一台装有Docker的Linux主机和一台Docker Registry(Harbor)
(安装步骤略)
二、用Docker打包镜像并发布
1. 编写Dockerfile文件,创建文件名为Dockerfile的文本文件,内容如下:
FROM java:8
VOLUME /tmp
COPY springBootDocker.jar app.jar
RUN bash -c “touch /app.jar”
EXPOSE 8080
ENTRYPOINT [“java”, “-jar”, “app.jar”, “–spring.profiles.active=test”, “–server.port=8080”, “> /log/app.log”]
解释:
java:8是指Docker Hub上官方提供的java镜像,版本号是8也就是jdk1.8,有了这个基础镜像后,Dockerfile可以通过FROM指令直接获取它的状态——也就是在容器中java是已经安装的,接下来通过自定义的命令来运行Spring Boot应用:
VOLUME指向了一个/tmp的目录,由于Spring Boot使用内置的Tomcat容器,Tomcat默认使用/tmp作为工作目录。效果就是在主机的/var/lib/docker目录下创建了一个临时文件,并连接到容器的/tmp。
将项目的jar文件作为app.jar添加到容器
RUN表示在新创建的镜像中执行一些命令,然后把执行的结果提交到当前镜像。这里使用touch命令来改变文件的修改时间,Docker创建的所有容器文件默认状态都是“未修改”。这对于简单应用来说不需要,不过对于一些静态内容(比如:index.html)的文件就需要一个“修改时间”。
EXPOSE 容器暴露端口
ENTRYPOINT 应用启动命令 参数设定
2. 上传文件Dockerfile和springBootDocker.jar到服务器的同一目录下
[root@localhost img_springboot]# ll
总用量 15864
-rw-r–r–. 1 root root 210 10月 22 15:06 Dockerfile
-rw-r–r–. 1 root root 16237220 10月 22 15:05 springBootDocker.jar
3. 将jar打包为镜像(docker build -t boot-docker .)
[root@localhost img_springboot]# docker build -t spring-boot-docker .
Sending build context to Docker daemon 16.24MB
Step 1/6 : FROM java:8
—> d23bdf5b1b1b
Step 2/6 : VOLUME /tmp
—> Using cache
—> a6f308f55c0c
Step 3/6 : COPY springBootDocker.jar app.jar
—> 155a71904ce8
Step 4/6 : RUN bash -c “touch /app.jar”
—> Running in 03131cf1eda9
Removing intermediate container 03131cf1eda9
—> 00d91e7e9aff
Step 5/6 : EXPOSE 8080
—> Running in 390fbf54f1d4
Removing intermediate container 390fbf54f1d4
—> ae18996023c4
Step 6/6 : ENTRYPOINT [“java”, “-jar”, “app.jar”, “–spring.profiles.active=test”, “–server.port=8080”, “> /log/app.log”]
—> Running in daed8e8d2177
Removing intermediate container daed8e8d2177
—> 1d978ac3b4d4
Successfully built 1d978ac3b4d4
Successfully tagged boot-docker:latest
打包之后可以使用docker images命令查看镜像
[root@localhost img_springboot]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
spring-boot-docker latest 1d978ac3b4d4 15 minutes ago 676MB
172.16.50.37/repo-test hw20181019 4ab4c602aa5e 6 weeks ago 1.84kB
4. 运行镜像
[root@localhost img_springboot]# docker run –name spring-boot-docker -d -v /opt/jar/springBootDocker/logs:/log -p 8080:8080 spring-boot-docker
51c70bbb2134e053324de405b92060a9c1c123bbc4c6eb94eb849a8dae7ca9c5
运行后,可以访问到spring boot 项目(http://{运行镜像的主机IP}:8080)
解释说明:
run: 容器启动命令
–name boot-docker 自定义容器命名
-d 程序后台启动
-v /opt/jar/boot-docker/logs:/log 应用日志 数据卷的方式存储
-p 8000:8000 用主机8000端口映射容器端口
boot-docker 镜像名称
5. 推送到私有仓库
5.1 打tag
[root@localhost img_springboot]# docker tag spring-boot-docker 172.16.50.37/repo-test/spring-boot-docker:1600
5.2 推送到私服
[root@localhost img_springboot]# docker push 172.16.50.37/repo-test/spring-boot-docker
The push refers to repository [172.16.50.37/repo-test/spring-boot-docker]
21353a604843: Pushed
53582412fb9f: Pushed
35c20f26d188: Pushed
c3fe59dd9556: Pushed
6ed1a81ba5b6: Pushed
a3483ce177ce: Pushed
ce6c8756685b: Pushed
30339f20ced0: Pushed
0eb22bfb707d: Pushed
a2ae92ffcd29: Pushed
1600: digest: sha256:f79fbf45dccb0e6cbd9b78ee07035fcfbdf1d9311cad5e2067d8d9c59af063fe size: 2424
登录到Harbor的web界面可以看到:
6. 拉取镜像
[root@localhost img_springboot]# docker pull 172.16.50.37/repo-test/spring-boot-docker:1600
1600: Pulling from repo-test/spring-boot-docker
Digest: sha256:f79fbf45dccb0e6cbd9b78ee07035fcfbdf1d9311cad5e2067d8d9c59af063fe
Status: Image is up to date for 172.16.50.37/repo-test/spring-boot-docker:1600