Spring官网上有一篇Getting Start,介绍了如何使用Docker发布Spring Boot应用,算是比较详细了,不过有些细节没有提及到,而且官网的入门手册是英文版。这里重新整理记录一下,算是给英文不好的小伙伴一个参考,也给自己留个备忘。
准备
需要的工具以及运行环境:
- JDK 1.8 or later
- Maven 3.0 +
- 你喜欢的IDE或其他文本编辑器
创建工程
首先,你需要创建一个Spring Boot工程,Spring Tool Suite和IntelliJ IDEA都自带插件可以创建,还有一种方式是从http://start.spring.io/上创建,推荐使用这种方式。填好表单中的Group Id
和Artifact Id
之后,点击Generate Project按钮就可以生成了,将下载后的工程导入到你喜欢的IDE中。
修改pom.xml
文件,添加docker-maven-plugin
:
1 |
|
docker-maven-plugin
插件用于将Spring Boot工程构建为Docker镜像:
imageName
表示Docker镜像名称,我们使用Docker的命名规范,命名为:springio/docker
dockerDirectory
表示Dockerfile的路径resource
表示在构建时需要的资源文件,这些文件和Dockerfile放在一起,这里只需要Spring Boot生成的jar文件即可。
打开DockerApplication.java
文件,修改成如下内容:
1 | package org.matrixstudio.springboot; |
编译并运行
执行如下命令运行Spring Boot工程:
1 | mvn package && java -jar target/docker-0.0.1-SNAPSHOT.jar |
打开浏览器,输入http://localhost:8080
,如果出现“Hello Docker World”说明运行成功。
注:运行上面的命令时,需要从Maven官方仓库中下载很多依赖包,国内网络不太稳定,下载速度较慢,可考虑使用第三方提供的镜像站,比如阿里的Maven镜像仓库。在pom.xml
中加入下面配置:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
容器化项目
首先要确保你的机器上安装了Docker,如果你的Docker安装在一台Linux服务器上,你需要将上面的Spring Boot工程上传到该服务器上,下面的步骤假设你是在Linux环境上操作。
创建Dockerfile
Docker使用一个名为Dockerfile
的文件来指定image层,所以我们首先需要创建一个Dockerfile
文件,执行下面的命令创建Dockerfile
文件:
1 | sudo tee src/main/docker/Dockerfile <<-'EOF' |
大概解释一下上面的命令:
VOLUME
指向了一个/tmp
的目录,由于Spring Boot使用内置的Tomcat容器,Tomcat默认使用/tmp
作为工作目录。效果就是在主机的/var/lib/docker
目录下创建了一个临时文件,并连接到容器的/tmp
。- 将项目的jar文件作为
app.jar
添加到容器 RUN
表示在新创建的镜像中执行一些命令,然后把执行的结果提交到当前镜像。这里使用touch
命令来改变文件的修改时间,Docker创建的所有容器文件默认状态都是“未修改”。这对于简单应用来说不需要,不过对于一些静态内容(比如:index.html
)的文件就需要一个“修改时间”。- 为了缩短Tomcat的启动时间,我们添加一个
java.security.egd
的系统属性指向/dev/urandom
作为ENTRYPOINT
。
构建Docker镜像
运行下面的命令构建Docker镜像:
1 | mvn package docker:build |
构建完成后,运行下面的命令查看:
1 | sudo docker images |
结果为:
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
可以看到我们构建的镜像已经出现了,下一步就是运行该镜像。
运行Docker镜像
执行下面的命令来运行上一步构建的Docker镜像:
1 | sudo docker run -p 8080:8080 -t springio/docker |
如果不出意外,你将看到下面的输出内容:
1 | . ____ _ __ _ _ |
执行以下命令,查看正在运行的Docker容器:
1 | sudo docker ps |
可以看到已经有一个Docker容器在运行了:
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
现在输入http://localhost:8080
可以查看到“Hello Docker World”结果。
如果要停止容器,可以执行下面的命令:
1 | sudo docker stop 00e |