为女朋友写一个小程序(五)— —如何用docker简化部署
为女朋友写一个小程序(一)— —目的与需求
为女朋友写一个小程序(二)— —数据库设计
为女朋友写一个小程序(三)— —基于springboot的服务器端接口设计与实现
为女朋友写一个小程序(四)— —前端小程序的设计与实现
为女朋友写一个小程序(五)— —如何用docker简化部署(本文)
为女朋友写一个小程序(六)— —结合docker实现devOps
为女朋友写一个小程序(七)— —优化引进redis(未编码,未写)
为女朋友写一个小程序(八)— —基于moongodb实现即时通讯(未编码,未写)
以此文致敬情人节哩 嘿嘿
一、为什么要使用docker进行部署
使用docker是因为自己想玩玩docker,之前了解过docker,说白了就是一个虚拟的操作系统,其操作与直接使用虚拟机操作没有什么大的区别。
使用docker进行部署可以简化部署过程,正如这个小程序为例子,正规流程部署的步骤应是如下:
- 装JDK8
- 装MYSQL
- 部署软件包
- 导入sql语句
- 启动
对于高手来说其在一个机器上部署算是简单,但是如果是重头来开始部署,还是需要花费一定的时间的,具体可以参考很久之前写的文章 装JDK,装MYSQL
切换成docker进行部署的时候,步骤就会简化如下:
- 装docker
- 选适合的JDK镜像、MYSQL镜像
- 编写docker启动容器的脚本(导入sql语句,可以利用MYSQL镜像提供的配置自动导入)
- 部署软件包
- 启动docker容器
这里主要是省略了装JDK,装MYSQL的步骤,部署速度加快。
另外,用了docker之后也方便对系统进行管理,因为系统上不会存在JAVA,MYSQL进程,直接面向docker进行管理,当然了,也会加大问题的复杂性,排查时,时常要进入docker容器的tty,有些复杂
二、使用docker需要做什么技术储备
使用docker的时候主要还是看了《第一本docker书》,这本书讲的还是比较全面,涉及了docker的入门基本知识,也涵盖了实战的实例,看过一次之后要用起来还是可以的。
其他的知识还是关于linux的知识,docker镜像使用的操作系统主要还是乌班图,CentOS等等,了解了linux知识方便对docker镜像的维护,之前主要过了两本书《Linux Shell脚本攻略》《鸟哥的私房菜》,过了之后对于linux的初、中级使用就没有什么压力了
三、具体是如何实现的
1、下载docker
下载docker,根据《第一本docker书》介绍的yum下载方式下载docker,一条命令解决所有问题
2、选择镜像
登录官方镜像库,进行搜索,建议使用的镜像最好都是由官方提供的,因为这里的程序用的也都是标准的东西,所以不需做什么自定义的镜像操作(服务器端程序使用的wrapper进行打包,JAVA docker镜像主要就是提供一个JDK环境,使用脚本自己去镜像内部启动服务器端程序),镜像的使用方法也有指南,用起来非常的方便,本小程序使用如下镜像
[aaa@qq.com_12_99_centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/maven 3.5-jdk-8 908bdbacafc2 11 months ago 748 MB
docker.io/mysql 5.7 5d4d51c57ea8 11 months ago 374 MB
docker.io/mysql latest 5d4d51c57ea8 11 months ago 374 MB
docker.io/java 8 d23bdf5b1b1b 2 years ago 643 MB
3、编写启动脚本
[aaa@qq.com_12_99_centos platform]# tree -L 3
.
|-- java-for-run
| `-- docker
| `-- run.sh #docker JAVA镜像启动脚本
`-- mysql
|-- data
| |-- auto.cnf
| |-- ca-key.pem
| |-- ca.pem
| |-- client-cert.pem
| |-- client-key.pem
| |-- db_target
| |-- ib_buffer_pool
| |-- ibdata1
| |-- ib_logfile0
| |-- ib_logfile1
| |-- ibtmp1
| |-- mysql
| |-- performance_schema
| |-- private_key.pem
| |-- public_key.pem
| |-- server-cert.pem
| |-- server-key.pem
| `-- sys
|-- docker
| `-- run.sh #docker MYSQL镜像启动脚本
|-- etc
| `-- my.cnf
`-- init
3.1、编写MYSQL docker镜像启动脚本
#!/bin/bash
docker run -ti --name target-mysql -v /etc/localtime:/etc/localtime -v /apps/platform/mysql/etc:/etc/mysql/conf.d -v /apps/platform/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=--KIKI$2018 -p ****:**** -d mysql:5.7
因为其中有几个需要自定义的地方,所以使用了启动脚本,自定义的地方:
- 挂载配置文件盘:配置文件不能定义到MYSQL docker容器中,所以用本机的目录抽离出来
- 时间:docker镜像的时间是美国时间,所以需要挂载本机(腾讯云)的时间到虚拟机中,否则时区不准,时间不准
- 数据:同样的,数据文件极为重要,不能随着容器的销毁而销毁,所以挂载数据目录盘
- 暴露端口给宿主机:暴露端口给宿主机,主要是方便后面自己的维护直接连接到宿主机,而不用到docker镜像中去
PS:sql文件直接通过人工导入
3.2、编写docker JAVA镜像启动脚本
编写脚本如下:
#!/bin/bash
docker run --rm -v /apps/service:/apps/service -v /etc/localtime:/etc/localtime -v /apps/data:/apps/data -v /apps/crt:/apps/crt -w /apps/service --name target-java --link target-mysql:mysql -p **:** -p ***:*** -d -t -i java:8 /bin/bash
docker exec target-java ./kiki-target/bin/kiki-target start
因为其中有几个需要自定义的地方,所以使用了启动脚本,自定义的地方:
- 磁盘挂载:将本机中的/apps/service挂载至docker镜像的/apps/service目录
- 时间:docker镜像的时间是美国时间,所以需要挂载本机(腾讯云)的时间到虚拟机中,否则时区不准,时间不准
- https证书:将本机中的/apps/crt挂载至docker镜像的/apps/crt目录
- 工作目录:定义为/apps/service
- 链接mysql镜像:链接mysql镜像,定义域名为mysql
- 暴露端口给宿主机:暴露端口给宿主机
- 启动方式:直接利用docker exec 命令启动本机的kiki-target服务器端程序
4、启动
先启动MYSQL镜像,再启动JAVA docker镜像
今天情人节哦,没有人发红包的话不介意发到这儿来~
如果对您有帮助,希望给我一分鼓励~愿你我皆不忘初心!
下一篇: 轻松掌握java中介者模式