docker format常用选项

格式化选项(–format) .ID 容器ID .Image 镜像ID .Command Quoted command .CreatedAt 创建容器的时间点. .RunningFor 从容器创建到现在过去的时间. .Ports 暴露的端口. .Status 容器状态. .Size 容器占用硬盘大小. .Names 容器名称. .Labels 容器所有的标签. .Label 指定label的值 例如’{{.Label “com.docker.swarm.cpu”}}’ .Mounts 挂载到这个容器的数据卷名称

用例:

删除已经死掉的容器,但 docker ps -a还有且状态为Exit…的容器

docker ps -a --format "{{.ID}}\t{{.Status}}" | grep Ex | awk '{print$1}' | xargs docker rm

删除docker images的tag是none的镜像

docker images --format "{{.Repository}}\t{{.ID}}" | grep none | awk '{print $2}' | xargs docker rmi

https://blog.csdn.net/aiwangtingyun/article/details/123380626

2022-11-30    
linux自动化交互工具:expect示例

安装

yum -y install expect

使用

#!/usr/bin/expect
# 本脚本需要安装 
# yum -y install expect
# yum install rsync -y

# 该脚本的作用为将指定名称的文件同步到其他节点
# params
# fname: 要同步的文件名
# hostip:目的节点
# user:目的节点用户名
# passwd:目的节点密码

# 设置变量
set fname [lindex $argv 0]
set hostip  [lindex $argv 1]
set user [lindex $argv 2]
set passwd [lindex $argv 3]
puts "fname=$fname"
puts "hostip=$hostip"
puts "user=$user"
puts "passwd=$passwd"

spawn rsync -rvl $fname $user@$hostip:/root/
expect {
 "*yes/no" {send "yes\r";exp_continue}
 "*password*:" {send "$passwd\r"}
}

expect eof
2022-11-28    
gorm删除记录(删除具有级联关系的数据)

删除具有级联关系的数据

参考:https://gorm.io/zh_CN/docs/associations.html#Association-Mode

带 Select 的删除

你可以在删除记录时通过 Select 来删除具有 has one、has many、many2many 关系的记录,例如:


// 删除 user 时,也删除 user 的 account
db.Select("Account").Delete(&user)

// 删除 user 时,也删除 user 的 Orders、CreditCards 记录
db.Select("Orders", "CreditCards").Delete(&user)

// 删除 user 时,也删除用户所有 has one/many、many2many 记录
db.Select(clause.Associations).Delete(&user)

// 删除 users 时,也删除每一个 user 的 account
db.Select("Account").Delete(&users)

注意:只有当记录的主键不为空时,关联才会被删除,GORM 会使用这些主键作为条件来删除关联记录

// DOESN'T WORK
db.Select("Account").Where("name = ?", "jinzhu").Delete(&User{})
// 会删除所有 name=`jinzhu` 的 user,但这些 user 的 account 不会被删除

db.Select("Account").Where("name = ?", "jinzhu").Delete(&User{ID: 1})
// 会删除 name = `jinzhu` 且 id = `1` 的 user,并且 user `1` 的 account 也会被删除

db.Select("Account").Delete(&User{ID: 1})
// 会删除 id = `1` 的 user,并且 user `1` 的 account 也会被删除
2022-11-18    
《k8s权威指南学习》--入门篇

Service

在k8s中,Service(服务)是分布式集群架构的核心,一个Service对象拥有如下关键特征:

  • 拥有一个唯一指定的名字(比如mysql-server)
  • 拥有一个虚拟IP(Cluster IP、service IP或VIP)和端口号。
  • 能够提供某种远程服务能力。
  • 被映射到了提供这种服务能力的一组容器应用上。

为了建立Service和Pod之间的关联关系,k8s给每个Pod贴上标签(Label),如运行MySQL的Pod贴上name=mysql标签。然后给相应的Service定义标签选择器(Label Selector)

Pod

Pod里的容器共享Pause的网络栈和Volume,因此他们之间的通信和数据交换更为高效,在设计时我们可以利用这一特性将一组密切相关的服务进程放到一个Pod中

注意:并不是每个Pod和它里面运行的容器都能“映射”到一个Service上,只有那些提供服务(无论是对内还是对外)的一组Pod才会被“映射”成一个服务。

