Docker 修改默认存储空间
最近碰到一个问题,由于需要下载很多的镜像文件,如果使用docker安装时候的默认存储空间,那肯定是不行的。默认的存储空间可以使用:docker info看到:在输出的信息里面会发现:Docker Root Dir: /var/lib/docker;这个目录其实就是在根目录下吗,如果下载的镜像数量过大并且又大,那么肯定是的完蛋的~~~
所以就需要修改docker的存储空间。
物来顺应,未来不迎,当时不杂,既过不恋
有时候会遇到一些需求,需要给前端提供下载文件的接口。
1 | @GetMapping("/export") |
本文参考:https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/clustering.md
不得不说etcd的安装真的非常容易。在https://github.com/etcd-io/etcd的release里面找到相应的版本。然后直接二进制启动,一个单节点就好。真的是太简单啊。
不过搭建集群版本的话还是需要做一些配置,下面就是我用集群搭建的环境并且真实可用的过程。
下载好相应版本的etcd,然后做如下配置。我们采用的方式是使用Linux的systemd服务:
使用 Docker 的时候用的是 Docker Registry 来存储镜像。一开始的时候给了500G数据盘,日积月累的累积的数据就开始变多了。
没办法只好想办法去清理。看了下官网的api文档:Docker Registry API
其实还挺简单的,主要是用http接口先将镜像和层删除,然后使用镜像仓库的garbage-collect。
默认HTTP接口是不支持DELETE方法的,需要修改配置文件中storage.delete.enabled: true,配置文件的解释可以在这里看到地址Registry 配置文件
1 | storage: |
镜像仓库的garbage-collection可以看下官网文档。主要看懂一个图就可以了:
1 | A -----> a <----- B |
1 | A -----> a B |
这样c就要回收了。
然后我们使用HTTP的API。查到repo,tags,然后就可以删除相应的镜像。
但是在删除的时候要注意下,首先我们要通过接口获取digest的值,但是这个digest的值获取方式比较特别,首先我们访问:/v2/<name>/manifests/<reference>这个接口的时候,需要使用GET获取HEAD方法,然而在请求的时候需要加入Header:Accept: application/vnd.docker.distribution.manifest.v2+json这样才可以在返回的HEAD中才能获取到正式的digest。
使用golang写了一个demo代码:
1 |
|
就算这样执行完,别忘记了,进入到registry的容器中,然后使用:
1 |
|
/etc/docker/registry/config.yml文件要打开之前说的storage.delete.enabled: true
一次线上的经历,一台现在主机突然磁盘根目录占到98%。我们其实是挂了数据盘的,不知道为啥突然会
在根目录下磁盘空空间不足报警。上到主机一看,原来是某个应用打了dump了个core文件。文件如:core.xxxx
用gdb调试了一下:
gdb core.14321
显示出是哪个进程dump的core文件。
之后我们就开始分析core文件怎么避免让根目录占满。
首先用ulimit -a查看到core文件的大小。然后用ulimit -c设置大小,单位是block,
1block=512bytes
然后修改core文件到数据盘的目录:
echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern
最近用restful做接口,突然想想返回状态码该怎么返回给客户端或者调用者。毕竟那么多的状态码。
后来找到一个状态码解释:
1 |
|
这篇接上一篇vuejs 从拷项目到开发上线
另外一个问题就是如何制作成镜像了?可以看到我们在nginx.conf中有api服务的地址,这个地址可能在不同的环境(di,sit,prd)都不一样,那能否通过容器的env来改变nginx.conf中的值呢?
不查不知道,一查发现,我擦,还真有,nginx镜像本身就已经具备了。不过是李template的方式,来生成conf文件话不多说,直接上代码,先创建一个nginx.conf.template的文件:
1 |
|
之后准备Dockerfile:
1 |
|
之后docker build -t xxx:latest .,之后我们就可以通过-e M_API_SITE=192.168.123.1:8080设置容器的环境变量来设置不同的api地址了。
最近组里缺人手,我们都是一堆后端,却没有一个前端。所以你看到了一堆的后台接口,但就是没有一个页面。囧~
本着求人不如求己,活人不能被尿憋死不是~所以准备自己开始干。
首先想了一下,我们应该怎么开发前端了?使用thymeleaf这种貌似是最合适的,毕竟类似于以前用jsp,对不对~当然有点不一样。
但后来想想,都前后端分离了,以后我们要真的做牛逼了。要是给我们分配个前端,那我们不又要改死啊。
然后觉得前后端不分离,逼格不够,也不好维护。那好咯,那就定好方向前端分离。
前后端分离的方向定好,那就先想想是自己完全自己弄一个,还是直接用模板套一个?一致觉得,自己从头写,费时费力,一群后端去弄不太现实,毕竟还是有很多要调的,适配啊,排版啊。所以投票决定,选模板。选了模板,那就好弄了,github上找了前十个优秀的模板。有一些是基于bootstrap,然后每个页面都是html,所以这种就相当于用jQuery或者javascript用ajax这种吧。想想就被以前写dom支配的恐惧。后来了解到有个vue,人家都说好用,其实公司还有很多都是vue,我们想了想,要是用bootstrap那种估计就是靠我们自己了。要是vue,要是我们实际搞不定,在公司也好请外援。想了想,那就找vue的模板吧。找来找去,找了个最简单实用的。毕竟我们需求很简单,列表显示,表格添加,搜索框就好了,后管管理页面是真的好搞啊。找了个最简单的功能又全的,感谢github,感谢可爱的爱分享的工程师们。
模板选好了,这下来到重头戏了。大家都不会啊,以前都是听说,我们前端用vue,特么到底怎么用啊。不过既然选好了方案,选好了模板,其实就很明确了,不会那就学啊。vue官网一翻,一遍浏览。大概的使用方式也是了解了。
vue的模式感觉跟以前的不一样,看整个项目发现其实就一个html页面,也就是index.html,然后就是在里面有个APP.vue,通过不同的xx.vue来选择相应的页面,其实就是他们口中的单页式应用。就是一个html页面,然后根据不同的path来显示不同的内容。另外需要转换一个观点,vue不像传统的面向页面来编程,因为它的数据绑定感觉太好用了。如果是在html标签中只需要用{{ key }}就可以使用在js中定义的key的值。有几个好用的标签:
感觉吧,说的不太全,还是要实际用起来才有那种感觉。模板地址
在实际使用中遇到一些问题,一开始有点懵逼,不过到后来都解决了。
这个一开始的时候有点蒙圈,本地是使用npm run dev启动的,启动后发现,跨域了。这个该怎么搞哦。后来在vue.config.js中发现一个文件:
1 | module.exports = { |
其实可以看到只要打开changeOrigin 就可以了。其它的都不需要改动。
开发完了,代码也写好了。重点来了,怎么部署到服务器?来跟我三步走
使用npm run build先进行构建,完成后会在根路径下生成一个dist文件夹。
下载一个nginx,现在都是使用nginx来做前端的服务器。将刚刚的dist文件夹的内容copy到服务器某个路径。
比如/app/html,或者就是nginx目录下的html。随自己开心就好
目录确定后,我们就需要修改nginx的配置了。如下:
1 |
|
然后启动 nginx 就好了。
Kubernetes简称k8s。最直观的解释它是用将资源进行整合,将应用与底层隔离。因此,搞业务开发的,专心搞好业务逻辑。搞底层机器,网络资源的安心搞好底层网络资源。而k8s就是这中间的一层,承上启下。也就是传说中的PaaS。现在可以说没有那个Paas或者Caas不是基于k8s搞的。不过我觉得理解的不深,k8s的作用其实还有很多,如果你用过docker或者直接开发业务就会有比较深的感知。
安装一个K8S集群需要哪些组件了?一个完整的小集群里面,需要有一个master,一个node,两台机器。master和node上分别有哪些组件了?master上有kube-apiserver,kube-scheduler,kube-controller-manager; node上有kubelet,kube-proxy,docker;另外需要在master上安装一个etcd数据库。如果是非二进制安装,master和node上都需要有kubeadm。安装完这些之后需要在master节点上使用’kubectl apply -f [kubelet-network].yaml’也就是如果你使用flannel网络,就可能需要安装flannel的网络插件。这个插件是已pod的方式创建的。
键值数据库,这个没有什么特别好说的。要在安装k8s集群前先启动,保存k8s所有资源对象数据
集群控制的入口进程,提供HTTP Rest接口的关键服务进程,是k8s里面所有资源操作的唯一入口。
k8s所有资源对象的自动化控制中心
k8s的资源调度进程
负责pod对应的容器的创建,启停等任务,同时与Maser节点密切协作,实现集群管理的基本功能
实现kubernetes Service的通信与负载均衡机制的重要组件