容器 & 服务:一个Java应用的Docker构建实战
系列文章:
一 概述
系列文章的前面几篇,介绍了一些基础概念和Jenkins的docker部署、构建实例,本篇将开始做第一个demo应用,使用idea的docker插件对Java应用执行构建、发布。
二 环境依赖
2.1 操作系统
本地开发环境是macos系统,信息为:
Darwin bogon 18.6.0 Darwin Kernel Version 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/RELEASE_X86_64 x86_64
2.2 开发工具
IntelliJ IDEA,我使用的版本是Ultimate Edition 2018.3版本。
2.3 JDK
本地使用的是1.8.0_212
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
2.4 Docker
示例使用的是本地docker,安装了docker的mac版。版本信息:

三 准备工作
3.1 IDEA安装Docker插件
当前版本的Idea插件安装,是在Intellij Idea->Preference,在Plugins右边,选择Marketplace,在搜索框搜索docker并点击install,等待安装完成,重启idea即可。

3.2 工程代码
为了快速开发,示例选择使用SpringBoot单体应用,示例代码地址:git@github.com:flamingstar/dockerdemo.git
代码核心是一个DockerDemoApplication.java,启动SpringBootApplication并暴露一个index接口:
package com.flamingstar.docker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DockerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DockerDemoApplication.class, args);
}
@RequestMapping("/index")
public String index(){
return "Hello! This is your first docker demo";
}
}
依赖配置文件pom.xml:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.7.RELEASE
com.bolingcavalry
dockerdemo
1.0.0-SNAPSHOT
dockerdemo
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
四 docker文件配置
如果是通常的本地启动,在Edit Configurations直接配置Spring Boot应用就可以了:

因为本文是要制作Docker镜像,并启动容器运行应用,所以需要创建Dockerfile,并使用docker方式运行。
4.1 创建Dockerfile
再描述一下Dockerfile:Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
我们在工程根目录下创建Dockerfile,内容如下(示例代码git中已经包含):
# Docker image for springboot application
# VERSION 1.0.0
# Author: flamingstar
### 基础镜像,使用alpine操作系统,openjkd版本8u201
FROM openjdk:8u201-jdk-alpine3.9
#作者
MAINTAINER flamingstar
#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
#声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME /tmp
#应用构建成功后的jar文件被复制到镜像内,指定名称为dockerdemo.jar
ADD target/dockerdemo-1.0.0-SNAPSHOT.jar dockerdemo.jar
#启动容器时的进程
ENTRYPOINT ["java","-jar","/dockerdemo.jar"]
#暴露8080端口
EXPOSE 8080
4.2 配置docker启动
在Edit Configurations编辑Run/Debug Configurations时,添加一个Docker配置,需要配置的内容如下:

重点有上面标红的前4项内容:
1)指定Dockerfile位置;
2)镜像名称(Image tag),我们设置为dockerdemoapplication;
3)容器名称(dockerdemoapplication),启动时的容器名称
4)设置绑定端口,这里包括两个端口,一个是我们访问这个应用的服务端口,还有一个是docker容器内暴露端口。

五 启动效果
如下图,我们点击上方的demo右边 run 箭头,就可以启动应用。

在左下方标红的是docker窗口,启动后我们可以看到包含的镜像和容器信息。从中可以找到我们当前应用创建的镜像,和启动的容器。


浏览器中,我们输入: http://localhost:18080/index
可以查看到接口返回:

至此,第一个docker应用发布结束。
附录
docker镜像查询,可以使用https://hub.docker.com/,例如在本示例的Dockerfile,我们依赖openjdk,那么使用的镜像在docker hub中搜索方式:

查看Tags:

在下方列表中就可以找到所需的tag信息和对应的docker pull 命令:
