0%

最近经常需要装nodejs,在发现有这个方法后,毅然抛弃了源码安装,舒服.

1
2
3
4
5
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
yum install -y nodejs
yum install -y gcc-c++ make
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
yum install yarn

参考资料

Read more »

什么是容器

  • 资源视图隔离 - namespace
  • 控制资源使用率 - cgroup
  • 独立的文件系统 - chroot

容器是一个视图隔离、资源可限制、独立文件系统的进程集合。

什么是镜像

运行容器所需要的所有文件集合 - 容器镜像

Dockerfile - 描述镜像构建步骤

构建步骤所产生出文件系统的变化 - changeset

容器的生命周期

单进程模型

  1. init进程生命周期 - 容器生命周期
  2. 运行期间可运行exec执行运维操作

数据持久化

  1. 独立于容器的生命周期
  2. 数据卷 - docker volume vs bind

容器项目架构

moby 容器引擎架构

  • containerd
  1. 容器运行时管理引擎,独立于moby daemon
  2. containerd-shim 管理容器生命周期 可以被containerd动态接管
  • 容器运行时
  1. 容器虚拟化技术方案
  2. runC kata gVisor
Read more »

插图大小

宽: 1200px

字体

描述大小: 18px
标题大小: 32px
字体: Source Code Pro

颜色

用途 颜色
背景色
#EEEEEE
文字颜色1
#EEEEEE
文字颜色2
#333333
组件颜色 - Sinbad
#66CCCC
组件颜色 - Sinbad Light
#99CCCC
组件颜色 - Golden Sand
#FFCC66
组件颜色 - Golden Sand Light
#FFCC99
组件颜色 - Gray
#555555
组件颜色 - Gray Light
#888888
组件颜色 - Sweet Pink
#FF6666
组件颜色 - Sweet Pink Light
#FF9999

高饱和度: https://flatuicolors.com/palette/se

参考资料

1
2
3
4
5
6
yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
yum install -y python2-certbot-nginx
pip install -U pip
pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3
ln -s /usr/local/nginx/conf /etc/nginx

配置证书 certbot --nginx 根据提示生成证书

配置定时续约证书

crontab -e

1
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

好了没了,就这么简单

Read more »

因为最近换了jenkins地址,之前CI环节依赖的gitee webhook。但是之前webhook的URL写的是ip。所以需要批量修改。

然而仓库上百个,头皮发麻。不过好在看到gitee有提供了API,虽然没找到sdk,但是也好很多了。

简单写了一个,放上来存档。

Read more »

环境: Python 3.6

Python异常处理和很多语言异常处理都差不多。

常见异常捕捉

  1. try … except … finally

索性把一些极端的处理句式给出给来 举一反三。依然是如果有异常,异常如果没有被捕捉,中断执行,finally是不会被执行的。

另外值得一提的是,python2中 except语句使用有区别于python3 。

python2: exception ErrType, ErrInfo
python3: exception ErrType as ErrInfo

一个用半角逗号隔开,一个用as隔开。后者更像其它的语言的异常处理。

1
2
3
4
5
6
7
8
9
10
11
try:
do_sth
except ErrorType as e:
handle_expcept_1
print("ErrorMessage:",e)
except ErrorType2 as e:
handle_expcept_2
else:
handle_other_error
finally:
colse_object
  1. with … as

对于支持该语句的对象来说,用这个语句比用try...finally更能保证对象在异常中得到期望的释放。

而支持该语句的对象必须内部实现两个方法 __enter__()__exit__().而在刚执行with语句时会触发 enter方法,离开with语句代码块后触发exit。所以,对象只要把释放资源的代码写在__exit__()函数中就行了。

1
2
with open('test.txt') as f:
f.readlines()
  1. Exception 万能异常

如其名,可以用try…except Exception 捕获所有的异常

Read more »

个人觉得装饰器就是Python对闭包的一种的语法糖。

