背景
在之前的文章中介绍如何用docker编译前端项目,docker编译项目的有点前面已经说的很清楚了这边就不在赘述,后端开发语言较多,我们就以java为例,介绍如何用maven镜像进行编译
实现
- 我们准备一个java项目,使用maven进行包管理
- 执行以下命令进行编译
docker run -it --rm --name my-maven-project -v "/you/path/app":/usr/app -w /usr/app maven:3.8.1-openjdk-8-slim mvn clean package
将项目挂载到容器文件系统路径/usr/app
下,-w将工作目录指定到/usr/app
下,–rm可以保证编译完删除镜像,避免占用空间。
首次编译因为本地没有下载依赖所以会先下载依赖包,再执行编译打包命令,这个结果不是我们想要的,如果一个工程依赖的包很多,每次都要重新下载效率会非常低,其实只要把maven的repository目录映射出来就行
Read the rest of this entry
maven
介绍
nodejs官方提供docker镜像,并且镜像自带npm工具,也就是说,完全可以用docker镜像编译本地前端项目,那相比本地安装nodejs编译,docker编译有哪些优势呢
- 可以安装多个版本nodejs,可以选择指定版本nodejs进行编译,如果你是要搭建一个构建平台,这是个非常好的方案
- 免安装,如果需要安装多版本nodejs,这个优势就很明显了
- 不会污染本地环境
如果你是个人开发,使用docker编译项目相对有点极客行为,在个人开发上并没有太大的优势,但是如果你是要搭建一个构建系统,那么docker镜像的方案是你最好的选择。
实现
虽然nodejs官方提供了镜像但实践下来如果直接用官方的镜像,无法达到想要的效果,原因有以下几点
Read the rest of this entry
介绍
nodejs官方提供docker镜像,并且镜像自带npm工具,也就是说,完全可以用docker镜像编译本地前端项目,那相比本地安装nodejs编译,docker编译有哪些优势呢
- 可以安装多个版本nodejs,可以选择指定版本nodejs进行编译,如果你是要搭建一个构建平台,这是个非常好的方案
- 免安装,如果需要安装多版本nodejs,这个优势就很明显了
- 不会污染本地环境
如果你是个人开发,使用docker编译项目相对有点极客行为,在个人开发上并没有太大的优势,但是如果你是要搭建一个构建系统,那么docker镜像的方案是你最好的选择。
实现
虽然nodejs官方提供了镜像但实践下来如果直接用官方的镜像,无法达到想要的效果,原因有以下几点
- nodejs项目初衷是用javascript作为后端预言,所以镜像主要是用于后端服务
- 镜像虽然自带了npm工具,但因为WORKDIR的关系无法正常编译,尝试过多种方法还是无法顺利编译
- 基于官方的镜像做二次构建成本很低,所以建议根据自己的需求做二次构建
我们先实现一个npm install
功能的镜像
Read the rest of this entry
背景
客户通过Jenkins流水线构建镜像上传harbor部署到kubernetes,经过不断的CI/CD,harbor占用空间不断增大,但旧的镜像其实是可以删除掉,保留最新的几个版本供回滚就可以,因此需要制定删除策略,目前情况如下
- 保留每个镜像最新3个版本即可
- 用户通过tag区分环境,比如 definesys/hr:dev.20210601,definesys/hr:uat.20210601,这样就导致如果保留最新3个镜像,有可能都保留了dev.xxx,其他环境的都被删除,因此也要考虑按照环境做分组,只保留每个分组内的最新3个版本即可
harbor本身并没有提供类似的功能,但是harbor有完善的restapi,因此可以自己写工具去实现以上需求。
方案
- java开发清理程序,打包为jar包,通过Main运行
- 通过jenkins打包应用并执行清理动作
之所以选择jenkins运行jar包,是因为jenkins可以提供配置参数界面,可以将清理程序的一些配置项通过jenkins传入,省的再去开发界面,而且jenkins有定时调度的功能,可以实现定时清理的功能。
Read the rest of this entry
harbor, jenkins
介绍
harbor支持docker compose和helm两种方式进行安装,一般情况下如果是kubernetes运行环境推荐用helm进行安装,如果是纯docker环境建议用docker compose进行安装,本次安装使用helm进行安装,安装版本为
v2.2.1
创建命名空间
harbor包含服务较多,建议单独创建命名空间进行安装,便于后续的管理
apiVersion: v1
kind: Namespace
metadata:
name: harbor
labels:
name: harbor
另存为harbor-namespace.yaml
文件,并执行kubectl apply -f harbor-namespace.yaml
命令进行创建
创建共享目录
目录必须创建在共享存储的介质上面,比如NFS等
mkdir -p /u02/appdata/harbor/registry
mkdir -p /u02/appdata/harbor/chartmuseum
mkdir -p /u02/appdata/harbor/jobservice
mkdir -p /u02/appdata/harbor/database
mkdir -p /u02/appdata/harbor/redis
mkdir -p /u02/appdata/harbor/trivy
chmod 777 /u02/appdata/harbor/registry
chmod 777 /u02/appdata/harbor/chartmuseum
chmod 777 /u02/appdata/harbor/jobservice
chmod 777 /u02/appdata/harbor/database
chmod 777 /u02/appdata/harbor/redis
chmod 777 /u02/appdata/harbor/trivy
Read the rest of this entry
harbor, helm, kubernetes
背景
如果你是通过rke安装kubernetes,并且rke版本在v0.2.0
之前,或者通过rancher安装,并且rancher版本在Rancher v2.0.14、v2.1.9
之前,默认的证书有效期是1年,这实在是个大坑,之后的版本rancher更改为10年,证书过期后对现有的服务不影响,服务依然能正常使用,但无法部署新的服务,并且api server不能提供服务,api server如果无法使用,集群基本就废了。
通过openssl工具查看证书有效期
openssl x509 -in /etc/kubernetes/ssl/kube-apiserver.pem -noout -dates
notBefore=Jan 11 10:17:38 2019 GMT
notAfter=Jan 11 10:17:39 2020 GMT
如果当前日期在notAfter之后,那么很不幸,你的证书过期了,此时kubectl命令不可用
$ kubectl get nodes
Unable to connect to the server: x509: certificate has expired or is not yet valid
Read the rest of this entry
kubernetes