Docker是开发者的开放平台,它是一个机制,通过将每个应用程序打包到容器中来隔离依赖关系。容器是可扩展的,可更安全的使用和部署。Docker容器能够共享一个内核并共享应用程序库,因此容器比虚拟机具有更低的系统开销,只要用户愿意使用单一平台来提供共享的操作系统,容器可以更快,占用更少资源。
在本文中介绍如何在Docker容器中部署一个简单的Spring Boot应用,通过构建、部署过程来理解Docker的一些基本概念和操作命令。
1 Spring Boot应用
一个简单的Hello World应用。
1.1 Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
引入spring-boot-starter-web来创建一个Web应用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.2 主应用程序
@SpringBootApplication
public class FirtSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(FirtSpringBootApplication.class, args);
}
}
1.3 服务接口
RESTful服务接口:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "Hello World";
}
}
2 Docker安装
Docker是一个基于Linux内核构建、传输和运行的轻量级容器平台。Docker默认支持Linux平台,同时还通过使用Boot2Docker来支持Mac和Windows,它们运行在Virtual Box虚拟机之上。
本例中是在Windows系统中安装Docker。Windows环境分两种情况,一种是Windows 10 64位专业版,一种是其他版本(比如很多人仍然推崇的Win 7)。前者可以直接支持安装Docker原生版,性能最好,体验最佳;后者只能使用Docker官方提供的一种过度技术(Docker ToolBox),这种技术不得不依赖Oracle的Virtualbox以在你的系统里创建一个虚拟机用以模拟Linux运行环境。在低版本的windows上使用时你的处理器必须支持硬件虚拟化。
安装完毕后,Docker环境的虚拟IP是192.168.99.100。
3 部署应用
3.1 Spring Boot应用打包
在Spring Boot应用工程目录下执行mvn 打包命令:
mvn package spring-boot:repackage
工程的target目录里生成了一个jar包 firtSpringBoot-0.0.1-SNAPSHOT.jar。将jar包更名为firtSpringBoot-1.0.jar上传到Docker环境里。
3.2 Dockerfile文件
Dockfile原则上是一个批处理文件,包含了构建镜像的命令。将这些命令放入文件中并不是绝对必要的,因为我们可以将它们传递到命令行,只是使用文件更简单一些。
现在创建一个Dockerfile:
FROM alpine:edge
MAINTAINER peterwanghao.com
RUN apk add --no-cache openjdk8
VOLUME /tmp
ADD firtSpringBoot-1.0.jar firtSpringBoot.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/firtSpringBoot.jar"]
FROM:基础镜像。
MAINTAINER:用于声明作者。
RUN :目标系统中执行shell命令行。在这里,我们利用 Alpine Linux’s的包管理器apk安装java 8。
VOLUME :让你的容器访问宿主机上的目录。
ADD:ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。
EXPOSE :在这里我们告诉Docker,我们的应用程序使用哪个端口。当容器启动时,该端口将被发布到主机。
ENTRYPOINT :配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
3.3 创建镜像
在Dockerfile文件目录下运行docker build命令,这将下载基镜像并一条接一条地运行Dockerfile文件中的条目。创建的镜像的名字是first,标签1.0。--rm=true,在整个构建过程成功后删除中间环节的容器。
$docker build -t first:1.0 --rm=true .
使用docker images命令列出所有的镜像和它们的详细信息。
docker@default:~/first-spring-boot$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
first 1.0 02f67d8c308d 17 hours ago 119MB
hello-world latest e38bc07ac18e 6 weeks ago 1.85kB
alpine edge 5c4fa780951b 4 months ago 4.15MB
3.4 运行容器
接下来,我们将运行容器。使用下面的命令加载并运行容器。
docker run --name=first -p 8080:8080 -t first:1.0
使用docker ps命令列出正在运行的容器
docker@default:~/first-spring-boot$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fc3aef6e852 first:1.0 "java -jar /firtSpri 5 hours ago Up 5 hours 0.0.0.0:8080->8080/tcp first
3.5 测试
通过浏览器访问 http://192.168.99.100:8080/hello 显示“Hello World”。
4 结论
正如我们所看到的,我们现在能够建立自定义Docker镜像,运行一个Spring Boot应用程序在Docker容器中。有关构建文件的进一步阅读,可以参考官方的Dockerfile手册和Docker-compose.yml手册。