可以灵活抽离出一些雷同代码,通过装饰器方便地调用,使得程序更加简单专注于逻辑的处理。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def check_data(func):
def check(*args, **kwargs):
print('in decorator')
print(args)
print(kwargs)
func(*args, **kwargs)
return check


@check_data
def echo_name(name):
print(name)


echo_name(name='jack')
print('--------')
echo_name(name='bob')

结果

1
2
3
4
5
6
7
8
9
in decorator
()
{'name': 'jack'}
jack
--------
in decorator
('bob',)
{}
bob
Read more »

用<Centos7配置LNMP nginx10+mariadb+php5.6>安装nginx后,

是没有nginx-upsync-module的.如此一来可能还不如直接编译安装,

但是这样安装好处在于,可以方便使用systemtl来管理nginx,不需要自己去添加服务,懒人必备.

然后再找同样版本的nginx,编译安装一遍,加进自己的模块.

  • 安装编译工具全家桶 yum groupinstall 'Development Tools'

  • 下载源码

1
2
3
4
wget http://nginx.org/download/nginx-1.12.1.tar.gz
tar -zxvf nginx-1.12.1.tar.gz
git clone https://github.com/onecer/nginx-upsync-module.git
#git clone https://github.com/weibocom/nginx-upsync-module.git
  • 安装编译依赖组件yum install -y zlib zlib-devel openssl openssl-devel pcre pcre-devel

  • 编译nginx

添加模块 --add-module=../nginx-upsync-module 其它模块有需要的自己加

1
2
3
cd nginx-1.12.1
./configure --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_module --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-stream --with-stream_ssl_module --add-module=../nginx-upsync-module
make && make install
Read more »

有同志容器的日志写到了自己容器里面。但是出问题后,一直写,导致磁盘写满。

以上是问题出现的前奏。

我接着清理下无用的容器,先快速释放部分空间出来。

1
docker system prune -a

紧接着我就出去帮忙别的东西了。

过一会被告知,Jenkins构建失败,而不止一个项目。每个项目出错如下:

Read more »

[TOC]

在Docker Swarm中部署Spring Cloud的服务.

本来服务注册是由Eureka做的,但是Eureka团队停止对该项目支持.于是我们转而转向consul.

经实践,最终定下来新的微服务部署用到的技术如下.

Docker+Consul+Registrator

实验环境

三台机:

  • node1:192.168.99.100

  • node2:192.168.99.101

  • node3:192.168.99.102

规划如下:

node1: Consul Server,Docker Swarm master

node2: Consul Server,Docker Swarm node

node3: Consul Client,Docker Swarm node

一般建议consul server数量为3~5个,做高可用,但是由于是演示,机器也比较渣,就不启用多台作为实验。

Read more »

[TOC]

Consul

整理了一些觉得有用的资料和踩过的坑.

为什么选用consul

1.因为Eureka即将停止维护了

2.Consul要更强大点,带配置中心

  • 每台机都必须运行一个consul agent.
  • consul agent有两种模式,1,server模式 2,client模式.
  • consul server,每个数据中心会有一个leader有server选举出来,故障后会重新选举.
  • consul server,保持数据一致性,维护集群状态,转发查询,转发请求给leader或者远程数据中心,交换wan gossip.
  • consul client用于注册服务,运行健康检查和转发对server的查询.
  • node名字必须在集群中唯一
Read more »

主要注意挂载目录以便数据持久化,命名hostname.

1
docker run -d --name rabbitmq -p 4369:4369 -p 8080:15672 -p 5671-5672:5671-5672 --restart=always --hostname my-rabbit  -v /data/rabbitmq:/var/lib/rabbitmq rabbitmq:3-management

一个连接rabbitmq的python例子.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# coding: utf-8
import json

import pika
# from selenium.webdriver.common.by import By

from house_info import HouseInfo

# CONFIG AREA
AMQP_CONFIG = {
'host': '127.0.0.1',
'port': 5672,
'username': 'guest',
'password': 'guest'
}
AMQP_QUEUE_NAME = 'house-inquery'
AMQP_FEEDBACK_QUEUE_NAME = 'house-inquery-result'


