Chemmy's Blog

chengming0916@outlook.com

Beego

官网 https://beego.me

github https://github.com/astaxie/beego

优点:

  • 很全很简单
  • 不仅追求性能,同样追求开发效率,解放程序员的生产力
  • 社区良好,中文开发者很多,找资料很方便
  • 代码文档化做的很优秀

缺点:

  • 比较臃肿,因为提供了很多支持,当遇到坑时需要花很多时间查源码解决问题
  • 模块众多,这既是优点也是缺点

Echo

官网 https://echo.labstack.com

github https://github.com/labstack/echo

优点:

  • 路由性能高
  • 更轻量级的web开发框架

缺点:

  • 调试不方便,报错信息不友好
  • 路由性能虽高,但是路由实现的算法底层不支持路由排序,会引起路由冲突

Gin

官网 https://gin-gonic.github.io/gin

github https://github.com/gin-gonic/gin

优点:

  • 封装比较好,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
  • 运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json

缺点:

  • 封装比较好,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
  • 运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json

Iris

官网 https://iris-go.com

github https://github.com/kataras/iris

优点:

  • 是社区驱动的Go语言Web 框架,支持http2,完备 MVC 支持。
  • 极简主义风格
  • 社区活跃度和文档支持都非常到位

缺点:

  • 不够稳定,社区里有人反馈:最新的release版本是alpha版非常不稳定
  • 支持Iris的人很多,但是目前仍然不如Gin和Echo多

GB/T 35134-2017 物联网智能家居 设备描述方法

GB/T 35143-2017 物联网智能家居 数据和设备编码

GB/T 35317-2017 公安物联网系统信息安全等级保护要求

GB/T 35318-2017 公安物联网感知终端安全防护技术要求

GB/T 35319-2017 物联网 系统接口要求

GB/T 35419-2017 物联网标识体系 Ecode在一维条码中的存储

GB/T 35420-2017 物联网标识体系 Ecode在二维码中的存储

GB/T 35421-2017 物联网标识体系 Ecode在射频标签中的存储

GB/T 35422-2017 物联网标识体系 Ecode的注册与管理

GB/T 35423-2017 物联网标识体系 Ecode在NFC标签中的存储

GB/T 35592-2017 公安物联网感知终端接入安全技术要求

GB/T 35136-2017 智能家居自动控制设备通用技术要求

GB/T 35255-2017 LED公共照明智能系统接口应用层通信协议

GB/T 35291-2017 信息安全技术 智能密码钥匙应用接口规范

GB/T 30269.502-2017 信息技术 传感器网络 第502部分:标识:传感节点标识符解析

GB/T 30269.602-2017 信息技术 传感器网络 第602部分:信息安全:低速率无线传感器网络网络层和应用支持子层安全规范

GB/T 30269.801-2017 信息技术 传感器网络 第801部分:测试:通用要求

GB/T 30269.803-2017 信息技术 传感器网络 第803部分:测试:低速无线传感器网络网络层和应用支持子层

GB/T 35129-2017 面向食品制造业的射频识别系统 环境适应性要求

GB/T 35130-2017 面向食品制造业的射频识别系统 射频标签信息与编码规范

GB/T 35135-2017 面向食品制造业的射频识别系统 应用要求

GB/T 17626.6-2017 电磁兼容 试验和测量技术 射频场感应的传导骚扰抗扰度

GB/T 35290-2017 信息安全技术 射频识别(RFID)系统通用安全技术要求

GB/T 35120-2017 制造过程物联的数字化模型信息交换规范

GB/T 35122-2017 制造过程物联的数字化模型信息表达规范

GB/T 35128-2017 集团企业经营管理信息化核心构件

GB/T 34966.1-2017 卫星导航增强信息互联网传输 第1部分:播发体制

GB/T 34966.2-2017 卫星导航增强信息互联网传输 第2部分:接口要求

GB/T 34966.3-2017 卫星导航增强信息互联网传输 第3部分:数据传输格式

GB/T 35403.1-2017 国家物品编码与基础信息通用规范 第1部分:总体框架

GB/T 35589-2017 信息技术 大数据 技术参考模型

第一部分:10种核心计算机视觉算法及其应用

计算机视觉算法是让机器“看懂”世界的关键。以下是10种最核心的算法及其典型应用场景。

