写点什么

容器 & 服务:一个 Java 应用的 Docker 构建实战

发布于: 2021 年 02 月 22 日
容器 & 服务:一个Java应用的Docker构建实战

系列文章:

容器 & 服务:开篇,压力与资源

容器 & 服务:Jenkins 本地及 docker 安装部署

容器 & 服务:Jenkins 构建实例


一 概述

系列文章的前面几篇,介绍了一些基础概念和 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@RestControllerpublic 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:

<?xml version="1.0" encoding="UTF-8"?><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 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.1.7.RELEASE</version>        <relativePath/>    </parent>    <groupId>com.bolingcavalry</groupId>    <artifactId>dockerdemo</artifactId>    <version>1.0.0-SNAPSHOT</version>    <name>dockerdemo</name>    <description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
复制代码

四 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版本8u201FROM openjdk:8u201-jdk-alpine3.9
#作者MAINTAINER flamingstar <xxx@qq.com>
#系统编码ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
#声明一个挂载点,容器内此路径会对应宿主机的某个文件夹VOLUME /tmp
#应用构建成功后的jar文件被复制到镜像内,指定名称为dockerdemo.jarADD 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 命令:


发布于: 2021 年 02 月 22 日阅读数: 147
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论 (3 条评论)

发布
用户头像
很详细!
2021 年 02 月 23 日 15:33
回复
感谢关注,后续一起学习啊~
2021 年 02 月 23 日 15:45
回复
用户头像
系列开始,即将发布下一篇实战文章,不只是当前的“玩具”。有问题大家可以随时在评论区留言,后续会进行解答和讨论。欢迎探讨~
2021 年 02 月 22 日 14:11
回复
没有更多了
容器 & 服务:一个Java应用的Docker构建实战