转载 江南一点雨 一键部署docker
一键部署 Spring Boot 到远程 Docker 容器,就是这么秀!
不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案。
不同于传统的单体应用,微服务由于服务数量众多,在部署的时候出问题的可能性更大,这个时候,结合 Docker 来部署,就可以很好的解决这个问题,这也是目前使用较多的方案之一。
将 Spring Boot 项目打包到 Docker 容器中部署,有很多不同的方法,今天松哥主要来和大家聊一聊如何将 Spring Boot 项目一键打包到远程 Docker 容器,然后通过运行一个镜像的方式来启动一个 Spring Boot 项目。
至于其他的 Spring Boot 结合 Docker 的用法,大家不要着急,后续的文章,松哥会和大家慢慢的一一道来。
1.准备工作
1.1 准备 Docker
我这里以 CentOS7 为例来给大家演示。
首先需要在 CentOS7 上安装好 Docker,这个安装方式网上很多,我就不多说了,我自己去年写过一个 Docker 入门教程,大家可以在公众号后台回复 Docker
获取教程下载地址。
Docker 安装成功之后,我们首先需要修改 Docker 配置,开启允许远程访问 Docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service
文件,加入如下内容:
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
如下图:
配置完成后,保存退出,然后重启 Docker:
systemctl daemon-reload
service docker restart
Docker 重启成功之后,Docker 的准备工作就算是 OK 了。
1.2 准备 IDEA
IDEA 上的准备工作,主要是安装一个 Docker 插件,点击 File->Settings->Plugins->Browse Repositories
如下:
点击右边绿色的 Install 按钮,完成安装,安装完成之后需要重启一下 IDEA。
IDEA 重启成功之后,我们依次打开 File->Settings->Build,Execution,Deployment->Docker
,然后配置一下 Docker 的远程连接地址:
配置一下 Docker 的地址,配置完成后,可以看到下面有一个 Connection successful 提示,这个表示 Docker 已经连接上了。
如此之后,我们的准备工作就算是 OK 了。
2.准备项目
接下来我们来创建一个简单的 Spring Boot 项目(只需要引入 spring-boot-starter-web
依赖即可),项目创建成功之后,我们再创建一个普通的 HelloDockerController
,用来做测试,如下:
@RestController
public class HelloDockerController {
@GetMapping("/hello")
public String hello() {
return "hello docker!";
}
}
这是一个很简单的接口,无需多说。
3.配置 Dockerfile
接下来,在项目的根目录下,我创建一个 Dockerfile ,作为我镜像的构建文件,具体位置如下图:
文件内容如下:
FROM hub.c.163.com/library/java:latest
VOLUME /tmp
ADD target/docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
这里只有简单的四行,我说一下:
- Spring Boot 项目的运行依赖 Java 环境,所以我自己的镜像基于 Java 镜像来构建。
- 考虑到 Docker 官方镜像下载较慢,我这里使用了网易提供的 Docker 镜像。
- 由于 Spring Boot 运行时需要 tmp 目录,这里数据卷配置一个 /tmp 目录出来。
- 将本地 target 目录中打包好的 .jar 文件复制一份新的 到 /app.jar。
- 最后就是配置一下启动命令,由于我打包的 jar 已经成为 app.jar 了,所以启动命令也是启动 app.jar。
这是我们配置的一个简单的 Dockerfile。
4.配置 Maven 插件
接下来在 pom.xml 文件中,添加如下插件:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<dockerHost>http://192.168.66.131:2375</dockerHost>
<imageName>javaboy/${project.artifactId}</imageName>
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<forceTags>true</forceTags>
<dockerDirectory>${project.basedir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
这个插件的配置不难理解:
- 首先在 execution 节点中配置当执行 mvn package 的时候,顺便也执行一下 docker:build
- 然后在 configuration 中分别配置 Docker 的主机地址,镜像的名称,镜像的 tags,其中 dockerDirectory 表示指定 Dockerfile 的位置。
- 最后 resource 节点中再配置一下 jar 的位置和名称即可。
OK,做完这些我们就算大功告成了。
5.打包运行
接下来对项目进行打包,打包完成后,项目会自动构建成一个镜像,并且上传到 Docker 容器中,打包方式如下:
打包过程会稍微有一点旧,因为还包含了镜像的构建,特别是第一次打包,需要下载基础镜像,会更慢一些。
部分打包日志如下(项目构建过程):
项目打包成功之后,我们就可以在 Docker 容器中看到我们刚刚打包成的镜像了,如下:
5.1 运行方式一
此时,我们可以直接在 Linux 上像创建普通容器一样创建这个镜像的容器,然后启动,执行如下命令即可:
docker run -d --name javaboy -p 8080:8080 javaboy/docker:0.0.1
启动成功之后,我们就可以访问容器中的接口了。
但是这种操作显然还是有点麻烦,结合我们一开始安装的 Docker 插件,这个运行步骤还可以做进一步的简化。
5.2 运行方式二
大家注意,此时我们的 IDEA 中多了一个选项,就是 docker,如下:
点击左边的绿色启动按钮,连接上 Docker 容器,连接成功之后,我们就可以看到目前 Docker 中的所有容器和镜像了,当然也包括我们刚刚创建的 Docker 镜像,如下:
此时,我们选中这个镜像,右键单击,即可基于此镜像创建出一个容器,如下图:
我们选择 Create container,然后填入容器的一些必要信息,配置一下容器名称,镜像 ID 会自动填上,暴露的端口使用 Specify 即可,然后写上端口的映射关系:
配置完成后,点击下方的 run
按钮,就可以开始运行了。运行日志如下:
注意,这个日志是在 Docker 的那个窗口里打印出来的。
项目运行成功之后,在浏览器输入远程服务器的地址,就可以访问了:
如此之后,我们的 Spring Boot 项目就算顺利发布到远程 Docker 容器中了。
好玩吗?试试!
本文案例我已经上传到 GitHub,小伙伴们可以参考:https://github.com/lenve/javaboy-code-samples
转载 江南一点雨 一键部署docker的更多相关文章
- docker开启2376端口CA认证及IDEA中一键部署docker项目
嘿,大家好,今天更新的内容是docker开启2376端口CA认证及IDEA中一键部署docker项目... 先看效果 我们可以通过idea一键部署docker项目,还以通过idea的控制台实时查看容器 ...
- 一键部署 Docker Datacenter ---简化docker数据中心安装步骤
DDC 简介 2016年2月下旬,Docker发布了企业级容器管理和服务部署的整体解决方案平台-Docker Datacenter,简称DDC.DDC 有三个组件构成:1. Docker Univer ...
- 8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署
这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook 总要和一些数据库打交道吧,比如说 ...
- mac通过docker一键部署Jenkins
目录 mac通过docker一键部署Jenkins 一.前言 二.系统配置 三.安装步骤 Dockerhub查看镜像地址 1.一键安装 1.1.下载脚本 1.2.安装程序 1.2.1.安装程序详情 1 ...
- mac通过docker一键部署MySQL8
目录 mac通过docker一键部署MySQL8 一.前言 二.系统配置 三.安装步骤 Dockerhub查看镜像地址 1.一键安装 1.1.克隆脚本 1.2.安装程序 1.2.1.安装程序详情 1. ...
- mac通过docker一键部署Nexus3
目录 mac通过docker一键部署Nexus3 一.前言 二.系统配置 三.安装步骤 1.Dockerhub查看镜像地址 2.一键安装 2.1.克隆脚本 2.2.安装程序 2.2.1.程序安装详情 ...
- Docker Compose 一键部署LNMP
Docker Compose 一键部署LNMP 目录结构 [root@localhost ~]# tree compose_lnmp/ compose_lnmp/ ├── docker-compose ...
- Docker Compose 一键部署Nginx代理Tomcat集群
Docker Compose 一键部署Nginx代理Tomcat集群 目录结构 [root@localhost ~]# tree compose_nginx_tomcat/ compose_nginx ...
- Docker Compose 一键部署多节点爬虫程序
Docker Compose 一键部署多节点爬虫程序 目录结构 [root@localhost ~]# tree compose_crawler/ compose_crawler/ ├── cento ...
随机推荐
- Mybatis连接查询返回类型问题
一对一映射 public class Card { private Integer id; private String num; private Student student; //重要 publ ...
- 【iOS】ARC & MRC
iOS 项目类型,是 ARC 还是 MRC 未完……
- jenkins弱口令漏洞
jenkins弱口令漏洞 一.漏洞描述 通过暴力破解管理控制台,如果爆破成功,可获得后台管理权限.操作后台,后台可通过脚本命令行功能执行系统命令,如反弹shell等,低权限可以通过创建控制台输出方式执 ...
- 7z 命令行方式生成自解压exe
一.下载 7z是一个免费的工具,除了通过命令行的方式提供各种文件.压缩包相关的操作外,还提供了一种方式可以打出自解压的exe程序.该程序从运行到结束经历了三个流程: (1) 解压文件到用户临时目录: ...
- 疯子的算法总结(二) STL Ⅰ 算法 ( algorithm )
写在前面: 为了能够使后续的代码具有高效简洁的特点,在这里讲一下STL,就不用自己写堆,写队列,但是做为ACMer不用学的很全面,我认为够用就好,我只写我用的比较多的. 什么是STL(STl内容): ...
- js中slice和splice的区别
言简意赅,直接上货. slice():该方法会返回一个新的数组,强调:新数组,并不会影响原来的数组.先来看看语法咋说:arrayObject.slice(start,end).其中,start必需,e ...
- MyBatis 简介与入门
简介 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.My ...
- 8、大型项目的接口自动化实践记录----DB分别获取预期结果、实际结果
上一篇实现数据分离升级版--从DB获取数据,以及对应的请求实现,作为一个case,还缺少了预期结果与实际结果的获取及对比.因为前面的文章已经说过接口返回值的获取及对比,所以这篇不说这块了,这篇说一下D ...
- 【Java例题】7.3 线程题3-素数线程
3.素数线程.设计一个线程子类,依次随机产生10000个随机整数(100-999):再设计另一个线程子类,依次对每一个随机整数判断是不是素数,是则显示:然后编写主类,在主函数中定义这两个线程类的线程对 ...
- 【Java例题】3.5 级数之和
5. 计算级数之和: y=3*1!/1-3^2*2!/2^2+3^3*3!/3^3-...+ (-1)^(n-1)*3^n*n!/n^n. 这里的"^"表示乘方,"!&q ...