算法类别 核心描述 典型应用场景
1. 卷积神经网络 (CNN) 专为图像设计的深度学习模型,通过卷积层自动提取特征。 图像分类(ImageNet)、人脸识别、医疗影像分析。
2. 边缘检测 识别图像中像素强度发生显著变化的边界。常用算法:Canny, Sobel。 目标轮廓提取、图像分割、自动驾驶中的车道线检测。
3. Haar级联分类器 基于Haar特征和级联结构的快速检测算法,采用滑动窗口。 实时人脸检测、监控系统中的行人检测。
4. 霍夫变换 用于检测图像中特定几何形状(如直线、圆)的算法。 车道线检测、交通标志(圆形)识别。
5. 光流法 计算视频序列中像素点的运动矢量场。常用算法:Lucas-Kanade。 视频稳定、运动目标跟踪、行为分析。
6. 特征点检测与匹配 检测并描述图像中的关键点(如SIFT, SURF, ORB),用于匹配不同图像。 图像拼接(全景图)、物体识别、增强现实(AR)。
7. 图像分割 将图像划分为具有相似属性的区域。方法包括:聚类、GrabCut、全卷积网络(FCN)。 医学图像分析(器官分割)、背景虚化/更换、自动驾驶场景理解。
8. 生成对抗网络 (GAN) 由生成器和判别器组成,通过对抗训练生成逼真数据。 图像生成、老照片修复、艺术风格迁移。
9. 目标检测 定位并识别图像中的多个物体,输出边界框和类别。代表模型:YOLO, Faster R-CNN, SSD。 安防监控、自动驾驶(车辆/行人检测)、零售商品识别。
10. 深度卷积生成对抗网络 (DCGAN) 结合CNN与GAN的架构,用于生成更高质量的图像。 高分辨率图像合成、数字艺术创作、数据增强。

代码示例:使用OpenCV运行YOLO进行目标检测

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
import cv2
import numpy as np

# 1. 加载YOLO模型
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
classes = []
with open("coco.names", "r") as f:
classes = [line.strip() for line in f.readlines()]
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

# 2. 读取并预处理图像
img = cv2.imread("image.jpg")
height, width, channels = img.shape
blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)

# 3. 前向传播,获取检测结果
outs = net.forward(output_layers)

# 4. 解析结果并绘制边界框
class_ids, confidences, boxes = [], [], []
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5: # 置信度阈值
# 计算边界框坐标
center_x, center_y = int(detection[0]*width), int(detection[1]*height)
w, h = int(detection[2]*width), int(detection[3]*height)
x, y = int(center_x - w/2), int(center_y - h/2)
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)

# 5. 非极大值抑制 (NMS) 去除重叠框
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

# 6. 在图像上绘制最终检测结果
font = cv2.FONT_HERSHEY_PLAIN
colors = np.random.uniform(0, 255, size=(len(classes), 3))
for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
color = colors[class_ids[i]]
cv2.rectangle(img, (x, y), (x+w, y+h), color, 2)
cv2.putText(img, label, (x, y+30), font, 2, color, 2)