# 因为反馈回去的队列要求在不同队列,所以重新建立了一个新的队列连接
def process_feedback(msg):
mq_credential = pika.PlainCredentials(
username=AMQP_CONFIG['username'],
password=AMQP_CONFIG['password']
)
mq_conn = pika.BlockingConnection(pika.ConnectionParameters(
host=AMQP_CONFIG['host'],
credentials=mq_credential
))
mq_channel = mq_conn.channel()
mq_channel.queue_declare(queue=AMQP_FEEDBACK_QUEUE_NAME, durable=True)
return mq_channel.basic_publish(exchange='',
routing_key=AMQP_FEEDBACK_QUEUE_NAME,
body=msg,
properties=pika.BasicProperties(
delivery_mode=2,
content_encoding='UTF-8',
content_type='text/plain'
)
)


user_pwd = pika.PlainCredentials(AMQP_CONFIG['username'], AMQP_CONFIG['password'])
s_conn = pika.BlockingConnection(pika.ConnectionParameters(AMQP_CONFIG['host'], credentials=user_pwd))
channel = s_conn.channel()
channel.queue_declare(queue=AMQP_QUEUE_NAME, durable=True)


def callback(ch, method, properties, body):
print(body)
query_data = json.loads(body)
if not query_data:
return
try:
# 一些业务逻辑代码
# 应答消息
ch.basic_ack(delivery_tag=method.delivery_tag)
except Exception as e:
print(e)

# 设置一次只获取一条消息处理
channel.basic_qos(prefetch_count=1)
# 启用ack,防止异常消息丢失 确认处理后再删除消息
channel.basic_consume(callback, queue=AMQP_QUEUE_NAME, no_ack=False)
channel.start_consuming()

其实就是通过flask接受url传递过来的命令,然后调用SDK相关API执行docker exec命令,然后将结果返回给页面。

1
pip install flask docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# coding: utf-8
from flask import Flask
from flask import render_template
from flask import request
import docker

app = Flask(__name__, template_folder='./templates', static_folder="", static_url_path="")
client = docker.from_env()


@app.route('/cmd', methods=['GET', 'POST'])
def exec_cmd():
if request.method == 'GET':
return render_template('cmd.html')
if request.method == 'POST':
container = client.containers.get('gmb-index') # 这里我写死了获取本地这个容器
cmd = request.form.get('cmd')
result = container.exec_run(cmd=cmd)
output = result.output.decode()
return render_template('cmd.html', output=output)


if __name__=='__main__':
app.run(host='127.0.0.1', port=8888)

模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Console</title>
</head>
<body>
<div>
<form action="/cmd" method="post">
<input type="text" name="cmd">
<input type="submit" value="Submit">
</form>

<textarea rows="100" cols="200" readonly="readonly">
{{ output }}
</textarea>
</div>
</body>
</html>

如图:

参考资料

某日看到妹子整理表格,需要对excel一万多条记录中的重复数据删除处理。

但是处理两小时没好,耽误了两人看动漫时间,最后帮她搞了这个脚本。

为了速度,存在很多硬编码,但是应该不影响阅读。

Read more »

已经经历两次开发环境磁盘占用满的情况的。

第一次是部署太频繁,然后有很多无用的images没有删除掉。

第二次是docker容器,某些服务写了很多日志,导致磁盘被写满。

撇开这些设置不当的问题,怎么清理掉一些“垃圾”,让docker占用空间变得小一点?

Docker占用磁盘的主要有以下几样东西:

  1. Docker Images

  2. Docker Containers

  3. Docker Logs

对于输出日志特别多的程序,Logs还是不容小觑的。

尤其是开发服务器,频繁的部署,会导致产生很多用不上的Images也占用在空间。

而Container占用空间突然增大,一般也主要是一些异常产生的文件太多,写了太多logs在容器内所致。

Read more »