Docker部署SpringBoot应用
1.前言
一直以来都是直接使用的阿里云部署了Spring Cloud应用程序,但是实际上,部分的微服务总是被系统莫名其妙的杀死,于是就总会使程序莫名其妙的无法运行,为此,我编写了定时检查任务的脚本,如果发现某一个进程死掉了,就立马启动起来,同时我还使用了Nginx的负载均衡功能,弄了多台虚拟机进行程序的部署,但是最后还是不理想,为什么嗯?因为其中的三台虚拟机是在一个服务器上的HyperV上创建出来的,其实只要是这台服务器挂掉了,那么这个集群也就挂掉了,没办法,条件有限啊,怎么办呢?我尝试使用了Docker的方式进行部署单应用,这样可能即便另一个集群坏掉了,可以快速的启动这个备用的节点。
当然,上面的都是废话,因为进程被杀死,测试不充分就上线的问题,我已经被老板骂过很多次了,虽然不是我的问题,但是他就认为是我的问题,导致我莫名的气愤,拿人钱财,替人消灾,那有什么办法呢?言归正传好了。
1.docker 创建 jdk 镜像
2.Docker使用DockerFile创建java镜像
3.docker 使用教程4-(Docker创建Java容器运行SpringBoot项目)
4.初试Docker 搭建SpringBoot 项目 这里单纯的使用了java8的docker镜像,然后创建了SpringBoot项目
2.目标
这次的目标,主要包括:
- 创建docker镜像
- 安装openjdk13
- 安装nginx
- 安装redis
- 上传打包后的springboot程序和vue前端代码
- 运行前后端分离的项目
- 打包整个系统到docker镜像中
- 在其他系统中运行这个镜像
3.安装启动CentOS
docker的命令主要包括两大类,一类是容器操作,一类是镜像操作。
- 容器生命周期管理:run,start/stop/restart,kill,rm,pause/unpause,create,exec
- 容器操作:ps,inspect,top,attach,events,logs,wait,export,port
- 容器rootfs命令:commit,cp,diff
- 镜像仓库:login,pull,push,search
- 本地镜像管理:images,rmi,tag,build,history,save,load,import
- info|version:info,version
1 | ## 拉取最新版centos |
这里我就索性把容器的名称定位springboot吧
1.Docker启动一个Centos镜像 docker attach
2.Docker run 命令参数及使用 这里是英文解释,看着有点别扭
3.Docker run 命令 这里的中文解释,就舒服多了
4.docker常规操作——启动、停止、重启容器实例
5.docker run 和 start 的区别 docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start);docker start的作用是,重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。
6.Docker删除容器与镜像 删除所有停止的容器:docker container prune;
7.docker常规操作——删除容器实例、删除镜像 docker rm 容器ID或容器名;docker rmi 镜像ID或镜像名
8.docer run 、docker attach 与 docker exec的区别 docker run;创建和启动一个新的容器实例,操作对象是镜像,选项较多,如果你要创建和启动一个容器,只能用run;docker exec: 在已运行的容器中,执行命令,操作对象是容器,如果你要进入已运行的容器,并且执行命令,用exec;docker attach: 同样操作的是已运行的容器,可以将本机标准输入(键盘输入)输到容器中,也可以将容器的输出显示在本机的屏幕上,如果你想查看容器运行过程中产生的标准输入输出,用attach,但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。
9.添加和修改docker容器端口映射的方法 方法一:修改此容器的hostconfig.json文件中的映射端口;方法二:使用宿主机的iptable转发端口
10.Docker-端口映射
11.docker容器添加对外映射端口 方式一:将现有的容器打包成镜像,然后在使用新的镜像运行容器时重新指定要映射的端口;方式二:修改要端口映射的容器的配置文件;
12.docker:一个container映射多个端口到Host
4.安装JDK
新建了CentOS容器,并启动之后,首先要做的就是要进行文件拷贝,我这里就以安装jdk13为例,描述文件拷贝和安装jdk的方法。在windows10下,为了将下载的openjdk13的软件包拷贝到容器中,需要先停止容器,然后使用docker cp命令进行拷贝,然后再启动容器。
1 | ## 停止容器 |
接下来的就是配置java环境变量了
1 | ## 编辑/etc/profile文件 |
6.安装Maven
下载Maven,并复制到容器中,然后编辑profile文件,安装Maven。
1 | ## 编辑profile文件 |
5.安装nginx
可以使用yum安装,也可以使用源码安装,我选择了源码安装Nginx安装配置
1 | ## 安装仓库 |
6.安装redis
1 | ## 安装epel源 |
7.安装nacos
因为我的springboot使用到了springcloud,并且使用了阿里的Nacos作为注册中心,所以需要安装nacos,在官网下载二进制包,然后上传到容器中,进行配置文件的修改后,就可以启动了。当然也可以编写 /lib/systemd/system/nacos.service 文件,使用systemctl进行管理,设置开机启动等。
1 | ## 上传nacos安装包到容器中 |
因为nacos运行,会产生大量的日志文件,比如access日志,但是我们又不需要,所以需要关闭。日志排名最多的几个文件:
- 1.naming-server
- 2.naming-raft
- 3.config-memory
- 4.config-server
- 5.config-client-request
- 6.config-trace
(1) 编辑nacos/config/application.properties文件,将accesslog日志关闭
1 | server.tomcat.accesslog.enabled=false |
(2) 修改nacos/config/nacos-logback.xml文件,把其中的INFO和DEBUG级别,都改为ERROR
1 | <logger name="com.alibaba.nacos.cmdb.main" additivity="false"> |
(3) 修改客户端日志级别
这个其实是在使用nacos的客户端进行配置的,也就是在开发的时候的代码中进行配置,根据个人情况进行。
1 | logging: |
8.保存对容器的修改
当对容器进行修改之后,如果需要保存容器为镜像,保存为镜像之后,就可以重新进行run命令,运行一个新的容器,而不用丢失原有的修改内容了。
1 | ## -a :提交的镜像作者; |
1.docker保存对容器的修改 docker commit
2.Docker(七) - commit 将容器保存为镜像 docker commit [选项] [容器ID或容器名] [仓库名:标签]
3.Docker commit 命令
9.保存镜像为文件
创建了容器之后,安装了各种的软件和程序,保存为镜像之后,需要拷贝到另外的机器运行。
1 | ## 导出容器,到当前目录 |
1.docker 拷贝镜像文件
2.导出docker镜像tar再次导入后启动报错 简单介绍下docker导出和导入镜像,打包镜像的时候有两种,一是把容器打包成镜像,二则是把镜像打包,这两种打包形式的主要区别在于通过docker save打包镜像可以保存历史记录,而通过docker export则会丢失历史信息。镜像导入命令是需要配对,docker export 和 docker import, docker save 和 docker load。
3.docker保存镜像报错:Cowardly refusing to save to a terminal. Use the -o flag or redirect.
4.导出和导入
5.Docker - 实现本地镜像的导出、导入(export、import、save、load) 两种方案的差别:文件大小不同、是否可以对镜像重命名、是否可以同时将多个镜像打包到一个文件中、是否包含镜像历史、应用场景不同
10.部署微服务
我部署微服务的时候,都是在阿里云上直接部署的,我越是开发微服务,越是觉得非常的不合适,因为微服务包含的东西太多了,每一个应用程序可能都需要一个jar,那么部署的时候就会非常的困难,这个时候怎么办呢?
1.【原创】微服务为什么一定要用docker 你说虚拟机消耗资源多?绝大部分公司的服务器资源利用率应该都不到 50%,大量的CPU、内存、本地磁盘都是常年浪费的,所以 虚拟机 的额外开销不过是浪费了原本就在浪费的资源罢了。所以笔者认为,对于传统应用来说,使用和不使用Docker可能并不能直接给企业带来好处,相反使用中遇到了问题肯定会给企业带来麻烦,对于传统企业来说,不要盲目跟风,VM虚拟机其实够用了!。
2.关于容器、微服务、docker 的十大问题
3.Docker 部署 SpringCloud 微服务(docker-compose 编排微服务高可用案例)
4.十分钟学会用docker部署微服务