cv2.imshow("Detection Result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

第二部分:16个顶级计算机视觉开发库

选择合适的工具库能极大提升开发效率。以下是当前最流行和强大的计算机视觉库。

库名称 主要特点与描述 适用场景与语言
1. OpenCV 最古老、最全面的开源计算机视觉库,提供2500+种优化算法。 通用:图像处理、目标检测、人脸识别等。支持 C++, Python, Java
2. Scikit-Image 基于NumPy的图像处理库,是Scikit-Learn的扩展,API设计简洁。 学术/研究:图像滤波、分割、特征提取。主要支持 Python
3. Pillow (PIL Fork) Python图像处理标准库,专注于图像文件的打开、操作和保存。 基础图像操作:格式转换、缩放、裁剪、绘制。支持 Python
4. TorchVision PyTorch的官方视觉库,提供数据集、模型架构和图像变换工具。 深度学习:与PyTorch无缝集成,用于训练和部署CV模型。支持 Python
5. MMCV OpenMMLab项目的基础库,为计算机视觉研究提供统一底层支持。 研究框架基础:被MMDetection, MMPose等项目依赖。支持 Python
6. YOLO (Ultralytics) 以速度著称的实时目标检测框架,社区活跃,版本迭代快(已至v8)。 实时检测:需要高帧率的目标检测应用。支持 Python
7. TensorFlow Google开发的端到端机器学习平台,拥有庞大的模型生态(TensorFlow Hub)。 生产与部署:大型模型训练、跨平台部署(TF Lite, TF.js)。支持多语言。
8. Keras 高级神经网络API,以易用性著称,现已成为TensorFlow的官方高阶API。 快速原型:让初学者和研究者能快速搭建和实验模型。支持 Python
9. MATLAB 商业数学软件,提供强大的计算机视觉工具箱和Simulink仿真环境。 工业与学术:算法开发、仿真、系统设计。付费,支持自身语言。
10. NVIDIA CUDA-X NVIDIA的GPU加速库集合,为视觉计算提供底层硬件加速。 高性能计算:需要极致速度的图像/视频处理、深度学习推理。
11. OpenVINO Intel开发的工具包,用于优化和部署视觉AI推理,支持边缘设备。 边缘计算与推理优化:在Intel硬件上高效运行训练好的模型。
12. PyTorch 由Facebook主导的深度学习框架,以动态图和灵活性深受研究人员喜爱。 研究与实验:需要灵活调整模型结构的研究项目。支持 Python
13. Caffe 早期流行的深度学习框架,以速度和模块化设计闻名,尤其适合视觉任务。 传统CV项目与部署:一些老项目仍在使用,部署较成熟。支持 C++/Python
14. Detectron2 Facebook AI Research (FAIR) 开发的基于PyTorch的目标检测与分割库。 前沿研究:实现Mask R-CNN, DensePose等先进模型。支持 Python
15. SimpleCV 一个让计算机视觉变得简单的框架,旨在降低OpenCV等库的使用门槛。 教育与入门:适合初学者理解概念,无需深入底层细节。支持 Python
16. Kornia 基于PyTorch的可微分计算机视觉库,将传统CV操作集成到深度学习流程中。 可微分视觉:需要在深度学习模型中嵌入传统CV算子的研究。

选择建议

  • 初学者/快速上手:从 OpenCV (Python接口)Keras 开始。
  • 学术研究/模型实验PyTorch + TorchVisionDetectron2 是主流。
  • 工业部署/生产环境TensorFlowOpenVINOTensorRT 更成熟。
  • 实时目标检测YOLO 系列是首选。

第三部分:21个经典开源计算机视觉数据集

高质量的数据集是训练和评估模型的基础。以下按字母顺序整理了21个经典数据集。

数据集名称 简介与规模 主要任务与类别
1. COVID-19 X-Ray 包含6500张胸部X光片,517例COVID-19病例,带有像素级肺部分割掩码。 医学图像分析:肺炎分类、肺部区域分割。
2. CIFAR-10 / CIFAR-100 小图像数据集。CIFAR-10: 6万张32x32图,10类。CIFAR-100: 100类,每类600张。 图像分类:物体与动物分类,常用于模型基准测试。
3. ImageNet 超大规模数据集,超过1400万张手工标注图像,涵盖2万多个类别。 图像分类/目标检测:计算机视觉研究的基石。
4. Kinetics-700 大型视频数据集,65万个10秒视频片段,涵盖700个人类动作类别。 视频动作识别:人与物、人与人的交互行为。
5. MNIST 经典手写数字数据集,6万训练+1万测试,28x28灰度图。 图像分类(入门):数字识别,堪称“CV界的Hello World”。
6. LSUN 大规模场景理解数据集,近百万图像,对应10个场景和20个物体类别。 场景分类/目标检测:室内外场景与物体。
7. IMDB-Wiki 最大的人脸数据集之一,52万张名人图像,标注了姓名、性别、年龄。 人脸识别/属性分析:身份、年龄、性别识别。
8. MS COCO 微软发布的大规模数据集,33万张图像,包含目标检测、分割、字幕等丰富标注。 目标检测/实例分割/图像描述:多任务基准数据集。
9. Labeled Faces in the Wild 专注于无约束条件下的人脸识别,包含1.3万张人脸图像,标注身份。 人脸验证/识别:测试模型在真实场景下的性能。
10. Cityscapes 城市街道场景数据集,50个城市,5000帧精细标注,2万帧粗略标注。 语义分割/实例分割:自动驾驶场景理解。
11. LabelMe-12-50k 包含5万张图像,12个物体类别,图像为中心物体或随机区域。 目标识别:通用物体识别。
12. Places / Places2 大规模场景分类数据集。Places: 250万图,205类。Places2: 180万图,365类。 场景识别:室内外场景分类。
13. Visual Genome 图像理解数据集,10.8万张图像,包含物体、属性、关系等密集标注。 视觉推理/场景图生成:超越检测的深层理解。
14. Stanford Dogs 狗品种识别数据集,2万余张图像,涵盖120个品种。 细粒度图像分类:犬种识别。
15. Stanford Cars 汽车型号数据集,1.6万张图像,196个类别(汽车型号)。 细粒度图像分类:汽车型号识别。
16. Cat Dataset 猫脸关键点数据集,超过9000张猫脸图像,标注9个关键点(眼、耳、嘴)。 关键点检测:动物面部特征点定位。
17. CelebFaces (CelebA) 名人脸部属性数据集,超过20万张图像,每张标注40种属性和5个关键点。 人脸属性识别/ landmark检测
18. Face Mask Detection 口罩佩戴检测数据集,853张图像,3类(戴好/未戴/错误佩戴)及边界框。 目标检测:特定场景下的安全检测。
19. Fire and Smoke Dataset 火灾与烟雾检测数据集,7000+张高清图像,涵盖多种真实场景。 异常检测/目标检测:安防与灾害预警。
20. FloodNet Dataset 飓风灾害评估数据集,2343张无人机高清图像,带有灾害损坏的语义标注。 语义分割/灾害评估:灾后分析。
21. Cat Dataset (注:原文重复,可能指另一个猫相关数据集)

数据集使用指引

  • 入门学习MNIST, CIFAR-10 复杂度低,适合练手。
  • 通用目标检测/分割MS COCO, PASCAL VOC 是行业标准。
  • 人脸相关CelebA, LFW 分别适用于属性识别和验证。
  • 自动驾驶Cityscapes, KITTI 提供街景数据。
  • 视频理解Kinetics 是动作识别的主流数据集。

总结

计算机视觉领域资源丰富,从基础算法的理解,到开发库的熟练运用,再到数据集的恰当选择,是逐步深入该领域的三个关键环节。建议初学者遵循“算法原理 -> 工具实践 -> 数据训练”的路径进行系统学习。

golang.org/x/net/websocket示例

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
package main

import (
"fmt"
"log"
"net/http"

"code.google.com/p/go.net/websocket"
)

func echo(ws *websocket.Conn) {
var err error
var i int
for {
var reply string

//建立连接后接收来自客户端的信息reply
if err == websocket.Message.Receive(ws, &reply); err != nil {
fmt.Println("error, can't receive message ...")
break
}

fmt.Println("recevied from client: " + reply)
i++

// 把收到的信息进行处理,可以做过滤也可以返回国定信息
msg := "received: " + reply
fmt.Println("send to client: " + msg)
fmt.Println(i)

// 返回消息给客户端
if err = websocket.Message.Send(ws, msg); err != nil {
fmt.Println("error,can't send message ...")
break
}
}
}

func main() {
http.Handle("/", websocket.Handle(echo))
// 访问服务器地址,ws://127.0.0.1:8088
if err := http.ListenAndServe(":8088", nil); err != nil {
log.Fatal("listen and serve: ", err)
}
}

github.com/gorilla/websocket示例

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
package main

import (
"log"
"net/http"

"github.com/gorilla/websocket"
)

var (
upgrader = websocket.Upgrader{
// 读取缓冲区空间大小
ReadBufferSize: 1024,
// 写入缓冲区空间大小
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
)

func wsHandler(w http.ResponseWriter, r *http.Request) {
//完成握手升级为websocket长连接,使用conn发送和接收消息
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("upgrade: ", err)
return
}
defer conn.Close()

for {
messageType, msg, err := conn.ReadMessage()
if err != nil {
log.Println("reading error ...", err)
return
}
log.Printf("read from client msg: %s \n", msg)

if err := conn.WriteMessage(messageType, msg); err != nil {
log.Println("writing error ...", err)
return
}
log.Printf("write msg to client: %s \n", msg)
}
}

func main() {
// 监听地址 ws://127.0.0.1:8088
http.HandleFunc("/", wsHandler)
err := http.ListenAndServe(":8088", nil)
if err != nil {
log.Fatal("listen and serve ", err.Error())
}
}

https://blog.csdn.net/maizi314/article/details/103979437
https://blog.csdn.net/wushang923/article/details/9226529
https://www.cnblogs.com/lonelyxmas/p/7979743.html
https://blog.csdn.net/yangyy9611/article/details/17464133
https://lindexi.oschina.io/lindexi/post/WPF-%E4%BD%BF%E7%94%A8%E5%B0%81%E8%A3%85%E7%9A%84-SharpDx-%E6%8E%A7%E4%BB%B6.html
https://blog.csdn.net/weixin_34320159/article/details/86132420
https://blog.csdn.net/wangsunjun/article/details/8894952
https://www.codeproject.com/Articles/15610/Regex-Validation-in-WPF
https://www.cnblogs.com/mantian/p/3816834.html
https://cloud.tencent.com/developer/ask/76782/answer/132738
https://blog.csdn.net/ZZZWWWPPP11199988899/article/details/77620211
https://blog.csdn.net/qq_38888555/article/details/82118505
https://blog.csdn.net/lwwl12/article/details/78472235
https://blog.walterlv.com/post/win10/2017/10/02/wpf-transparent-blur-in-windows-10.html
http://toto0668.blog.163.com/blog/static/30990252201691441716893/
https://blog.csdn.net/catshitone/article/details/78522931

导入pg源及签名

1
2
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

导入TimeScalaDB 源及签名
debian版

1
2
sh -c "echo 'deb [signed-by=/usr/share/keyrings/timescale.keyring] https://packagecloud.io/timescale/timescaledb/debian/ $(lsb_release -c -s) main' > /etc/apt/sources.list.d/timescaledb.list"
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | gpg --dearmor -o /usr/share/keyrings/timescale.keyring

ubuntu

1
2
sh -c "echo 'deb [signed-by=/usr/share/keyrings/timescale.keyring] https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main' > /etc/apt/sources.list.d/timescaledb.list"
wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | gpg --dearmor -o /usr/share/keyrings/timescale.keyring

安装

1
apt install postgresql-14

启动pg

1
2
3
4
5
6
7
8
9
10
11
12
13
service postgresql start

apt install postgresql-14-postgis-3

apt install timescaledb-2-2.5.1-postgresql-14

create databases test;

\c test

create extension postgis;

create extension timescaledb;

创建timescaledb扩展时会报一下错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FATAL:  extension "timescaledb" must be preloaded
HINT: Please preload the timescaledb library via shared_preload_libraries.

This can be done by editing the config file at: /etc/postgresql/14/main/postgresql.conf
and adding 'timescaledb' to the list in the shared_preload_libraries config.
# Modify postgresql.conf:
shared_preload_libraries = 'timescaledb'

Another way to do this, if not preloading other libraries, is with the command:
echo "shared_preload_libraries = 'timescaledb'" >> /etc/postgresql/14/main/postgresql.conf

(Will require a database restart.)

If you REALLY know what you are doing and would like to load the library without preloading, you can disable this check with:
SET timescaledb.allow_install_without_preload = 'on';
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.

根据提示修改配置文件

1
echo "shared_preload_libraries = 'timescaledb'" >> /etc/postgresql/14/main/postgresql.conf

重启pg

1
service postgresql restart

再次建立扩展

1
create extension timescaledb;

查看已安装好的扩展

1
\dx

大端数据格式

1
ffmpeg -i test.mp3 -f s16be -ar 16000 -ac 1 -acodec pcm_s16be pcm16k.pcm

小端数据格式

1
ffmpeg -i test.mp3 -f s16le -ar 16000 -ac 1 -acodec pcm_s16le pcm16k.pcm

说明:

  1. -acodec pcm_s16be:输出pcm格式,采用signed 16编码,字节序为大尾端(小尾端为le);
  2. -ar 16000: 采样率为16000
  3. -ac 1: 声道数为1

一、Podman 简介:Docker 的现代替代品

1.1 什么是 Podman?

Podman 是一个开源的容器运行时工具,可在大多数 Linux 平台上使用。它旨在提供与 Docker 相似的功能,但采用了更现代、更安全的架构。

1.2 Podman 与 Docker 的核心区别

特性 Docker Podman
守护进程 需要 dockerd 守护进程以 root 权限运行 无需守护进程,直接与 OCI 运行时交互
运行权限 通常需要 root 权限 支持无根(rootless)模式,普通用户可直接运行
进程模型 复杂:dockerd -> containerd -> containerd-shim -> runc 简洁:podman -> conmon -> runc
安全性 root 守护进程存在潜在安全风险 无 root 守护进程,安全性更高

架构对比图

Podman 直接调用 OCI 运行时(如 runc),通过 conmon(容器监控器)管理容器进程,无需 dockerd 这类以 root 身份运行的守护进程。

1.3 兼容性

Podman 的命令行接口与 Docker 高度兼容,大多数 Docker 命令可以直接替换为 podman。它支持管理和运行任何符合 OCI(开放容器倡议) 规范的容器和镜像,并能无缝使用 Docker Hub 等镜像仓库。

官网podman.io


二、安装与基础配置

2.1 安装 Podman

在 CentOS/RHEL 8 及更高版本上,Podman 通常是预装的。如需安装:

1
sudo yum -y install podman

2.2 配置镜像仓库与加速器

编辑配置文件 /etc/containers/registries.conf

1
2
3
4
5
6
7
8
9
10
11
# 设置镜像搜索源
[registries.search]
registries = ['docker.io']

# 设置非安全仓库(如内网HTTP Harbor)
[registries.insecure]
registries = ['10.0.0.1']

# 配置镜像加速器(如阿里云)
[registries.search]
registries = ['https://l9h8fu9j.mirror.aliyuncs.com', 'docker.io']

2.3 配置存储驱动(推荐 fuse-overlayfs)

编辑 /etc/containers/storage.conf,确保普通用户模式性能更佳:

1
2
3
[storage]
driver = "overlay"
mount_program = "/usr/bin/fuse-overlayfs" # 取消注释此行

三、Podman 常用命令速查

Podman 命令与 Docker 命令高度相似,以下是对照表:

3.1 容器生命周期管理

功能 Docker 命令 Podman 命令
创建并运行容器 docker run podman run
启动已停止容器 docker start podman start
停止运行中容器 docker stop podman stop
重启容器 docker restart podman restart
终止容器 docker kill podman kill
删除容器 docker rm podman rm
列出容器 docker ps podman ps

3.2 镜像管理

功能 Docker 命令 Podman 命令
拉取镜像 docker pull podman pull
列出镜像 docker images podman images
删除镜像 docker rmi podman rmi
构建镜像 docker build podman build
导出镜像 docker save podman save
导入镜像 docker load podman load

3.3 容器交互与诊断

功能 Docker 命令 Podman 命令
进入容器 docker exec podman exec
查看日志 docker logs podman logs
检查容器 docker inspect podman inspect
查看进程 docker top podman top
复制文件 docker cp podman cp

便捷参数:许多命令支持 --latest-l 参数来操作最近创建的容器,避免输入冗长的容器ID。


四、实战操作示例

4.1 运行一个 Web 服务器容器

1
2
3
4
5
6
7
8
9
10
11
12
13
# 拉取并运行 Apache httpd 容器
podman run -d --name my_httpd docker.io/library/httpd

# 查看运行中的容器
podman ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 0492e405b9ec docker.io/library/httpd:latest httpd-foreground 2 minutes ago Up 2 minutes my_httpd

# 获取容器的 IP 地址并访问
podman inspect my_httpd | grep IPAddress
# “IPAddress”: “10.88.0.5”
curl 10.88.0.5
# It works!

4.2 构建自定义镜像

  1. 准备 Dockerfile
    1
    2
    3
    FROM docker.io/library/centos:7
    RUN yum -y install nginx && yum clean all
    CMD ["nginx", "-g", "daemon off;"]
  2. 构建镜像
    1
    podman build -t my-nginx:latest .

4.3 推送镜像到仓库

1
2
3
4
5
6
7
8
9
10
# 1. 为镜像打标签
podman tag my-nginx:latest docker.io/yourusername/my-nginx:latest

# 2. 登录 Docker Hub
podman login docker.io
# Username: yourusername
# Password: *******

# 3. 推送镜像
podman push docker.io/yourusername/my-nginx:latest

五、高级配置:Rootless(无根)模式

Podman 的核心优势之一是支持普通用户无需 sudo 即可运行容器。

5.1 系统级前提配置

管理员需要在主机上完成以下配置:

  1. 安装必要软件

    1
    sudo yum -y install slirp4netns fuse-overlayfs shadow-utils
  2. 配置用户子UID/GID
    Podman 要求用户在 /etc/subuid/etc/subgid 文件中拥有唯一的 UID/GID 范围。

    1
    2
    3
    4
    5
    6
    # 查看现有分配
    cat /etc/subuid
    cat /etc/subgid

    # 为用户 `tom` 分配 UID/GID 范围(管理员操作)
    sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 tom

    文件格式为:用户名:起始UID:数量

  3. 调整内核参数(允许绑定低端口)

    1
    2
    3
    4
    5
    6
    # 允许非特权用户绑定 80 及以上端口
    echo 'net.ipv4.ip_unprivileged_port_start=80' | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p

    # 允许非特权用户使用 ping(ICMP)
    sudo sysctl -w "net.ipv4.ping_group_range=0 2000000"

5.2 用户级配置

普通用户 tom 登录后,可以创建个人配置文件 ~/.config/containers/ 来覆盖系统默认设置。

5.3 Rootless 模式下的卷挂载

在 rootless 模式下挂载卷时,容器内的文件属主会映射到主机用户的子UID。使用 --userns=keep-id 选项可以让容器内的进程以与主机用户相同的 UID 运行,简化文件权限管理。

1
2
3
4
5
6
7
# 1. 创建数据目录
mkdir ~/data

# 2. 运行容器并挂载卷(使用 keep-id 保持用户ID一致)
podman run -it -v "$HOME/data:/data" --userns=keep-id docker.io/library/busybox /bin/sh

# 在容器内创建的文件,在主机上查看属主将是 `tom` 用户

5.4 Rootless 模式下的端口映射

  • 默认:非特权用户只能映射 1024 及以上 的端口。
  • 配置后:通过修改 net.ipv4.ip_unprivileged_port_start=80,可以映射 80 及以上 的端口。
    1
    2
    3
    4
    5
    # 映射 8080 端口(始终允许)
    podman run -d -p 8080:80 docker.io/library/httpd

    # 映射 80 端口(需上述内核配置)
    podman run -d -p 80:80 docker.io/library/httpd

六、故障排除与技巧

6.1 设置命令别名

如果习惯 Docker 命令,可以为 Podman 设置别名实现无缝切换:

1
2
echo "alias docker=podman" >> ~/.bashrc
source ~/.bashrc

现在,你可以继续使用 docker 命令,但实际上调用的是 podman

6.2 用户镜像隔离

Root 用户和普通用户拥有独立的镜像和容器存储空间,互不可见。

1
2
3
4
5
6
# root 用户查看
sudo podman images

# 普通用户 tom 查看
podman images
# 输出为空,除非 tom 自己拉取或构建过镜像

6.3 查看容器进程树

利用 Podman 简洁的进程模型进行调试:

1
2
3
4
# 查看容器相关进程
pstree -p | grep -A 5 -B 5 podman
# 或
podman top <容器名>

七、总结

Podman 作为 Docker 的现代替代品,凭借其无需守护进程原生支持 Rootless 模式与 Docker CLI 高度兼容的特性,为容器运行提供了更安全、更灵活的解决方案。

迁移建议

  1. 对于新项目或新环境,优先考虑 Podman
  2. 对于现有 Docker 用户,可以通过设置别名 alias docker=podman 平滑过渡。
  3. 充分利用 Rootless 模式 提升安全性,特别是在多用户环境或 CI/CD 流水线中。

通过掌握 Podman 的核心概念、命令和配置,你可以在享受容器技术便利的同时,构建更安全、更高效的容器化工作流。

一、问题诊断与协议识别

当克隆(git clone)或拉取/推送(git pull/git push)远程仓库时,如果遇到速度极慢、频繁超时甚至失败的情况,很可能是网络连接问题。此时,为 Git 配置代理是有效的解决方案。

首先,识别你使用的 Git 远程协议

  • HTTP/HTTPS 协议:远程地址以 http://https:// 开头。
    1
    https://github.com/user/repo.git
  • SSH 协议:远程地址以 git@ssh:// 开头。
    1
    git@github.com:user/repo.git

代理类型:你需要知道本地代理软件提供的协议和端口,通常是 HTTP/HTTPS 代理SOCKS5 代理


二、为 HTTP/HTTPS 协议配置代理

此方法通过 Git 自身的配置项设置代理,适用于使用 http://https:// 地址的仓库。

2.1 为所有仓库设置全局代理

1
2
3
4
5
# 设置 HTTP/HTTPS 代理(端口 7890 为例)
git config --global http.proxy http://127.0.0.1:7890

# 设置 SOCKS5 代理(端口 7891 为例)
git config --global http.proxy socks5://127.0.0.1:7891

参数说明

  • --global:修改全局配置文件(~/.gitconfig),对所有仓库生效。
  • http://127.0.0.1:7890:代理地址和端口,请替换为你本地代理软件的实际设置。
  • 重要提示:Git 中 http.proxy 配置项同时作用于 http://https:// 协议,没有独立的 https.proxy 配置项

2.2 为特定域名设置代理

如果只想为某个网站(如 GitHub)使用代理,可以针对性地配置。

1
2
3
4
5
# 为 GitHub 设置 HTTP/HTTPS 代理
git config --global http.https://github.com.proxy http://127.0.0.1:7890

# 为 GitHub 设置 SOCKS5 代理
git config --global http.https://github.com.proxy socks5://127.0.0.1:7891

优势:此配置仅影响对 github.com 的访问,其他仓库仍走直连,更灵活。

2.3 查看与取消代理配置

1
2
3
4
5
6
7
8
9
# 查看所有 Git 配置
git config --global --list
# 或查看具体的代理配置
git config --global --get http.proxy

# 取消全局代理设置
git config --global --unset http.proxy
# 取消针对 GitHub 的代理设置
git config --global --unset http.https://github.com.proxy

三、为 SSH 协议配置代理

当使用 git@ 格式的地址时,Git 依赖 SSH 进行通信。此时需要配置 SSH 客户端本身,通过修改 ~/.ssh/config 文件实现。

3.1 Linux 和 macOS 用户配置

编辑 ~/.ssh/config 文件(如果不存在则创建):

1
nano ~/.ssh/config

针对 HTTP/HTTPS 代理

1
2
3
Host github.com
User git
ProxyCommand nc -X connect -x 127.0.0.1:7890 %h %p

针对 SOCKS5 代理

1
2
3
4
5
6
7
8
9
# 方式一:明确指定协议
Host github.com
User git
ProxyCommand nc -X 5 -x 127.0.0.1:7891 %h %p

# 方式二:默认协议(效果相同)
Host github.com
User git
ProxyCommand nc -x 127.0.0.1:7891 %h %p

参数详解

  • Host github.com:指定此配置仅对访问 github.com 生效。可替换为 gitlab.com 等。
  • User git:SSH 连接用户,对于 Git 服务通常为 git
  • ProxyCommand:指定通过代理建立连接的命令。
  • ncnetcat 命令,用于网络连接。
  • -X connect:指定使用 HTTP CONNECT 方法(用于 HTTPS 代理)。
  • -X 5:指定使用 SOCKS5 协议。
  • -x 127.0.0.1:port:指定代理服务器地址和端口。
  • %h %p:SSH 运行时自动替换为目标主机名和端口。

3.2 Windows 用户配置

Windows 系统通常使用 connect 工具(Git for Windows 自带)。编辑 ~/.ssh/config 文件(路径通常为 C:\Users\你的用户名\.ssh\config)。

针对 HTTP/HTTPS 代理

1
2
3
Host github.com
User git
ProxyCommand connect -H 127.0.0.1:7890 %h %p

针对 SOCKS5 代理

1
2
3
Host github.com
User git
ProxyCommand connect -S 127.0.0.1:7891 %h %p

参数说明

  • connect:Git for Windows 自带的代理连接工具。
  • -H:指定 HTTP 代理。
  • -S:指定 SOCKS5 代理。

3.3 测试 SSH 连接

配置完成后,测试 SSH 是否能通过代理正常连接:

1
ssh -T git@github.com

如果看到类似 Hi username! You've successfully authenticated... 的成功提示,则配置正确。


四、综合配置示例与最佳实践

4.1 混合环境配置示例

假设你的环境是:

  • GitHub 使用 SSH 协议 + SOCKS5 代理(端口 7891)。
  • 公司内网 GitLab 使用 HTTPS 协议直连。
  • 其他所有 HTTPS 仓库使用 HTTP 代理(端口 7890)。

对应配置

  1. **SSH 配置 (~/.ssh/config)**:

    1
    2
    3
    4
    5
    6
    Host github.com
    User git
    ProxyCommand nc -x 127.0.0.1:7891 %h %p
    Host internal.gitlab.com
    User git
    # 无 ProxyCommand,表示直连
  2. Git 全局配置

    1
    2
    3
    4
    # 为所有 HTTPS 仓库设置代理
    git config --global http.proxy http://127.0.0.1:7890
    # 排除公司内网 GitLab,让其直连
    git config --global http.http://internal.gitlab.com.proxy ""

4.2 快速切换脚本(高级用法)

可以创建 Shell 脚本或别名来快速启用/禁用代理。

1
2
3
# 在 ~/.bashrc 或 ~/.zshrc 中添加别名
alias git-proxy-on="git config --global http.proxy socks5://127.0.0.1:7891"
alias git-proxy-off="git config --global --unset http.proxy"

然后执行 source ~/.bashrc 后,即可通过 git-proxy-ongit-proxy-off 快速切换。


五、常见问题与故障排除

  1. 错误:Failed to connect to 127.0.0.1 port 7890: Connection refused
    原因:代理服务器未运行,或端口号错误。
    解决:确认本地代理软件(如 Clash、V2Ray)已启动,并检查其监听的端口号。

  2. 配置后速度反而变慢或失败
    原因:代理服务器不稳定或网络延迟高。
    解决:尝试更换代理节点,或对特定仓库使用直连(git config --unset)。

  3. 如何为 git:// 协议设置代理?
    git:// 协议使用 9418 端口,不常用且通常不支持代理。建议改用 HTTPS 或 SSH 协议。

  4. 公司内网环境注意事项
    如果公司网络已提供透明代理或强制使用自己的代理,可能需要联系 IT 部门获取正确的代理地址,并可能需要配置 no_proxy 环境变量来排除内部地址。


六、总结

场景 协议 配置位置 关键命令/配置
通用 HTTPS 仓库 HTTP/HTTPS Git 全局配置 git config --global http.proxy http://127.0.0.1:7890
特定 HTTPS 仓库 HTTP/HTTPS Git 全局配置 git config --global http.https://github.com.proxy ...
SSH 仓库 SSH ~/.ssh/config 文件 ProxyCommand nc -x 127.0.0.1:7891 %h %p

核心步骤

  1. 确定协议:查看远程仓库地址是 https:// 还是 git@
  2. 确定代理:弄清本地代理的协议(HTTP/HTTPS 或 SOCKS5)和端口。
  3. 对症下药
    • HTTPS 协议:使用 git config 命令。
    • SSH 协议:编辑 ~/.ssh/config 文件。
  4. 测试验证:通过 git clone 一个小仓库或 ssh -T 测试连接。
0%