k8s为每个Pod都分配了唯一的IP地址,称为Pod IP,一个Pod里的多个容器共享Pod IP地址。k8s要求底层网络支持集群内任意两个Pod之间的TCP/IP通信,这通常采用二层网络技术实现,例如Flannel、OpenVSitch等。

类型

  • 普通的Pod 一旦被创建,就会被放入到etcd中存储,随后被k8s master调度到某个具体的node上并进行bingding。

  • 静态Pod 不会存放在etcd存储里,而是放在某个具体的Node上的一个具体文件中,并且只在此node上启动运行。

在默认情况下,当Pod里某个容器停止时,k8s会启动检测这个问题并重启该Pod(重启Pod里所有的容器)。

节点

Master

服务如下: kube-apiserver、kube-controller-manager和kube-scheduler

作用: 实现整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能。

Node

集群的工作节点,运行真正的应用程序。 在Node上k8s管理的最小运行单元是Pod。

服务如下: kubelet、kube-proxy服务进程

作用: 负责Pod的创建、启动、监控、重启、销毁及实现软件模式的负载均衡。

扩容

在k8s集群中,只需为需要扩容的Service关联的Pod创建一个RC(Replication Controller)。

RC定义文件中包含三个关键信息:

  1. 目标Pod的定义。
  2. 目标Pod需要运行的副本数量(Replicas)。
  3. 要监控的目标Pod的标签(Label)。

配额

CPU

以千分之一的CPU配额为最小单位,用m来表示。是一个绝对值

内存

单位是字节数。同样也是一个绝对值

Label(标签)

key=value键值对。key和value有用户自己定义。可以附加到各种资源上,如Node、Pod、Service、RC等。

一个资源对象可以定义任意数量的Label,同一个Label也可被添加到任意数量的资源上去。

Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。

通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等管理工作。 随后可以通过Label Selector查询和筛选拥有某些Label资源对象。

service

k8s里的三种IP:

  • Node IP: Node节点的IP地址
  • Pod IP: Pod的IP地址
  • Cluster IP:Service的IP地址。

首先Node IP是k8s集群中每个节点的无力网卡的IP地址,这是一个真实存在的物理网络,所有属于这个网络的服务器之间都能通过这个网络直接通信,不管他们中是否有部分节点不属于这个k8s集群。 这也表明了k8s集群之外的节点访问k8s集群之内的某个节点或者TCP/IP服务时,必须通过Node IP进行通信。

其次,Pod IP是每个Pod的IP地址,它是Docker Engine根据docker0网桥的IP地址段进行分配的,通常是一个虚拟的二层网络。k8s里一个Pod的容器访问另一个Pod里的容器,就是通过Pod IP所在的虚拟二层网络进行通信的,而真实的TCP/IP流量则是通过Node IP所在的无力网卡流出的。

2022-11-10    
OUC

春天樱花大道的缤纷绚丽、夏天映月湖的荷花玉立、秋天梧桐大道的叶落如歌、冬天清真餐厅旁边的烤红薯。

信院门口樱花树下的那只慵懒的肥花猫,已经许久不见了…去年深秋,一个微凉的傍晚,我看见他躺在草地上不动了,埋葬在了五子顶上的一颗松树旁…这或许只有我一个人知道吧。海大的樱花每年都开,树下的小花猫不见了;走过四年樱花大道的春夏秋冬,我也要带着不舍倔强和梦想去远方了

又想听一次385路公交站的报站声了,125路也是:从头坐到尾44站地也不觉得无聊。

2022-11-08    
收藏??就叫收藏吧

Nginx 配置生成器

NginxWebUI是一款方便实用的nginx 网页配置工具,可以使用 WebUI 配置 Nginx 的各项功能,包括端口转发,反向代理,ssl 证书配置,负载均衡等,最终生成「nginx.conf」配置文件并覆盖目标配置文件,完成 nginx 的功能配置。

项目地址:https://gitee.com/cym1102/nginxWebUI 官方网站:https://nginxwebui.gitee.io

NginxWebUI功能说明

