背景
服务器硬件:BWG 洛杉矶机房 10G+512M+1核
截止目前,我服务器(你现在看的这个页面就是在这个服务器上面)上面运行的服务有:Nginx、PHP、MySQL、Redis、Log收集器、Ngork 。这些服务全部部署在一台机器上面。但是由于我服务器经常拿来做一些测试,导致经常需要 重装系统。因此每次重装系统后的服务部署都格外头疼。基本上把这些所有的服务部署一般,半天时间就没了。因此,一个快速稳定的部署方案十分有必要。
刚开始的想法是把所有部署操作写成一个Shell脚本,每次部署只用执行一遍Shell脚本就行了。但是Shell脚本维护成本太高,而且不同操作系统,不同版本的系统,很容易出现问题。因此 放弃了这个思路。
第二个想法是一步到位,上Docker + K8S,但是考虑到机器性能,K8S实在是太重了,可能K8S的性能消耗比我所有服务的消耗还要高。但是容器化部署是一个非常好的思路,于是想到了 使用轻量一点的方案docker+docker-compose。这套方案优势在于
1、docker容器带来的跨平台性 2、docker-compose进行容器编排足够轻量,不会额外消耗机器资源(我服务器配置太低,这点非常重要)
实现过程
一、打包Dokcerfile
打包过程中基础镜像选择了各个官方镜像,另外由于服务器磁盘只有10G,需要非常注意Docker镜像的尺寸,基本上每一步操作的缓存都得清理干净,比如apt-get、gcc build这些操作带来的 缓存可能非常大,不清理干净最终容器将会非常大。
另外,基础镜像尽可能小,比如golang build完后只需要一个alpine镜像运行即可,能选alpine就不用用ubuntu,保证最终镜像尽可能小,毕竟10G磁盘
最后,golang、c++之类的编译型语言全部采用分阶段构建,编译阶段在已经容器中,编译完以后拷贝到新容器中运行,这样可以连源码,编译器的大小都省去了。还是那句话,10G磁盘,迫不得已啊
二、编写docker-compose.yml
为了尽可能节约磁盘空间,基本上所有服务都关闭了日志记录。但是必要的日志还是得收集,不能丢。因此自己写了一个日志收集工具(其实本来不想自己写的,想用ELK一套,但是,机器性能 摆在这里,没办法,只能自己动手)。工具使用golang编写,功能只有一个,解析各个日志,然后存进MySQL。
工具日志也单独部署在一个容器中,日志数据写入到统一的日志数据卷中,然后日志服务读取日志数据卷的内容,写入MySQL。
其中,Nginx日志为了方便解析,将其格式改成了JSON。配置如下
user nginx;
worker_processes 1;
error_log /var/log/nginx/error_local.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;