本教程需要一台已安装了openjdk:8的docker的服务器,安装方法可以查看上一篇教程《天宫使用教程1 - docker安装与基础镜像下载》

springboot项目有3种打包方式,分别是:

  • Linux系统下的打包
  • idea的插件docker integration进行打包
  • 使用docker官方的maven插件进行打包

1. Dockerfile编写

打包docker镜像之前,先准备好springboot的部署包tiangongdemo.jar和Dockerfile文件。dockerfile文件内容如下:

#在上一篇教程下载的openjdk:8-alpine镜像基础上,进行打包
FROM openjdk:8-alpine 
#将tiangong-demo-0.0.1.jar放到基础镜像的根目录,并命名为hello.jar
ADD tiangong-demo-0.0.1.jar /hello.jar
#设置容器的时区,基础镜像的时区是GMT
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#启动容器之后,执行java -jar /hello.jar 命令
ENTRYPOINT ["java","-jar","/hello.jar"]

2. Centos下docker镜像打包

Centos环境打包docker镜像是最基础的操作,所有开发都应该掌握这个知识。
将准备好的tiangong-demo-0.0.1.jar和Dockerfile上传到服务器的同一目录下,这里我们将文件上传到了/docker-build 文件夹

[root@local docker-build]# ll
-rw-r--r--. 1 root       root       18684063 May 22 14:46 tiangong-demo-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 root       root            109 May 21 15:05 tiangong-demo-dockerfile

#用docker build命令对docker镜像进行打包
[root@local docker-build]# docker build -t tiangongdemo:0.0.1 . -f tiangong-demo-dockerfile 
Sending build context to Docker daemon 18.69 MB
Step 1/3 : FROM openjdk:8-alpine
 ---> a3562aa0b991
Step 2/3 : ADD tiangong-demo-0.0.1-SNAPSHOT.jar hello.jar
 ---> 0e7c6948b3f0
Removing intermediate container 8e2bcdd301db
Step 3/3 : ENTRYPOINT java -jar /hello.jar
 ---> Running in 682bdb19b809
 ---> c67dc7dcdc94
Removing intermediate container 682bdb19b809
Successfully built c67dc7dcdc94

docker build 命令解释:
-t 输入镜像的tag
-f 指定使用哪个Dockerfile文件
注意 tiangongdemo:0.0.1后面有个符号 . 代表当前目录

#查看docker镜像,此时已经多了一个新的镜像
[root@local docker-build]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tiangongdemo        0.0.1               c67dc7dcdc94        4 seconds ago       124 MB
docker.io/openjdk   8-alpine            a3562aa0b991        12 months ago       105 MB

引申知识点:如果此时再次执行docker build命令,images里面会出现相同id的image

#修改tag,但是jar包和Dockerfile不变,再次执行docker build
[root@local docker-build]# docker build -t tiangongdemo:0.0.2 . -f tiangong-demo-dockerfile 
Sending build context to Docker daemon 18.69 MB
Step 1/3 : FROM openjdk:8-alpine
 ---> a3562aa0b991
Step 2/3 : ADD tiangong-demo-0.0.1-SNAPSHOT.jar hello.jar
 ---> Using cache
 ---> 0e7c6948b3f0
Step 3/3 : ENTRYPOINT java -jar /hello.jar
 ---> Using cache
 ---> c67dc7dcdc94
Successfully built c67dc7dcdc94

#此时出现了2个id=c67dc7dcdc94的docker镜像,感兴趣的话可以自己去了解image id生成原理
[root@local docker-build]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
taingongdemo        0.0.1               c67dc7dcdc94        About a minute ago   124 MB
tiangongdemo        0.0.2               c67dc7dcdc94        About a minute ago   124 MB
docker.io/openjdk   8-alpine            a3562aa0b991        12 months ago        105 MB

3. idea插件或者maven插件打包镜像,需要开启Docker Remote API

docker remote api提供了与Docker守护进程进行集成的功能。开启remote api之后,用户可以远程进行docker镜像打包。

增加-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \ 重启docker

[root@local ~]# vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock\
          --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
          --default-runtime=docker-runc \
          --exec-opt native.cgroupdriver=systemd \
          --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
          --init-path=/usr/libexec/docker/docker-init-current \
          --seccomp-profile=/etc/docker/seccomp.json \
          $OPTIONS \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS \
          $ADD_REGISTRY \
          $BLOCK_REGISTRY \
          $INSECURE_REGISTRY \
	  $REGISTRIES
#重启docker
#重新加载配置文件
[root@local ~]# systemctl daemon-reload    
#重启服务
[root@local ~]# systemctl restart docker.service 
#查看端口是否开启
[root@local ~]# netstat -nlpt
#curl看是否生效
[root@local ~]# curl http://127.0.0.1:2375/info

开启api之后,记得打开防火墙

#在防火墙打开docker api端口: 
[root@local ~]# firewall-cmd --zone=public --add-port=2375/tcp --permanent

#reaload 防火墙规则: 
[root@local ~]# firewall-cmd --reload

4.idea的插件docker integration进行打包

打开idea的File->Settings->Plugins,如下图顺序搜索docker,安装idea的docker插件。

dockerfile打包springboot前后端 springboot docker打包_maven


安装好之后,在Settings里面搜索docker,可以看到以下界面,按照顺序配置docker的api地址。如果网络通,可以看到Connection successful的提示。

dockerfile打包springboot前后端 springboot docker打包_java_02


配置好api之后,可以在左下角找到docker控制台,点击绿色的运行键之后,看到刚才创建的两个tiangongdemo镜像。

dockerfile打包springboot前后端 springboot docker打包_jar_03


在springboot的项目根目录下(可以任意路径),创建文件夹docker(可以任意命名)。将打包好的jar包和Dockerfile文件放置在该目录下。Dockerfile文件内容和上文一致。

dockerfile打包springboot前后端 springboot docker打包_docker_04


此时可以利用idea的docker插件打包镜像,首先编写docker插件的运行配置,实际上就是配置docker build的参数。

dockerfile打包springboot前后端 springboot docker打包_docker_05

dockerfile打包springboot前后端 springboot docker打包_jar_06

注意不要配置容器运行参数,因为在idea插件运行容器,没有在Linux上运行容器好,也看不到容器出错日志。

配置好docker build参数后,点击运行按钮,开始创建docker镜像。

dockerfile打包springboot前后端 springboot docker打包_java_07


创建docker镜像的执行日志在控制台输出,日志和centos执行docker build是一样的。左侧可以看到刚刚创建的tiangongdemo:0.0.4镜像。

如果细心点会发现,右侧有properties按钮,点击按钮发现看到image id其实是一串很长的sha256的id,看到这里可以为大致猜到为什么0.0.1和0.0.2的镜像id一致了。

dockerfile打包springboot前后端 springboot docker打包_maven_08


右键点击镜像,可以对镜像进行删除等操作。

dockerfile打包springboot前后端 springboot docker打包_docker_09

5.maven的插件镜像打包

目前可以搜索到的docker maven插件有以下3个,大家可以去官网看看如何使用,或者参考网上教程。建议优先使用idea的插件。

插件名称

官方地址

docker-maven-plugin

https://github.com/spotify/docker-maven-plugin

docker-maven-plugin

https://github.com/fabric8io/docker-maven-plugin

docker-maven-plugin

https://github.com/bibryam/docker-maven-plugin