多种方式轻松搞定SpringBoot部署Docker

写在前面

如果觉得有所收获,记得点个关注和点个赞哦,非常感谢支持
在部署应用程序时,Spring Boot的灵活打包选项提供了很多选择。可以将Spring Boot应用程序部署到各种云平台,容器映像(例如Docker)或虚拟机/真实机上。这里我们就来探讨SpringBoot如果部署到Docker中。

我们都知道,在对 Kubernetes 微服务实践过程中,接触最多的肯定莫过于 Docker 镜像。Kubernetes是啥,我这里简单说明一下,Kubernetes 微服务简单说就是一群镜像间的排列组合与相互间调的关系,故而如何编译镜像会使服务性能更优,使镜像构建、推送、拉取速度更快,使其占用网络资源更少。更详细的可以自行查阅,这里就不做更详细的解释。

准备

这一篇文章,想着是主要把探讨的内容放在SpringBoot和Docker的结合上,所以不想用过多的篇幅讲解Docker安装以及SpringBoot的普通应用构建上,不过这些都是我们对本篇文章进行讲解之前的准备工作,所以我在这里贴出我之前写过的文章,如果没有安装Docker以及不知道怎么构建SpringBoot的普通应用的朋友,可以先跳转过去看,个人认为写的挺详细的。
Docker安装教程:这篇文章把Ubuntu、CentOS、Windows主流系统的安装方法详细的讲解了一遍,包括如何配置镜像加速等内容。
Docker新手宝典(必备):因为后面要将的内容要构建DockerFile,所以如果还不知道DockerFile是啥的朋友,可以看一下这篇文章。
详细SpringBoot教程之入门(一):这篇文章看完,就可以构建一个简单的hello world应用了。

  • 一个简单的SpringBoot2.x程序,里面就单纯的创建一个Controller控制器,可以访问http://localhost/index,如下
    在这里插入图片描述
  • Docker我使用的是19版本
  • 我的服务器用的是CentOS7系统

手动使用DockerFile构建

这里解释一下Dockfile,Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

首先,我们把上面的SpringBoot应用打包,使用Maven指令如下

mvn package

当然,你如果使用的是Idea作为dev的话,可以通过Maven工具打包,不需要输入指令,如下
在这里插入图片描述
这样就会将项目打包好了jar包,我这里打包的jar包改名为example.jar,更直观一点,然后接着我们到目标服务器上(注意了,服务器上要已经安装好了Docker),然后随便找个目录创建DockerFile文件,因为我用的是CentOS7,习惯在/var/tmp下创建,创建Dockerfile文件指令如下

touch Dockerfile

注意力,Dockerfile必须和Jar包在同一路径下,所以你在上传jar包的时候,要注意了。下面贴出DockerFile的内容,只是用最基本的构建指令,更复杂的可以熟悉之后,自行查阅DockerFile指令进行构建

FROM java:8
EXPOSE 8080
VOLUME /slm
ADD example.jar boot-docker.jar
RUN sh -c 'touch /boot-docker.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /boot-docker.jar" ]

这里稍微解释一下基本语法

  • FROM 基础镜像必要,代表你的项目将构建在这个基础上面
  • EXPOSE 允许指定端口转发
  • VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
  • ADD 将文件从路径 复制添加到容器内部路径 支持远程url 如果是远程url权限将会是600,我这里因为直接上传了,所以就服务器本机就可以了
  • ENV 可以用于为docker容器设置环境变量
  • ENTRYPOINT 指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。
  • CMD 和 ENTRYPOINT 都能用来指定开始运行的程序,而且这两个命令都有两种不用的语法:
