DOCKER 学习笔记3 使用Docker部署SpringBoot

DOCKER 学习笔记3 使用Docker部署SpringBoot

前言

Springboot 可谓是当代Web项目当中的一股清流。不管是控制反转、依赖注入、切面编程。使用起来非常的得心应手,SpringBoot 最大的特点就是约定大于配置减少繁琐的配置。能自动化加载需要的配置项,大大减少程序员的配置功能。不再在繁琐的XML里面配置一大堆东西。也非常难受。

Docker 与Springboot项目结合起来,最好的使用容器的方法就是:

  • 各尽其责,一个容器负责一个功能
  • 减少容器镜像大小。容器里面除去应用的依赖以外不需要其他冗余。
  • 容器轻量化

Docker-Springboot

还是按照构建Springboot 的方式。访问 https://start.spring.io/
选择自己的JAVA版本以及Springboot 版本下载即可。

解压导入。就手写一个简单的控制器,访问 http://localhost:8080/ 就返回一段话即可。

@RestController
@RequestMapping
public class DockerController {

    @GetMapping("/")
    public String index() {
        return "Hello Docker-spring";
    }

}

POM 文件加入Docker 支持

在POM 插件中引入maven对于Docker 的支持插件。并设置Dockerfile文件所在的文件夹(上下文文件夹)以及设置镜像的镜像名称


<properties>
	<docker.image.prefix>springboot</docker.image.prefix>
</properties>

<plugin>
	<groupId>com.spotify</groupId>
	<artifactId>docker-maven-plugin</artifactId>
	<version>1.0.0</version>
	<configuration>
		<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
		<dockerDirectory>src/main/docker</dockerDirectory>
		<resources>
			<resource>
				<targetPath>/</targetPath>
				<directory>${project.build.directory}</directory>
				<include>${project.build.finalName}.jar</include>
			</resource>
		</resources>
	</configuration>
</plugin>

创建 Dockerfile

在配置文件中我们设置的是src/main/docker
因此在main文件夹下创建一个docker 文件夹。并新建一个Dockerfile文件


## 基础镜像
FROM openjdk:8-jdk-alpine

## 设置挂载点
VOLUME /tmp

## 复制并修改重命名
ADD docker-springboot-1.0.jar app.jar

## 设置启动参数
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

简单说下:

  • FROM 用于指定基础镜像,当然运行Springboot 肯定需要java运行环境 openjdk:8-jdk-alpine
  • VOLUME 用于挂载
  • ADD 用于复制,将上下文内的 docker-springboot-1.0.jar 复制到镜像内,并改名为app.jar
  • ENTRYPOINT 详见下方

VOLUME 命令

用于定义匿名卷,用于创建挂载点,比如 VOLUME /tmp 就会向容器内挂载一个 /tmp 目录,为什么需要这个目录,因为springboot 内置的tomcat 使用的是 /tmp 作为工作目录。使用这个命令后。产生的效果是:在宿主主机docker 的工作目录Docker Root Dir: /var/lib/docker 创建一个临时文件,将这个文件链接到容器的 /tmp 下。

ADD 命令

ADD 命令用于在构建镜像时,复制上下文中的文件到镜像内。
格式:

ADD <源路径>... <目标路径>
ADD ["<源路径>",... "<目标路径>"]

ENTRYPOINT 命令

ENTRYPOINT 命令用于给容器配置一个可执行的程序。也可理解为容器的默认程序,就好比这个容器运行着,它里面肯定需要跑一个东西吧。和CMD 命令有相似之处。

不同点

  • CMD 命令可以被覆盖,若执行 docker run <image> <command> 后面跟的命令<command>则会覆盖CMD 命令的内容。
  • ENTRYPOINT 只允许在Dockerfile 当中出现一次。多指定则会覆盖。

可以通过 docker run --entrypoint 重写容器入口点

Docker 部署环境

windows 构建特别吃力。所以选择将源程序上传Linux 服务器进行构建镜像。
我这里上传码云 需要的小伙伴可以直接下载构建:

https://gitee.com/mrc1999/springboot-docker

安装JDK

yum install java-1.8.0-openjdk

## 检查安装情况
java -version

安装GIT

yum install git

git version

安装maven

yum install maven

mvn -v

通过以上的操作,我们已经安装了基本的构建环境,当然docker 我就不说了,之前的文章已经教大家配置加速以及安装了。maven 在安装后,也需要配置阿里云的中央仓库,这样下载依赖会快很多!!

部署docker

## 拉取远程代码
git clone https://gitee.com/mrc1999/springboot-docker.git

cd springboot-docker

## 通过maven 进行构建jar文件
mvn package

## 启动jar 文件进行测试 是否启动有误
java -jar target/docker-springboot-1.0.jar


## 构建镜像
mvn package docker:build

[INFO] Building image springboot/docker-springboot
Step 1/4 : FROM openjdk:8-jdk-alpine
 ---> a3562aa0b991
Step 2/4 : VOLUME /tmp
 ---> Using cache
 ---> f4498cadadb0
Step 3/4 : ADD docker-springboot-1.0.jar app.jar
 ---> d15f2d616127
Removing intermediate container f29f59469095
Step 4/4 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
 ---> Running in 8afde38ee3e4
 ---> 1d5ac55f0a92
Removing intermediate container 8afde38ee3e4
Successfully built 1d5ac55f0a92
[INFO] Built springboot/docker-springboot
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20.931s
[INFO] Finished at: Sat Feb 08 14:43:28 CST 2020
[INFO] Final Memory: 29M/88M
[INFO] ------------------------------------------------------------------------

查看镜像

## 查看是否已经构建成功
docker images

## 尝试运行
docker run -d -p 8080:8080 springboot/docker-springboot


## 查看运行情况
docker ps

image.png

image.png

参考

https://www.cnblogs.com/ityouknow/p/8599093.html

码云示例

https://gitee.com/mrc1999/springboot-docker

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×