前言
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 liunx机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker自2013年以来非常火热,因为它能把开发、测试、运维紧密的联系起来。spring boot又能很好的融合Docker,让我们看一下spring boot是怎样与Docker结合的吧。
一、创建新项目
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.github.carter659groupId> <artifactId>spring12artifactId> <version>0.0.1-SNAPSHOTversion> <packaging>jarpackaging> <name>spring12name> <url>http://maven.apache.orgurl> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>1.4.3.RELEASEversion> parent> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <java.version>1.8java.version> <docker.image.prefix>springbootdocker.image.prefix> properties> <dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> <plugin> <groupId>com.spotifygroupId> <artifactId>docker-maven-pluginartifactId> <version>0.4.11version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}imageName> <dockerDirectory>src/main/dockerdockerDirectory> <resources> <resource> <targetPath>/targetPath> <directory>${project.build.directory}directory> <include>${project.build.finalName}.jarinclude> resource> resources> configuration> plugin> plugins> <finalName>spring12finalName> build> project>
properties节点中设置docker镜像的前缀“springboot”:
<docker.image.prefix>springbootdocker.image.prefix>
加入maven插件“docker-maven-plugin”:
<plugin> <groupId>com.spotifygroupId> <artifactId>docker-maven-pluginartifactId> <version>0.4.11version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}imageName> <dockerDirectory>src/main/dockerdockerDirectory> <resources> <resource> <targetPath>/targetPath> <directory>${project.build.directory}directory> <include>${project.build.finalName}.jarinclude> resource> resources> configuration> plugin>
package com.github.carter659.spring12; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * 博客出处:http://www.cnblogs.com/GoodHelper/ * */ @SpringBootApplication @RestController public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } @GetMapping("/") public String index() { return "你好,docker"; } }
创建“src/main/docker/Dockerfile”文件:
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD spring12.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
FROM为使用哪个镜像
VOLUME为挂载路径
ADD为复制文件到镜像中
RUN为初始化时运行的命令
ENV为设置环境变量
ENTRYPOINT为启动时运行的命令
项目结构如图:
二、部署Docker
选择一个linux系统,如ubuntu或centos,在此之前需安装jdk和maven
1.安装docker环境:
ubuntu为:
$ apt-get install docker.io -y
centos为:
$ yum install docker-io -y
2.生成镜像
下面以ubuntu为例
$ mvn package docker:build
3.查看镜像
$ docker images
发现了“springboot/spring12”,
其中“springboot”是之前设置的docker镜像前缀“
“spring12”是生成的文件名“
4.运行镜像
$ docker run -p 8080:8080 -t springboot/spring12
输入网址测试:
docker的部署基本完成了,在生成镜像后也可以加入“-DpushImage”参数,再生成完毕的时候把镜像推送的镜像仓库中
$ mvn package docker:build -DpushImage
总结
上述的实现方式并不完美,实际项目中还需要让spring boot应用在后台运行,并且能实现启动服务器后自动启动docker容器。其思路是,通常会使用supervisord来辅助完成,思路是在supervisord的配置文件中执行shell脚本。然而这同样不完美,而最好的做法是实现“持续集成”,其思路是使用jenkins来结合git钩子,当提交新版本的代码后,jenkins去执行shell脚本pull代码,然后maven打包,接下来生成最新版的docker镜像,最后推送新镜像和运行docker容器。
参考官方文档:http://spring.io/guides/gs/spring-boot-docker/
代码:https://github.com/carter659/spring-boot-12.git
如果你觉得我的博客对你有帮助,可以给我点儿打赏,左侧微信,右侧支付宝。
有可能就是你的一点打赏会让我的博客写的更好:)
返回玩转spring boot系列目录