CMD ["ls",''-l"]
CMD ls -l

编写好了DockerFile之后,我们开始构建镜像,指令如下

docker build -t boot-docker .

-t boot-docker 代表你要构建的名字

Sending build context to Docker daemon  16.81MB
Step 1/7 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/7 : EXPOSE 8080
 ---> Using cache
 ---> b2445bf62da8
Step 3/7 : VOLUME /slm
 ---> Using cache
 ---> b73d0b73b868
Step 4/7 : ADD example.jar boot-docker.jar
 ---> Using cache
 ---> 2b4868aafca9
Step 5/7 : RUN sh -c 'touch /boot-docker.jar'
 ---> Using cache
 ---> 816b59f199af
Step 6/7 : ENV JAVA_OPTS=""
 ---> Using cache
 ---> 784f033b9dd6
Step 7/7 : ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /boot-docker.jar" ]
 ---> Using cache
 ---> 92a0da91ea19
Successfully built 92a0da91ea19
Successfully tagged bootdocker:latest

我们可以看到已经构建完成,Successfully built 92a0da91ea19这句话指明了刚刚构建的镜像ID现在我们可以根据这个ID来进行操作。输入run命令来启动。

docker run -itd -p 8080:8080 --name example 92a0da91ea19
  • -d 表示后台运行
  • -p映射端口
  • –name 容器名称

已经运行成功访问接口。注意这里因为映射到了宿主机的端口所以访问的是宿主机的IP加端口,比如http://ip:8080/index

使用Maven构建

上面说了使用Dockerfile构建,现在使用Maven来构建,我们还是使用上面的DockerFile内容,我们在项目的目录下创建DockerFile,把上面DockerFIle内容复制过去,结构如下
在这里插入图片描述
在pom中加入docker构建依赖

<plugin>
	<!--新增的docker maven插件-->
	<groupId>com.spotify</groupId>
	<artifactId>docker-maven-plugin</artifactId>
	<version>0.4.13</version>
	<!--execution 节点中配置当执行 mvn package 的时候,顺便也执行一下 docker:build-->
	<executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
	<configuration>
		<!--Docker 的主机地址-->
		<dockerHost>http://192.168.66.131:2375</dockerHost>
		<!--镜像名字-->
		<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
		<!--DokcerFile文件地址-->
		<dockerDirectory>${project.basedir}</dockerDirectory>
		<!--镜像的 tags-->
		<imageTags>
            <imageTag>${project.version}</imageTag>
        </imageTags>
		<resources>
			<resource>
				<targetPath>/</targetPath>
				<directory>${project.build.directory}</directory>
				<include>${project.build.finalName}.jar</include>
			</resource>
		</resources>
	</configuration>
</plugin>

注意dockerDirectory还是要设置Dockerfile文件的路径,然后如果你不配置dockerHost的话,要把项目复制到Linux主机中,执行解压命令

unzip boot-docker.zip
cd boot-docker

执行命令:

mvn package docker:build

而如果配置了dockerHost的话
在这里插入图片描述

上面两种方式都开始构建build

[INFO] Building image boot-docker/boot-docker
Step 1/7 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/7 : EXPOSE 8080
 ---> Using cache
 ---> b2445bf62da8
Step 3/7 : VOLUME /slm
 ---> Using cache
 ---> b73d0b73b868
Step 4/7 : ADD boot-docker-0.0.1-SNAPSHOT.jar boot-docker.jar
 ---> Using cache
 ---> 2b4868aafca9
Step 5/7 : RUN sh -c 'touch /boot-docker.jar'
 ---> Using cache
 ---> 816b59f199af
Step 6/7 : ENV JAVA_OPTS=""
 ---> Using cache
 ---> 784f033b9dd6
Step 7/7 : ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /boot-docker.jar" ]
 ---> Using cache
 ---> 92a0da91ea19
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 92a0da91ea19
Successfully tagged boot-docker/boot-docker:latest
[INFO] Built boot-docker/boot-docker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.908s
[INFO] Finished at: Wed Jul 10 16:00:21 CST 2019
[INFO] Final Memory: 35M/86M
[INFO] ------------------------------------------------------------------------

接着就可以启动容器了

docker run -itd -p 8080:8080 --name example 92a0da91ea19

已经运行成功访问接口。注意这里因为映射到了宿主机的端口所以访问的是宿主机的IP加端口,比如http://ip:8080/index

使用Idea部署

沿用在Maven构建中的pom中的配置,此时我们的 IDEA 中多了一个选项,就是 docker,如下:
在这里插入图片描述
点击左边的绿色启动按钮,连接上 Docker 容器,连接成功之后,我们就可以看到目前 Docker 中的所有容器和镜像了,当然也包括我们刚刚创建的 Docker 镜像,如下:
在这里插入图片描述
此时,我们选中这个镜像,右键单击,即可基于此镜像创建出一个容器,如下图
在这里插入图片描述
我们选择 Create container,然后填入容器的一些必要信息,配置一下容器名称,镜像 ID 会自动填上,暴露的端口使用 Specify 即可,然后写上端口的映射关系:
在这里插入图片描述
配置完成后,点击下方的 run 按钮,就可以开始运行了。

应用容器化是近年来的热点。而且容器技术层出不穷,掌握应用的容器化技术还是很有必要的。今天我们一步一步从零利用 Docker 构建了一个 Spring Boot 容器 。希望对你有所帮助。

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于springbootdocker部署的微服务架构.zip j360系列之spring-boot微服务架构和docker部署 ##介绍## j360-order底层服务提供接口 使用restAPI提供服务 j360-deliver提供UI操作界面,调用底层j360-order提供服务 构建 Java 1.7+(官方建议1.8) Maven 3.2+ Spring 4.1.3 Spring-boot 1.3.0.BUILD-SNAPSHOT j360 1.0.0.BUILD-SNAPSHOT ##j360-order## 直接使用Spring data jpa,省点力气写dao :) ###两种rest风格### @RepositoryRestResource(collectionResourceRel = "expresss", path = "expresses") +spring.data.rest.base-path=/api http://localhost:8080/api/expresses/1 通过dao层接口映射到api接口,类似于ws,可以查看所有的接口列表及类型 @RestController+@RequestMapping("/expresses") http://localhost:8080/expresses/1 常规rest,推荐 也可以使用hateoas来实现超媒体的rest效果 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-hateoas</artifactId> </dependency> ##j360-deliver## RestTemplate作为restAPI调用工具,需要定义@Bean ExpressApiService使用netflix.hystrix确保分布式系统的持久性 ###测试## 单元测试 ExperssServiceTest 测试api接口调用实现 测试Hystrix在远程调用中的封装 使用restapi或许order的map属性 1、expressServiceTest 直接或许 2、expressApiTest 封装hystrix进行读取 3、通过aop-hystrix无侵入式读取 MockMvc测试 测试用户界面调用接口 ##j360-profile## hateoas演示案例 hateoas restful

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值