-该项目是基于springBoot的web系统,数据库使用sqlite,因此服务器上不需要安装任何数据库。

  • 本项目可管理多个nginx服务器集群, 随时一键切换到对应服务器上进行nginx配置, 也可以一键将某台服务器配置同步到其他服务器, 方便集群管理。
  • nginx本身功能复杂, 本项目并不能涵盖nginx所有功能, 只能配置常用功能, 更高级的功能配置仍然需要在最终生成的nginx.conf中进行手动编写。
  • 部署此项目后, 配置nginx再也不用上网各种搜索, 再也不用手动申请和配置ssl证书, 只需要在本项目中进行增删改查就可方便的配置nginx。
2022-11-08    
错误码设计

错误码不体现版本号和错误等级信息。 说明:错误码以不断追加的方式进行兼容。错误等级由日志和错误码本身的释义来决定。 

错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号

错误码不能直接输出给用户作为提示信息使用。说明:堆栈(stack_trace)、错误信息(error_message)、错误码(error_code)、提示信息(user_tip)是一个有效关联并互相转义的和谐整体,但是请勿互相越俎代庖。  

在获取第三方服务错误码时,向上抛出允许本系统转义,由 C 转为 B,并且在错误信息上带上原有的第三方错误码。 结合错误码设计原则、错误码用途、规约建议,面向服务端日志的错误码应该是如下形式。   错误码分为一级宏观错误码、二级宏观错误码、三级宏观错误码。    错误码即人性,感性认知+口口相传,使用纯数字来进行错误码编排不利于感性记忆和分类。说明:数字是一个整体,每位数字的地位和含义是相同的。反例:一个五位数字 12345,第 1 位是错误等级,第 2 位是错误来源,345 是编号,人的大脑不会主动地分辨每位数字的不同含义。

面向日志的错误码

输出到日志的错误码有两个用途:

  • 用来快速溯源找到问题。
  • 用来形成监控大盘。

按照《手册》的建议设计出的面向日志的错误码定义共十三位(十位有意义,三位连接符),并且应该具有如下分类:

  • 应用标识,表示错误属于哪个应用,三位数字。
  • 功能域标识,表示错误属于应用中的哪个功能模块,三位数字。
  • 错误类型,表示错误属于那种类型,一位字母。
  • 错误编码,错误类型下的具体错误,三位数字。

组成图:

错误码

面向外部传递的错误码

面向外部传递的错误码是为了把域内的错误信息传递出去。

可以让域外系统通过错误码进行错误码进行后续的动作或是中断操作或是记录日志继续执行。

可以让前端通过错误码给出用户准确的错误提示或者忽略错误进行重试。

组成图: 组成图

示例: 示例

参考文章:错误码如何设计才合理?

2022-11-08    
黑暗森林法

黑暗森林法则可简单理解为,一旦某个宇宙文明被发现,就必然遭到其他宇宙文明的打击。

出自《三体》

2022-11-04    
http状态码

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。

201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。

202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)

204 NO CONTENT - [DELETE]:用户删除数据成功。

400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。

401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。

403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。

404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。

406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。

410 Gone - [GET]:用户请求的资源被永久删除,且不会再得到的。

422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。

500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

2022-11-03    
建立一个名为agetest的账号,该账号第一次登陆后使用默认密码,但必须更改密码后使用新密码才能够登陆系统使用bash环境

建立一个名为agetest的账号,该账号第一次登陆后使用默认密码,但必须更改密码后使用新密码才能够登陆系统使用bash环境。

增加用户agetest,且设置初始密码和用户名保持一致

[root@centos dashboard]# useradd agetest
[root@centos dashboard]# echo "agetest" | passwd --stdin agetest
Changing password for user agetest.
passwd: all authentication tokens updated successfully.
[root@centos dashboard]# chage -d 0 agetest
[root@centos dashboard]# chage -l agetest | head -n 3
Last password change					: password must be changed
Password expires					: password must be changed
Password inactive					: password must be changed
[root@centos dashboard]# logout

使用agetest登陆linux,便会强制让用户更改密码

[root@study ~]#ssh agetest@ip
agetest@ip's password:
You are required to change your password immediately (administrator enforced)

WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user agetest.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Connection to ip closed.

over

2022-11-03