使用Docker容器部署SpringBoot项目

Docker容器化技术,使得部署变得平滑。再也不需要维护软件运行所需的复杂环境。Docker和现代化的微服务,敏捷开发,快速迭代和交付的要求非常匹配。
这篇文章实践从安装Docker开始,到将一个SpringBoot项目部署到Docker容器中。
<!--more-->安装Docker CE(Community edition)
我这里使用的环境是Ubuntu18.04
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ systemctl enable docker
$ systemctl start docker
准备SpringBoot工程
这里我使用Spring官方的Docker示例项目
git clone https://github.com/spring-guides/gs-spring-boot-docker.git
Dockerfile
SpringBoot的Dockerfile有两种
简单版的如下:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
这是典型的SpringBoot项目启动方式
复杂版的如下:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]
这是将lib和src分离的方式,有点像展开的jar
我这里选择上面简单版的,简洁和性能之间我选简洁!
基于maven构建Docker镜像
使用Maven的话有Spotify构建的dockerfile-maven-plugin插件
<!-- tag::plugin[] -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.9</version>
<executions>
<execution>
<id>default</id>
<phase>install</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
<!-- end::plugin[] -->
- 添加了两个maven任务,build用户构建docker镜像,push用于推送docker镜像。
- 添加了构建参数
buildArgs>JAR_FILE传递给Dockerfile。 - 添加了版本号作为镜像tag
打包Docker镜像本身是需要docker环境的,于是有一种方法是开启remote API 到这里其实就已经可以发布程序到DockerHub了,但实际项目中,我们不想发布私人镜像到DockerHub,那么我们需要建立私人的Docker仓库。
开启remote API远程构建镜像
Docker是CS模式,Docker的服务是支持通过Http远程访问的。通过开启remote API即可远程进行访问。
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376
但要注意的remote API是需要进行TSL加密的。否则存在未授权访问漏洞,会被黑客利用,植入挖矿程序(别问我怎么知道的)。
建立Docker私人仓库(Docker Registry)
具体方式是添加一个仓库镜像
$ docker run -d -p 5000:5000 --restart always --name registry registry:2
然后就可以:
$ docker pull ubuntu
$ docker tag ubuntu localhost:5000/ubuntu
$ docker push localhost:5000/ubuntu
为了安全,创建的私有仓库也要添加Https
总结
使用docker部署SpringBoot工程时,正规的流程应该是:
- 为工程编写Dockerfile
- 添加Docker插件,构建Docker镜像
- push到公共或私有Docker仓库
- 拉取最新镜像并运行
本地无法构建时,应使用某种持续集成方法让编译机去负责出包和推送,不应该使用remote API这不是常规做法,而且有安全风险。 此外Docker官方提供了安全的私有Docker仓库,少量使用是免费的。