Docker 部署 Spring Boot

105 阅读4分钟

本文来自于【阿里云官方镜像站:developer.aliyun.com/mirror/?utm…

原文链接:developer.aliyun.com/article/754…

镜像下载、域名解析、时间同步请点击 阿里巴巴开源镜像站

一、Docker 简介

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 的主要用途:

提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。\

二、Docker 的安装(CentOS环境)

安装命令yum install docker
安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动service docker startchkconfig docker on#LCTT 译注:此处采用了旧式的 sysv 语法,如采用CentOS 7中支持的新式 systemd 语法,如下:systemctl  start docker.service
systemctl  enable docker.service
使用Docker 中国加速器vi  /etc/docker/daemon.json#添加后:{    "registry-mirrors": ["registry.docker-cn.com"],    "live-restore": true}
重新启动dockersystemctl restart docker\

输入 docker version 返回版本信息则安装正常。

docker version\

三、安装JDK

yum -y install java-1.8.0-openjdk*\

配置环境变量 打开 vim /etc/profile 添加以下内容

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64
export CLASSPATH=.:JAVAHOME/jre/lib/rt.jar:JAVA_HOME/jre/lib/rt.jar:JAVA_HOME/lib/dt.jar:JAVAHOME/lib/tools.jarexportPATH=JAVA_HOME/lib/tools.jarexport PATH=PATH:$JAVA_HOME/bin\

修改完成之后,使其生效

source /etc/profile\

输入java -version 返回版本信息则安装正常。

java -version\

四、安装 Maven

下载:mirror.bit.edu.cn/apache/mave… 解压

tar vxf apache-maven-3.6.3-bin.tar.gz\

移动

mv apache-maven-3.6.3 /usr/local/maven3\

修改环境变量, 在/etc/

MAVEN_HOME=/usr/local/maven3export MAVEN_HOMEexport PATH=PATH:{PATH}:{MAVEN_HOME}/bin\

执行source /etc/profile 使环境变量生效。

source /etc/profile\

输入maven -version 返回版本信息则安装正常。

maven -version\

五、创建 spring boot 项目

  1. pom.xml

        xsi:schemaLocation="maven.apache.org/POM/4.0.0 maven.apache.org/xsd/maven-4…    4.0.0

org.springframework.boot
spring-boot-starter-parent
2.2.4.RELEASE


com.easy
spring-boot-docker
1.0
jar
spring-boot-docker
Demo project for Spring Boot

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<docker.image.prefix>springboot</docker.image.prefix>



org.springframework.boot
spring-boot-starter-web


org.springframework.boot
spring-boot-starter-test
test





org.springframework.boot
spring-boot-maven-plugin



com.spotify
docker-maven-plugin
1.0.0

docker.image.prefix/{docker.image.prefix}/{project.artifactId}
src/main/docker


/
project.build.directory</directory>               <include>{project.build.directory}</directory>\                            <include>{project.build.finalName}.jar






\

  1. Dockerfile 配置

FROM openjdk:8-jdk-alpineVOLUME /tmpEXPOSE 8282ADD spring-boot-docker-1.0.jar app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]\

Dockerfile 文件介绍,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中:

FROM:表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载VOLUME:VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录EXPOSE:EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。ADD:拷贝文件并且重命名ENTRYPOINT:为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT

  1. 其它示例代码

DockerController.java

@RestControllerpublic class DockerController {    @RequestMapping("/")
public String index() {        return "Hello Docker!";
}
}\

DockerApplication.java

@SpringBootApplicationpublic class DockerApplication {    public static void main(String[] args) {
SpringApplication.run(DockerApplication.class, args);
}
}\

application.properties

server.port=8282\

六、使用 Docker 部署 Spring Boot 项目

将项目 docker 拷贝至服务器中,进入项目路径下进行打包测试。

#打包mvn package#启动java -jar target/spring-boot-docker-1.0.jar\

看到 Spring Boot 的启动日志后表明环境配置没有问题,接下来我们使用 DockerFile 构建镜像。

mvn package docker:build\

第一次构建可能有点慢,当看到以下内容的时候表明构建成功:

Step 1/5 : FROM openjdk:8-jdk-alpine
---> a3562aa0b991
Step 2/5 : VOLUME /tmp
---> Using cache
---> d070c927d0a7
Step 3/5 : EXPOSE 8282
---> Using cache
---> b16d14267527
Step 4/5 : ADD spring-boot-docker-1.0.jar app.jar
---> c4ddc409b458
Removing intermediate container c58c986e6b9a
Step 5/5 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
---> Running in d2b61fddd616
---> 13c600d3f625
Removing intermediate container d2b61fddd616
Successfully built 13c600d3f625
[INFO] Built springboot/spring-boot-docker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.273 s
[INFO] Finished at: 2020-03-25T10:05:04+08:00[INFO] ------------------------------------------------------------------------\

使用docker images命令查看构建好的镜像:

docker images\

REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
springboot/spring-boot-docker   latest              13c600d3f625        18 minutes ago      122 MB
docker.io/openjdk               8-jdk-alpine        a3562aa0b991        10 months ago       105 MB\

springboot/spring-boot-docker 就是我们构建好的镜像,下一步就是运行该镜像

docker run -p 8282:8282 -t springboot/spring-boot-docker\

启动完成之后我们使用docker ps查看正在运行的镜像:

docker ps\

CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                    NAMES
a626c3dbdb1b        springboot/spring-boot-docker   "java -Djava.secur..."   34 seconds ago      Up 34 seconds       0.0.0.0:8282->8282/tcp   suspicious_murdock\

可以看到我们构建的容器正在在运行,浏览器访问:http://192.168.0.x:8282/ ,页面出现“Hello Docker!” 说明使用 Docker 部署 Spring Boot 项目成功!

Hello Docker!