Aug. 5, 2026
Docker 中的三种挂载方式

bind
把宿主机的某个目录(或文件)挂载到指容器的指定目录(后文件)下,比如下面的命令就表示通过 Bind 方式将外部的 HTML 文档挂载到 Nginx 容器的模式网站根目录下:
docker run -v ~/zioyi/html:/usr/share/nginx/html -p 81:80 -d --name nginx_bind nginx:latest
这种方式的缺点就是被挂载的宿主机目录(或文件)不收保护,任何容器都可以去随意修改。
Volume
Volume 模式下,我们需要通过docker volume命令来创建一个 Volume。实际上,是在 Docker 的/var/lib/docker/volumes/文件夹内创建一个相同名字的文件夹来保存数据。因为这个文件夹在 Docker 管控范围里,Docker 可以根据挂载的设定来控制容器对 Volume 的读写权限。
创建 volume
$ docker volume create nginx-volume
nginx-volume
$ docker run --mount type=volume,source=nginx-volume,destination=/usr/share/nginx/html -p 82:80 -d --name nginx_volume nginx:latest
此时,nginx_volume 容器已经挂载了 nginx-volume 卷,通过 inpsect 命令可以看到:
shelll代码解读复制代码
docker inspect nginx_volume
{...
"Mounts": [
{
"Type": "volume",
"Name": "nginx-volume",
"Source": "/var/lib/docker/volumes/nginx-volume/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
...}
当我们删除容器 nginx_volum 时,volume 也不会删除
Aug. 5, 2026
1、准备工作
1.1、三台机器并配置hosts,
vim /etc/hosts
192.168.2.134 k8s-node-02
192.168.2.135 k8s-node-01
192.168.2.136 k8s-master
1.2、在所有节点增加yum源:
/etc/yum.repos.d/kubernetes.repo
注意:没有找到 kubernetes-el8的
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
粘贴上面的或者使用下面的脚本
配置源
配置源
cat «EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
说明:
enabled=1 :开启
gpgcheck=0 :是否开启gpg签名,1开启,0关闭
repo_gpgcheck=0 :是否检查元数据信息文件的签名信息与完整性,1开启,0关闭
1.3、在所有节点修改环境
关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
关闭selinux
临时禁用selinux
setenforce 0
永久关闭修改/etc/sysconfig/selinux文件设置
sed -i ’s/SELINUX=permissive/SELINUX=disabled/’ /etc/sysconfig/selinux
sed -i “s/SELINUX=enforcing/SELINUX=disabled/g” /etc/selinux/config
禁用交换分区
swapoff -a
永久禁用,打开/etc/fstab注释掉swap那一行。
sed -i ’s/.swap./#&/’ /etc/fstab
Aug. 5, 2026
环境说明
k8s 1.28.2
containerd 1.7.8
runc.amd64 1.1.9
anolis 8.8
环境准备
修改主机名
hostnamectl set-hostname 修改host
vim /etc/hosts
192.168.2.124 master124
192.168.2.125 master125
192.168.2.126 master126
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
sed -i ’s/SELINUX=permissive/SELINUX=disabled/’ /etc/sysconfig/selinux
sed -i “s/SELINUX=enforcing/SELINUX=disabled/g” /etc/selinux/config
swapoff -a
sed -i ’s/.swap./#&/’ /etc/fstab
cat «EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl –system
chronyc -a makestep
和之前不一样的地方
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p /etc/sysctl.d/k8s.conf
安装containerd
tar xf containerd-1.6.6-linux-amd64.tar.gz
cp -r bin/* /usr/local/bin
vim /etc/systemd//system/containerd.service
Aug. 5, 2026
环境准备:
192.168.2.117 node117
192.168.2.123 node123
192.168.2.124 master124
192.168.2.125 master125
192.168.2.126 master126
keeplive vip 192.168.2.130 cluster-endpoint
k8s 1.28.2
containerd 1.7.8
runc.amd64 1.1.9
anolis 8.8
ubuntu 22.04
在所有节点修改环境
修改主机名
hostnamectl set-hostname 修改host
vim /etc/hosts
192.168.2.117 node117
192.168.2.123 node123
192.168.2.124 master124
192.168.2.125 master125
192.168.2.126 master126
192.168.2.130 cluster-endpoint
#anolis服务器
systemctl disable firewalld
systemctl stop firewalld
#ubuntu服务器
sudo ufw status
启用 / 禁用
sudo ufw enable / disable
setenforce 0
sed -i ’s/SELINUX=permissive/SELINUX=disabled/’ /etc/sysconfig/selinux
sed -i “s/SELINUX=enforcing/SELINUX=disabled/g” /etc/selinux/config
swapoff -a
sed -i ’s/.swap./#&/’ /etc/fstab
cat «EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl –system
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p /etc/sysctl.d/k8s.conf
chronyc -a makestep
#还要配置免密登录(暂时还不知道什么用处所以所有服务器我都配置了)
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.2.123
安装配置containerd
tar xf containerd-1.6.6-linux-amd64.tar.gz
cp -r bin/* /usr/local/bin
vim /etc/systemd//system/containerd.service
Aug. 5, 2026
关闭 swap 内存
执行如下命令关闭swap内存
swapoff -a
vi /etc/fstab
注释掉swap 那行
docker 的安装并修改配置
修改docker的/etc/docker/daemon.js文件进行设置
kubernetes默认设置cgroup驱动(cgroupdriver)为"systemd",而docker服务的cgroup驱动默认为"cgroupfs",建议将其修
改为"systemd",与kubernetes保持一致,可以通过修改docker的/etc/docker/daemon.js文件进行设置
{
“registry-mirrors” : [
“https://mirror.ccs.tencentyun.com”,
“http://registry.docker-cn.com”,
“http://docker.mirrors.ustc.edu.cn”,
“http://hub-mirror.c.163.com”,
“http://harbor.dym.com”
],
“insecure-registries”:[“harbor.dym.com”],
“exec-opts”: [“native.cgroupdriver=systemd”]
}
通过systemctl restart docker命令重启docker让配置生效
添加源
sudo tee /etc/apt/sources.list.d/kubernetes.list «EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
====== 或者
apt install -y apt-transport-https gnupg gnupg2 gnupg1 curl lsb-release
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat «EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 6A030B21BA07F4FB
更新源列表
sudo apt-get update
安装 kubectl,kubeadm以及 kubelet
sudo apt-get install -y kubelet kubeadm kubectl
指定版本安装
查找所有版本的软件包
root@k8smaster:~#sudo apt-cache madison kubeadm
kubeadm | 1.7.11-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main
amd64 Packages
kubeadm | 1.7.10-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main
amd64 Packages
kubeadm | 1.7.9-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main
amd64 Packages
安装指定版本的包
sudo apt install -y kubelet=1.23.5-00
运行systemctl start命令启动kubelet服务,并设置为开机自动启动
sudo systemctl start kubelet
Aug. 5, 2026
前言
从 k8s 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker却不支持
kubernetes主推的CRI(容器运行时接口)标准,所以docker不能再作为k8s的容器运行时
了,即从k8s v1.24开始不再使用docker了
但是如果想继续使用docker的话,可以在kubelet和docker之间加上一个中间层cri-docker。
cri-docker是一个支持CRI标准的shim(垫片)。一头通过CRI跟kubelet交互,另一头跟
docker api交互,从而间接的实现了kubernetes以docker作为容器运行时。但是这种架构缺点
也很明显,调用链更长,效率更低。
本文采用了cri-docker的使用,但是更推荐使用containerd作为k8s的容器运行时
部署 cri-dockerd
官方信息
开源地址https://github.com/Mirantis/cri-dockerd
下载地址https://github.com/Mirantis/cri-dockerd/releases
cri-dockerd部署
解压并执行以下命令
tar -xf cri-dockerd-0.2.6.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
chmod +x /usr/bin/cri-dockerd
配置启动⽂件,执行如下命令
cat «“EOF” > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd –network-plugin=cni –pod-infra-container-
image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
⽣成 socket ⽂件,执行如下命令
cat «“EOF” > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
启动 cri-docker 并设置开机⾃动启动
systemctl daemon-reload
systemctl enable cri-docker –now
Aug. 5, 2026
报错: [ERROR FileContent–proc-sys-net-ipv4-ip_forward]:
/proc/sys/net/ipv4/ip_forward contents are no
报错: [ERROR FileContent–proc-sys-net-ipv4-ip_forward]:
/proc/sys/net/ipv4/ip_forward contents are not set to 1
解决方案:
执行命令
sysctl -w net.ipv4.ip_forward=1
有的服务器执行下面的好使
proc/sys/net/ipv4/ip_forward这个文件表示是否打开IP转发。
0代表禁止
1代表转发
使用下列命令,查看文件的内容
less /proc/sys/net/ipv4/ip_forward
1
如图所示:里面是0.表示禁止转发
使用下列命令,更改文件的内容:
echo “1” > /proc/sys/net/ipv4/ip_forward
使用下列命令,重启网络服务
service network restart
然后关掉虚拟机,重启,再次查看文件的内容,已经更改
或者
一、临时生效,重启失效
1、sysctl -w net.ipv4.ip_forward=1
2、echo 1 > /proc/sys/net/ipv4/ip_forward
二、永久生效
修改 /etc/sysctl.conf,增加一条:net.ipv4.ip_forward = 1 (uos有效)
要想是更改生效,你需要执行以下指令:
sysctl -p /etc/sysctl.conf
在红帽系列的发行版上可以通过重启网络服务使之生效:
service network restart
而在debian/ubuntu系列的发行版则用这样的命令:
/etc/init.d/procps.sh restart

Aug. 5, 2026
#Error from server (Forbidden): pods is forbidden: User “system:serviceaccount:gitlab-
sjfw:default” cannot list resource “pods” in API group "" in the namespace
“dataframework”
kubectl create clusterrolebinding gitlab-sjfw:default–clusterrole=cluster-admin –
group=system:serviceaccounts –namespace=dataframework
Aug. 5, 2026
Master 负责管理集群负责协调集群中的所有活动,例如调度应用程序,维护应用程序的状态,扩展
和更新应用程序。
Worker节点(即图中的Node)是VM(虚拟机)或物理计算机,充当k8s集群中的工作计算机。每个
Worker节点都有一个Kubelet,它管理该Worker节点并负责与Master节点通信。该Worker节点还应具
有用于处理容器操作的工具,例如Docker。
kubectl 是 k8s 的客户端工具,可以使用命令行管理集群。负责 master 节点和 worker 节点之间通信
的进程;管理 Pod(容器组)和 Pod(容器组)内运行的 Container(容器)。
Deployment 译名为部署。在k8s中,通过发布 Deployment,可以创建应用程序 (docker image) 的
实例 (docker container),这个实例会被包含在称为 Pod 的概念中,Pod 是 k8s 中最小可管理单元。
在 k8s 集群中发布 Deployment 后,Deployment 将指示 k8s 如何创建和更新应用程序的实例,
master 节点将应用程序实例调度到集群中的具体的节点上。Deployment 处于 master 节点上,通过
发布 Deployment,master 节点会选择合适的 worker 节点创建 Container(即图中的正方体),
Container 会被包含在 Pod (即蓝色圆圈)里。
Pod 容器组是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容
器),以及这些 container (容器)的一些共享资源。这些资源包括:
共享存储,称为卷(Volumes)
网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享
该IP地址
container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等
Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创
建包含容器的 Pod (而不是直接创建容器)。每个Pod都与运行它的 worker 节点(Node)绑定,并保
持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node)
上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不
Aug. 5, 2026
解决k8s集群环境容器组报 network: open
/run/flannel/subnet.env: no such file or directory
k8s集群环境由于机器显卡故障,导致节点连接失败,出现大量1000多个 pending 容器,查看容器
容器组里报
network is not ready: [runtime network not ready: NetworkReady=false
reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config
uninitialized]
network: open /run/flannel
看网上一些方法是把其他机器 /run/flannel/subnet.env 考到这台机器试过后,虽然能恢复,
但一头栽进容器内部无法连外网,一直找为啥容器无法连外网,这个坑。。。。
折腾了一大圈,最后教训是让k8s自己恢复网络
在master 节点执行
kubectl apply -f kube-flannel.yml
稍等可以看到该节点的 kube-flannel-xxxx 部署正常,其余的坐等k8s 自己恢复即可
Aug. 5, 2026
前言
默认情况下,k8s 集群 nodePort 分配的端口范围为:30000-32767,如果
我们需要更多的端口,或者重新规划使用端口,需要进行调整
处理方法
找到kube-apiserver.yaml文件的绝对路径,其路径
为"/etc/kubernetes/manifests/kube-apiserver.yaml",并添加参数"- –
service-node-port-range=1-65535",如下所示:
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 192.168.2.216:6443
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
command:
kube-apiserver
–service-node-port-range=1-65535# 此行为添加的内容
–advertise-address=192.168.1.233
–allow-privileged=true
–audit-log-maxage=30
–audit-log-maxbackup=10
–audit-log-maxsize=100
–authorization-mode=Node,RBAC
–bind-address=0.0.0.0
–client-ca-file=/etc/kubernetes/pki/ca.crt
–enable-admission-plugins=NodeRestriction
–enable-bootstrap-token-auth=true
–etcd-cafile=/etc/ssl/etcd/ssl/ca.pem
–etcd-certfile=/etc/ssl/etcd/ssl/node-k8s-test-env-master-1.pem
–etcd-keyfile=/etc/ssl/etcd/ssl/node-k8s-test-env-master-1-key.pem
–etcd-
servers=https://192.168.1.233:2379,https://192.168.1.234:2379,https://192.168.1.235:2379
–feature-
gates=ExpandCSIVolumes=true,RotateKubeletServerCertificate=true,TTLAfterFinished=true,CSI
StorageCapacity=true
–insecure-port=0
–kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
–kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
–kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
–proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
–proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
–requestheader-allowed-names=front-proxy-client
–requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
–requestheader-extra-headers-prefix=X-Remote-Extra-
–requestheader-group-headers=X-Remote-Group
–requestheader-username-headers=X-Remote-User
–secure-port=6443
–service-account-issuer=https://kubernetes.default.svc.cluster.local
–service-account-key-file=/etc/kubernetes/pki/sa.pub
–service-account-signing-key-file=/etc/kubernetes/pki/sa.key
–service-cluster-ip-range=10.233.0.0/18
–tls-cert-file=/etc/kubernetes/pki/apiserver.crt
–tls-private-key-file=/etc/kubernetes/pki/apiserver.key
image: registry.cn-beijing.aliyuncs.com/kubesphereio/kube-apiserver:v1.21.5
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 192.168.1.233
path: /livez
port: 6443
scheme: HTTPS
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 15
name: kube-apiserver
readinessProbe:
failureThreshold: 3
httpGet:
host: 192.168.1.233
path: /readyz
port: 6443
Aug. 5, 2026
解决kubernetes集群中部署服务的pod ip显示docker ip 问题
项目场景:
kubernetes集群中,其中一个node节点上部署的服务无法访问,经过查看,发现创建的服务显示的pod ip 是不对的,走
的是docker ip,如下图:
原因分析:
发现其它节点部署服务都是正常的,走的都是calico的ip,只有这个节点走的是docker ip,本集群部署用的网络组件是
calico,分析可能是kubelet的配置文件中可能没有添加cni这个参数导致,calico需要cni插件的支持,如果没有配置,可
能会走默认的docker0网络
解决方案:
在kubelet的配置文件中添加如下参数,然后重启kubelet:
vim /var/lib/kubelet/kubeadm-flags.env
增加:
–network-plugin=cni
然后到master节点get po 发现pod的ip显示正常了:


Aug. 5, 2026
报错
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox
container “749210afc5044fc6f5a249d2f6107d2719b46326647bd96705e6400e01afd61f” network for
pod “online-web-zhili-7c646c59c7-4bzl2”: networkPlugin cni failed to set up pod “online-
web-zhili-7c646c59c7-4bzl2_zg”
network: failed to delegate add: failed to set bridge addr: “cni0” already has an IP
address different from 10.244.2.1/24
1.首先我们重新配置k8s的flannel文件,可以参考其他环境的文件配置,也
可以重新安装插件生成,会在/run下面生成flannel文件夹,下面包含网络配
置环境变量
注明:三个节点的subnet网段不能相同
2.重配flannel之后发现,有两个节点依然不能分配网络,导致服务error
查看error的pod日志,发现报错,对应节点的cni网络冲突
3.查看出错节点cni0的网卡配置,发现cni0的这个网卡地址是10.244.2.1,
明显与报错中的10.244.1.1不一致
4.我们可以将其改为10.244.1.1,也可将这个错误的网卡删掉,它会自己重
建,这里采用删除重生的方法,首先停用网络,然后删除配置
ifconfig cni0 down
ip link delete cni0
然后查看节点重建的cni0网卡,会依据flannel的网络环境配置生成
5.查看集群环境服务,系统恢复。
Aug. 5, 2026
解决办法:
1、查看命名空间:
[root@zepc-jh-nginx home]# kubectl get ns
NAMESTATUSAGE
default Active 7d5h
gitlab-sjfw Active 4d6h
kube-node-lease Active 7d5h
kube-public Active 7d5h
kube-system Active 7d5h
kuboard Terminating 7d4h
skeleton Active 32h
#强制删除也无法删除
[root@zepc-jh-nginx home]# kubectl delete ns kuboard –force –grace-period=0
warning: Immediate deletion does not wait for confirmation that the running resource has
been terminated. The resource may continue to run on the cluster indefinitely.
namespace “kuboard” force deleted
2、查看kubernetes-dashboard的命名空间描述
kubectl get ns kuboard -o json > kuboard.json
3、编辑
sudo vim kuboard.json
删除spec
删除前
删除后
Aug. 5, 2026
K8s默认是只能部署Pod在node节点上,如果master资源足或你希望能将pod也在master上进行部署,执行以下
操作进行。
1.###设置pod能部署在k8s-master节点
kubectl taint node k8s-master node-role.kubernetes.io/master-
结果如下:
[root@k8s-master ~]# kubectl taint node k8s-master node-role.kubernetes.io/master-
node/k8s-master untainted
2.###假如想取消pod能部署在k8s-master节点
kubectl taint node k8s-master node-role.kubernetes.io/master=:NoSchedule
结果如下:
[root@k8s-master ~]# kubectl taint node k8s-master node-
role.kubernetes.io/master=:NoSchedule
node/k8s-master tainted
作者:冰之杍
链接:https://juejin.cn/post/6986086590007214087
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Aug. 5, 2026
kubeadm reset -f
yum remove -y kubelet kubeadm kubectl
rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*
rm -rf $HOME/.kube/config
cni
ifconfig cni0 down
ip link delete cni0
rm -rf /var/lib/cni/
rm -f /etc/cni/net.d/*
flannel
ifconfig flannel.1 down
ip link delete flannel.1
rm -fr /var/run/flannel/
rm -fr /etc/kube-flannel
rm -rf /etc/cni/net.d/*
rm -rf /var/lib/cni/calico
systemctl restart kubelet
yum remove -y kubelet kubeadm kubectl
删除rpm包
rpm -qa|grep kube*|xargs rpm –nodeps -e
Aug. 5, 2026
在部署ARM架构Kubernetes实践中,我发现主机加入时使用的是无线网卡接口的IP地址( 网段):
kubectl get nodes -o wide
显示:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE
KERNEL-VERSION CONTAINER-RUNTIME
jetson Ready 19h v1.19.4 192.168.0.34 Ubuntu
18.04.5 LTS 4.9.140-tegra docker://19.3.6
pi-master1 Ready master 6d17h v1.19.4 192.168.6.11 Ubuntu
20.04.1 LTS 5.4.0-1022-raspi docker://19.3.8
pi-worker1 Ready 3d5h v1.19.4 192.168.6.15 Ubuntu
20.04.1 LTS 5.4.0-1022-raspi docker://19.3.8
pi-worker2 Ready 3d5h v1.19.4 192.168.6.16 Ubuntu
20.04.1 LTS 5.4.0-1022-raspi docker://19.3.8
参考How to specify Internal-IP for kubernetes worker node,需要修订jetson的kubelet配置,明确指定,这
样kubelet公告就能够正确指定node的。原文是说修改配置,添
加这行配置。不过,现在kubelet的systemd配置目录
下明确说明了kubelet的扩展配置参数是从读取的:
set_k8s_worker_internal_ip/10-kubeadm.conf
1# Note: This dropin only works with kubeadm and kubelet v1.11+
2[Service]
3Environment=“KUBELET_KUBECONFIG_ARGS=–bootstrap-kubeconfig=/etc/kubernetes/bootstrap-
kubelet.conf –kubeconfig=/etc/kubernetes/kubelet.conf”
4Environment=“KUBELET_CONFIG_ARGS=–config=/var/lib/kubelet/config.yaml”
5# This is a file that “kubeadm init” and “kubeadm join” generates at runtime,
populating the KUBELET_KUBEADM_ARGS variable dynamically
6EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
7# This is a file that the user can use for overrides of the kubelet args as a last
resort. Preferably, the user should use
8# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead.
KUBELET_EXTRA_ARGS should be sourced from this file.
9EnvironmentFile=-/etc/default/kubelet
10ExecStart=
Aug. 5, 2026
redis-ha-4.4.6.tgz
现在这种模式无法外部访问,redis可以访问哨兵不能访问,但是哨兵模式可以集群内部访问,配置方式如下
spring:
redis:
database: 1
password: gilight123!@#
timeout: 3000
sentinel:
master: mymaster
password: gilight123!@# #哨兵的密码
nodes:
- redis-node-0.redis-headless.basic-components.svc.cluster.local:26379
- redis-node-1.redis-headless.basic-components.svc.cluster.local:26379
- redis-node-2.redis-headless.basic-components.svc.cluster.local:26379
[root@kubernetes01 home]# helm search repo redis
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/redis 17.8.0 7.0.8 Redis(R) is an
open source, advanced key-value …
bitnami/redis-cluster 8.3.7 7.0.8 Redis(R) is an
open source, scalable, distribut…
stable/prometheus-redis-exporter 3.5.1 1.3.4 DEPRECATED
Prometheus exporter for Redis metrics
stable/redis 10.5.7 5.0.7 DEPRECATED Open
source, advanced key-value stor…
stable/redis-ha 4.4.6 5.0.6 DEPRECATED -
Highly available Kubernetes implem…
stable/sensu 0.2.5 0.28 DEPRECATED Sensu
monitoring framework backed by…
[root@kubernetes01 home]# helm fetch stable/redis-ha
[root@kubernetes01 home]# ls
redis-ha-4.4.6.tgz
[root@kubernetes01 home]# tar -xvf redis-ha-4.4.6.tgz
redis-ha/Chart.yaml
redis-ha/values.yaml
redis-ha/templates/NOTES.txt
redis-ha/templates/_configs.tpl
redis-ha/templates/_helpers.tpl
redis-ha/templates/redis-auth-secret.yaml
redis-ha/templates/redis-ha-announce-service.yaml
redis-ha/templates/redis-ha-configmap.yaml
redis-ha/templates/redis-ha-exporter-script-configmap.yaml
redis-ha/templates/redis-ha-pdb.yaml
redis-ha/templates/redis-ha-role.yaml
redis-ha/templates/redis-ha-rolebinding.yaml
redis-ha/templates/redis-ha-service.yaml
redis-ha/templates/redis-ha-serviceaccount.yaml
redis-ha/templates/redis-ha-servicemonitor.yaml
redis-ha/templates/redis-ha-statefulset.yaml
redis-ha/templates/redis-haproxy-deployment.yaml
redis-ha/templates/redis-haproxy-service.yaml
redis-ha/templates/redis-haproxy-serviceaccount.yaml
redis-ha/templates/redis-haproxy-servicemonitor.yaml
redis-ha/templates/tests/test-redis-ha-configmap.yaml
redis-ha/templates/tests/test-redis-ha-pod.yaml
redis-ha/README.md
redis-ha/ci/haproxy-enabled-values.yaml
[root@kubernetes01 home]# ls
redis-ha redis-ha-4.4.6.tgz
[root@kubernetes01 redis-ha]# ls
Chart.yaml ci README.md templates values.yaml
[root@kubernetes01 redis-ha]# vim values.yaml
haproxy:
Aug. 5, 2026
配置好的 charts
mysql-9.5.0.tgz
helm search repo bitnami/mysql
helm pull bitnami/mysql
tar -xvf mysql-9.5.0.tgz
vim values.yaml
helm package .
helm install mysql mysql-9.5.0.tgz -n basic-components
Aug. 5, 2026
helm pull bitnami/redis
tar -zxvf redis-17.8.0.tgz
cd redis
vim values.yaml
helm package .
helm install redis redis-17.8.0.tgz -n basic-components
原始版本(下载下来未修改的):
redis-17.8.0.tgz
修改好的:
redis-17.8.0.tgz
修改后的value:
values (1).yaml
Aug. 5, 2026
终于在kubepod上发现了异常
dmesg | grep -i memory
内核日志:Memory cgroup out of memory kill process pid
问题已经清晰了,这是一个典型的cgroup memory导致的内存泄漏问题
cgroup memory内存泄漏
k8s集群随着pod增多,运行久了之后就会出现不能创建pod的情况。执行kubectl describe pod命令可以发现 cannot
allocate memory异常。重启对应的服务器之后异常提示才会消失。但继续随着运行时间推移,该问题依然会出现,最终
内存会耗尽,系统会强杀节点释放内存。
使用cat /sys/fs/cgroup/memory/kubepods/memory.kmem.slabinfo检查问题node,如下图则说明没有存在内存泄
漏
如下图显示则说明存在内存泄漏
kmem导致的内存泄露
内核对每个cgroup 子系统的的内存地址页是有限制的,限制的大小定义在 kernel/cgroup.c #L139上。在 cgroup 创建一
个内存地址之后,当开启了 kmem 功能,虽然 cgroup 的地址页删除了,但是内存不会回收。也就是说在3.1内核版本
下,开启了 kmem 功能就会导致内存泄漏。该问题会导致可分配内存越来越少,直到无法创建新 pod 或节点宕机
注:该内存泄漏问题在3.10 的内核上存在,4.x的内核已经修复
解决方案
1:内核参数文件 /boot/grub2/grub.cfg中添加cgroup.memory=nokmem让系统禁用 cgroup的 kmem
2:内核参数文件 /boog/grub2/grub.cfg 中添加cgroup_disable=memory 关掉整个cgroup memory
debian修改grub启动参数
vim /etc/default/grub
GRUB_CMDLINE_LINUX=“cgroup_enable=memory”
3:升级内核版本到4.x
5、优化结果
直接关掉了cgroup memory。重启系统之后集群运行正常,之后没有再出现内存泄漏



Aug. 5, 2026
异常:Fatal error loading the DB: Invalid argument. Exiting
docker启动redis:docker start redis ,查看日志:docker
logs 容器ID,出现Fatal error loading the DB: Invalid
argument. Exiting异常信息的解决办法:
1 进入redis的挂载目录下或者通过命令:find / -name
“dump.rdb” 找到dump.rdb文件;
2 删除该文件:rm -rf dump.rdb;
3重启服务:docker restart redis;
原因分析:
redis提供两种方式进行持久化,一种是RDB持久化(原理
是将Reids在内存中的数据库记录定时dump到磁盘上的RDB
持久化),另外一种是AOF(append only file)持久化(原
理是将Reids的操作日志以追加的方式写入文件)。在redis
服务重启的过程中,redis会自动加载dump.rdb文件以恢复
上一次的状态,由于rdb文件版本高于redis服务器版本,导
致rdb文件读取失败,服务无法启动,需要删除该文件。
或者直接在物理机上删除(先停掉pod)

Aug. 5, 2026
k8s 出错 /proc/sys/net/bridge/bridge-nf-call-iptables does
not exist_wx61cd54ea3a202
初始化过程中,可能会遇到“/proc/sys/net/bridge/bridge-nf-call-iptables does not exist”的错误,这是因为之前配置的
br_netfilter没有启动,运行一下命令即可
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
Aug. 5, 2026
apiserver
/etc/kubernetes/manifests/kube-apiserver.yaml
kubeadm安装的apiserver是Static Pod,它的配置文件被修改后,立即生效。
Kubelet 会监听该文件的变化,当您修改了/etc/kubenetes/manifest/kube-apiserver.yaml 文件之
后,kubelet 将自动终止原有的 kube-apiserver-{nodename} 的 Pod,并自动创建一个使用了新配置参数
的 Pod 作为替代。
如果您有多个 Kubernetes Master 节点,您需要在每一个 Master 节点上都修改该文件,并使各节点上的
参数保持一致。
kube-controller-manager
针对k8s配置文件的修改,需要重启服务
systemctl daemon-reload && systemctl restart kubelet
注意备份文件不要更改文件名之后放到同一目录下一定要放到其他目录下
不然不生效
Aug. 5, 2026
kubectl get –help
yum remove -y kubelet kubeadm kubectl
kubeadm reset -f
#查看K8S版本kubeadm version
kubectl version –client
kubelet –version
kubectl get pods –all-namespaces
//pod的详细信息
kubectl get pod -n kube-system -o wide
kubectl get sc -n kuboard
kubectl logs -n kube-system kube-proxy-77rxc
openssl x509 -noout -text -in apiserver.crt
kubectl -n kube-system get cm kubeadm-config -o yaml
#drain 驱逐节点
首先,驱逐node上的pod,其他节点重新创建
接着,将节点调为** SchedulingDisabled**
–force
当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时
候
就需要用–force来强制执行 (例如:kube-proxy)
–ignore-daemonsets
无视DaemonSet管理下的Pod
–delete-local-data
如果有mount local volumn的pod,会强制杀掉该pod并把料清除掉
另外如果跟本身的配置讯息有冲突时,drain就不会执行
kubectl drain k8s-node02 –delete-local-data –force –ignore-daemonsets –force
kubectl delete k8s-node02
cordon 停止调度
影响最小,只会将node调为SchedulingDisabled
Aug. 5, 2026
在当前唯一的master节点上运行如下命令
第一步生成新的token
kubeadm token create –print-join-command
kubeadm join 192.168.2.134:6443 –token h94icd.pqh5x0enly2xnp04 –discovery-token-ca-
cert-hash sha256:496e2fb4712c00b4c0d8d0673a2eca01b8c4bc5968e92ada12b8a0c6e559d7b4
第二步生成新的证书
kubeadm init phase upload-certs –upload-certs
I0912 14:22:43.939926 82798 version.go:255] remote version is much newer: v1.28.1;
falling back to: stable-1.23
[upload-certs] Storing the certificates in Secret “kubeadm-certs” in the “kube-system”
Namespace
[upload-certs] Using certificate key:
ea197e710ccd3515545e2d402f6257469a88481fc50f360b5362e818fae30b4b
生成新证书
1.16版本前参数为–experimental-upload-certs,1.16及1.16版本以后为–upload-certs
命令不对就会出现unknown flag –experimental-upload-certs的错误
第三步将以上得到的token和key进行拼接,添加新master节点
kubeadm join 192.168.2.134:6443 –token h94icd.pqh5x0enly2xnp04 –discovery-token-ca-
cert-hash sha256:496e2fb4712c00b4c0d8d0673a2eca01b8c4bc5968e92ada12b8a0c6e559d7b4 –
control-plane –certificate-key
ea197e710ccd3515545e2d402f6257469a88481fc50f360b5362e818fae30b4b
同样,1.16版本前参数为
–experimental-control-plane –certificate-key ,
1.16及1.16版本以后为
–control-plane –certificate-key
遇到问题:
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster…
[preflight] FYI: You can look at this config file with ‘kubectl -n kube-system get cm
kubeadm-config -oyaml’
error execution phase preflight:
One or more conditions for hosting a new control plane instance is not satisfied.
unable to add a new control plane instance a cluster that doesn’t have a stable
controlPlaneEndpoint address
Please ensure that:
Aug. 5, 2026
在k8s中部署pod时,很多时候我们使用的镜像不是我们自己制作的,自己制
作的可以把时区设置好,但使用别人的镜像时,这些镜像的时区有可能是
UTC,比我们的时间少了8小时,看一些日志时很别扭,比较方便的办法是
在部署时设置env环境变量,加上
env:
- name: TZ
value: Asia/Shanghai
如果是helm的包,特别的bitnami的包,通常都env的扩展参数,但这个参数
一般在README中都是[],那想在helm install –set方式如何设置呢?在网上
搜索了几个小时,终于stackoverflow上找到一种可用的方式,这里我以安装
postgresql的设置为例:
–set postgresql.extraEnvVars[0].name=TZ,postgres
ql.extraEnvVars[0].value=Asia/Shanghai
如果你也遇到这种情况,不防试试,也许可以解决

Aug. 5, 2026
对于Pod的健康状态检测,kubernetes提供了两类探针(Probe)来执行对Pod的健康状态检
测:
liveness probe(存活探针)
用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器
不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启,如果一个容器不包含
LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。
readiness probe(就绪探针)
用于判断容器是否启动完成,即容器的Ready是否为True,可以接收请求,如果
ReadinessProbe探测失败,则容器的Ready将为False,控制器将此Pod的Endpoint从对
应的service的Endpoint列表中移除,从此不再将任何请求调度此Pod上,直到下次探测成
功。
StartupProbe(这个 1.16 版本增加的): StartupProbe 探针,主要解决在复杂的程序中
ReadinessProbe、LivenessProbe 探针无法更好的判断程序是否启动、是否存活。进而
引入 StartupProbe 探针为 ReadinessProbe、LivenessProbe 探针服务。
每类探针都支持三种探测方法
exec:通过执行命令来检查服务是否正常,针对复杂检测或无HTTP接口的服务,命令返
回值为0则表示容器健康。
httpGet:通过发送http请求检查服务是否正常,返回200-399状态码则表明容器健康。
tcpSocket:通过容器的IP和Port执行TCP检查,如果能够建立TCP连接,则表明容器健
康。
每种方式都可以定义在readiness 或者liveness 中。比如定义readiness 中http get 就是意思
说如果我定义的这个path的http get 请求返回200-400以外的http code 就把我从所有有我的服
务里面删了吧,如果定义在liveness里面就是把我kill 了。
注意,liveness不会重启pod,pod是否会重启由你的restart policy 控制。
探针探测的结果有以下三者之一
Success:Container通过了检查。
Failure:Container未通过检查。
Unknown:未能执行检查,因此不采取任何措施。
重启策略
Always: 总是重启
OnFailure: 如果失败就重启
Never: 永远不重启
配置探针(Probe)相关属性
探针(Probe)有许多可选字段,可以用来更加精确的控制Liveness和Readiness两种探针的行
为(Probe):
initialDelaySeconds:Pod启动后延迟多久才进行检查,单位:秒。
periodSeconds:检查的间隔时间,默认为10,单位:秒。
timeoutSeconds:探测的超时时间,默认为1,单位:秒。
successThreshold:探测失败后认为成功的最小连接成功次数,默认为1,在Liveness探
针中必须为1,最小值为1。
failureThreshold:探测失败的重试次数,重试一定次数后将认为失败,在readiness探针
中,Pod会被标记为未就绪,默认为3,最小值为1。
Aug. 5, 2026
背景
kubectl命令就无法访问集群了——错误大概为:“certificate has expired or is not yet valid”。
原因是k8s证书过期了
k8s版本1.23.4
以下操作均在master节点操作
查看证书过期时间
kubeadm certs check-expiration
gemfield@master:~$ sudo kubeadm certs check-expiration
[sudo] password for gemfield:
[check-expiration] Reading configuration from the cluster…
[check-expiration] FYI: You can look at this config file with ‘kubectl -n kube-system
get cm kubeadm-config -oyaml’
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE
AUTHORITY EXTERNALLY MANAGED
admin.conf Jun 21, 2022 03:16 UTC 364d
no
apiserver Jun 21, 2022 03:16 UTC 364d ca
no
apiserver-etcd-client Jun 21, 2022 03:16 UTC 364d etcd-ca
no
apiserver-kubelet-client Jun 21, 2022 03:16 UTC 364d ca
no
controller-manager.conf Jun 21, 2022 03:16 UTC 364d
no
etcd-healthcheck-client Jun 21, 2022 03:16 UTC 364d etcd-ca
no
etcd-peer Jun 21, 2022 03:16 UTC 364d etcd-ca
no
etcd-server Jun 21, 2022 03:16 UTC 364d etcd-ca
no
front-proxy-client Jun 21, 2022 03:16 UTC 364d front-proxy-ca
no
scheduler.conf Jun 21, 2022 03:16 UTC 364d
no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca May 04, 2030 12:14 UTC 8y no
etcd-ca May 04, 2030 12:14 UTC 8y no
front-proxy-ca May 04, 2030 12:14 UTC 8y no
Aug. 5, 2026
1、先删除pod2、再删除对应的deployment否则只是删除pod是不管用的,还会看到pod,因为
deployment.yaml文件中定义了副本数量
实例如下:
删除pod
[root@test2 ~]# kubectl get pod -n jenkins
NAMEREADYSTATUSRESTARTSAGE
jenkins2-8698b5449c-grbdm 1/1 Running 0 8s
[root@test2 ~]# kubectl delete pod jenkins2-8698b5449c-grbdm -n jenkins
pod “jenkins2-8698b5449c-grbdm” deleted
查看pod仍然存储
[root@test2 ~]# kubectl get pod -n jenkins
NAMEREADYSTATUSRESTARTSAGE
jenkins2-8698b5449c-dbqqb 1/1 Running 0 8s
[root@test2 ~]#
删除deployment
[root@test2 ~]# kubectl get deployment -n jenkins
NAMEDESIREDCURRENTUP-TO-DATEAVAILABLEAGE
jenkins2 1 1 1 1 17h
[root@test2 ~]# kubectl delete deployment jenkins2 -n jenkins
再次查看pod消失
deployment.extensions “jenkins2” deleted
[root@test2 ~]# kubectl get deployment -n jenkins
No resources found.
[root@test2 ~]#
[root@test2 ~]# kubectl get pod -n jenkins
No resources found.
Aug. 5, 2026
k8s主结点加入集群报错 failure loading certificate for CA:
couldn‘t load the certificate file
当k8s做集群高可用的时候,需要将另一个master加入到当前master,此时如果报错
failure loading certificate for CA: couldn’t load the certificate file /etc/kubernetes/pki/ca.crt: open
/etc/kubernetes/pki/ca.crt: no such file or directory
scp -rp /etc/kubernetes/pki/ca.* master125:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/sa.* master125:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/front-proxy-ca.* master125:/etc/kubernetes/pki
scp -rp /etc/kubernetes/pki/etcd/ca.* master125:/etc/kubernetes/pki/etcd
scp -rp /etc/kubernetes/admin.conf master125:/etc/kubernetes

Aug. 5, 2026
使用 swr.cn-east-2.myhuaweicloud.com/kuboard/etcd-host:3.4.16-2 版本的etcd 数据库
由于没有设置,容量参数,导致数据大于2G就无法启动。
报错截图:
etcdserver/api/etcdhttp: /health error due to memberID: alarm:NOSPACE
解决参数:
–quota-backend-bytes=8589934592#调大到8GB
需要官方在制作镜像进行添加参数
临时办法
1、修改 kube-etcd 监控检测,时间调大点,防止重启
kubectl edit daemonsets.apps -n kuboard kuboard-etcd
2、执行下方命令 (不建议使用 127.0.0.1 使用 master 的网卡IP地址)
ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” –write-out=table
endpoint status
ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” compact $(ETCDCTL_API=3
etcdctl –endpoints=“http://202.204.192.152:2381” endpoint status –write-out=“json” |
egrep -o ‘“revision”:[0-9]’ | egrep -o ‘[0-9].’)
ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” defrag
ETCDCTL_API=3 etcdctl –endpoints=“http://202.204.192.152:2381” alarm disarm
恢复正常



Aug. 5, 2026
在kubernetes集群中,etcd存储了集群的元数据信息,为防止信息的丢失及还原数据,我们需要对etcd数据进行备份。
本文使用的kubernetes集群采用kubeadm部署的
一、单master的etcd的数据备份与还原
1.从容器中把etcdctl工具复制出来到主机中的/usr/local/bin目录下
docker cp $(docker ps | grep -v etcd-mirror | grep -w etcd | awk ‘{print
$1}’):/usr/local/bin/etcdctl /usr/local/bin/
2.备份etcd数据
etcdctl –endpoints 127.0.0.1:2379
–cert="/etc/kubernetes/pki/etcd/server.crt"
–key="/etc/kubernetes/pki/etcd/server.key"
–cacert="/etc/kubernetes/pki/etcd/ca.crt"
snapshot save etcd_snap_save.db
3.还原etcd数据
####移除配置和删除数据
mv /etc/kubernetes/manifests/etcd.yaml /opt/
rm -rf /var/lib/etcd/
####通过命令恢复
etcdctl snapshot restore etcd_snap_save.db
–cacert=/etc/kubernetes/pki/etcd/ca.crt
–cert=/etc/kubernetes/pki/etcd/server.crt
–key=/etc/kubernetes/pki/etcd/server.key
–data-dir=/var/lib/etcd/
–endpoints=https://127.0.0.1:2379
####配置还原
mv /opt/etcd.yaml /etc/kubernetes/manifests/
二、多master的etcd的数据备份与还原
1.从容器中把etcdctl工具复制出来到主机中的/usr/local/bin目录下
docker cp $(docker ps | grep -v etcd-mirror | grep -w etcd | awk ‘{print
$1}’):/usr/local/bin/etcdctl /usr/local/bin/
2.备份etcd数据
etcdctl –endpoints 127.0.0.1:2379
–cert="/etc/kubernetes/pki/etcd/server.crt"
–key="/etc/kubernetes/pki/etcd/server.key"
–cacert="/etc/kubernetes/pki/etcd/ca.crt"
snapshot save etcd_snap_save.db
3.还原etcd数据
三台master上都需要操作
k8s-master-1
####移除配置和删除数据
mv /etc/kubernetes/manifests/etcd.yaml /opt/
rm -rf /var/lib/etcd/
####通过命令恢复
ETCDCTL_API=3 etcdctl snapshot restore snap-save.db
–cacert=/etc/kubernetes/pki/etcd/ca.crt
–cert=/etc/kubernetes/pki/etcd/server.crt \
Aug. 5, 2026
kubernetes初始化报错Get “http://localhost:10248/healthz”: dial tcp 127.0.0.1:
10248: connect: connection refused.的解决办法
k8s使用kubeadm初始化报如下错误:
[kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz’ failed
with error: Get “http://localhost:10248/healthz”: dial tcp 127.0.0.1:10248: connect:
connection refused.
原因:
docker的cgroup驱动程序默认设置为system。默认情况下Kubernetes cgroup为systemd,我们需要更改Docker cgroup
驱动,
解决办法:
kubeadm reset
vim /etc/docker/daemon.json
{
“registry-mirrors”: [
“https://a8qh6yqv.mirror.aliyuncs.com”,
“http://hub-mirror.c.163.com”
],
“exec-opts”: [“native.cgroupdriver=systemd”],
“insecure-registries”:[“218.29.223.194:31003”,“192.168.100.71:31003”]
}
[root@master01 ~]#
cat /var/lib/kubelet/config.yaml | grep cgroup
docker info | grep -i cgroup
systemctl daemon-reload
systemctl restart docker
重新初始化即可成功。
Aug. 5, 2026
对于openstack 平台, 需要修改mtu 以及指定网卡
1、calico如果有节点是多网卡,所以需要在配置文件中指定内网网卡
- name: calico-node
image: 172.16.230.97/source/node:v3.18.2
envFrom:
- configMapRef:
Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be
overridden for eBPF mode.
name: kubernetes-services-endpoint
optional: true
env:
Use Kubernetes API as the backing datastore.
- name: DATASTORE_TYPE
value: “kubernetes”
DaemonSet 添加环境变量
- name: IP_AUTODETECTION_METHOD
value: “interface=ens192”
Wait for the datastore.
- name: WAIT_FOR_DATASTORE
value: “true”
Set based on the k8s node name.
# 匹配 bond 网卡
- name: IP_AUTODETECTION_METHOD
value: interface=eth.|en.|em.|bo.
Aug. 5, 2026
启动的 kuboard-etcd 正常 kuboard-v3一直无法启动
[root@k8s-1-31 ~]# kubectl get pod -n kuboard
NAME READY STATUS RESTARTS AGE
kuboard-etcd-49mjf 1/1 Running 0 25m
kuboard-etcd-f7g4m 1/1 Running 0 26m
kuboard-etcd-jk45w 1/1 Running 0 26m
kuboard-v3-76996c957f-zd8g5 0/1 CrashLoopBackOff 9 (105s ago) 23m
查看 kuboard-v3-76996c957f-zd8g5 日志如下:
time=“2022-11-02T16:05:38Z” level=info msg=“config using log level: info”
time=“2022-11-02T16:05:38Z” level=info msg=“config issuer: http://192.168.1.35:30080/sso”
time=“2022-11-02T16:05:38Z” level=info msg=“config storage: etcd”
time=“2022-11-02T16:05:38Z” level=info msg=“config static client: KuboardApp”
time=“2022-11-02T16:05:38Z” level=info msg=“config connector: default”
time=“2022-11-02T16:05:38Z” level=info msg=“config skipping approval screen”
time=“2022-11-02T16:05:38Z” level=info msg=“config signing keys expire after: 6h0m0s”
time=“2022-11-02T16:05:38Z” level=info msg=“config id tokens valid for: 168h0m0s”
time=“2022-11-02T16:05:38Z” level=info msg=“config device requests valid for: 5m0s”
设置日志级别为 info
[LOG] 2022/11/03 - 00:05:41.650 | /common/etcd.client_config 24 | info |
KUBOARD_ETCD_ENDPOINTS=[]
[LOG] 2022/11/03 - 00:05:41.650 | /common/etcd.client_config 52 | info | {[] 0s 1s 0s 0s
0 0 false [] false}
[LOG] 2022/11/03 - 00:05:41.651 | /initializekuboard.InitializeEtcd 39 | info | 初始化
./init-etcd-scripts/audit-policy-once.yaml
{“level”:“warn”,“ts”:“2022-11-
03T00:05:43.619+0800”,“caller”:“clientv3/retry_interceptor.go:61”,“msg”:“retrying of
unary invoker failed”,“target”:“endpoint://client-f777d7ed-593f-4336-b868-
86a448cc4919/”,“attempt”:0,“error”:“rpc error: code = DeadlineExceeded desc = latest
balancer error: all SubConns are in TransientFailure, latest connection error:
connection error: desc = “transport: Error while dialing dial tcp: missing address””}
failed to initialize server: server: failed to list connector objects from storage:
context deadline exceeded
编辑配置文件
Aug. 5, 2026
kubectl create secret generic mysql-root-password –from-literal=password=gilight123!@#
-n dev
mysql-svc.yaml
zk.yaml
gitlab-runner-master1.zip
helm install -name gitlab-menhu gitlab-runner-0.1.37.tgz -n gitlab-menhu
helm package .
带配置文件的mysql,但需要创建pv等
mysql-config.yaml
Aug. 5, 2026
查看日志报错:
cannot create directory ‘/bitnami/mysql/data’: Permission denied
解决:
sudo chown -R 1001:1001 /data/nfs/mysql8
Aug. 5, 2026
1、postgresql容器未启动: chmod:更改‘/bitnami/postgresql/data’的权
限:不允许操
由于Bitnami PostgreSQL容器是非根容器,因此id为1001的用户需要在您挂
载的本地文件夹中拥有写权限。
sudo chown -R1001:1001/postgresql
2、FATAL: the database system is starting up
查看文件夹权限
所在文件夹的父文件夹是777权限
数据所在的文件夹 data是700权限


Aug. 5, 2026
zookeeper-11.1.3.tgz
helm search bitnami/zookeeper zookeeper
helm search repo zookeeper
helm pull bitnami/zookeeper
tar -xvf zookeeper-11.1.3.tgz
cd zookeeper/
vim values.yaml
helm package .
helm install zookeeper zookeeper-11.1.3.tgz -n basic-components
helm uninstall zookeeper -n basic-components
Aug. 5, 2026
创建自定义ingress报错:Internal error occurred: failed calling webhook
“validate.nginx.ingress.kubernetes.io
原因分析:
我刚开始使用yaml的方式创建nginx-ingress,之后删除了它创建的命名空间以及 clusterrole and
clusterrolebinding ,但是没有删除ValidatingWebhookConfiguration ingress-nginx-admission,
这个ingress-nginx-admission是在yaml文件中安装的。当我再次使用helm安装nginx-ingress之后,创建
自定义的ingress就会报这个错误。
解决方案:
最后参考下面的文章解决此问题
使用下面的命令查看 webhook
kubectl get validatingwebhookconfigurations
ingress-nginx-admission
删除ingress-nginx-admission
kubectl delete-A ValidatingWebhookConfiguration ingress-nginx-admission
————————————————
版权声明:本文为CSDN博主「惜鸟」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本
声明。
原文链接:https://blog.csdn.net/qq_39218530/article/details/115372879
Aug. 5, 2026
helm-v3.8.2-linux-amd64.tar.gz
以上是新版的helm的安装包,这个安装包只需要解压并移动到用户路径($PATH)即可,无需再做其他的操作。
安装好后可以直接添加仓库
#helm仓库地址
https://artifacthub.io/
#添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://charts.helm.sh/stable
helm仓库列表
helm repo list
更新helm仓库
helm repo update
#在仓库中查找redis
helm search repo redis
#在仓库中下载redis
helm fetch stable/redis-ha
#查看已经安装的chart
helm ls –all-namespaces
#删除指定命名空间的chart
helm uninstall redis-ha –namespace=basic-components
helm uninstall redis -n basic-components
#将本地的chart打包
helm package .
#将打包好的chart安装到k8s
helm install redis redis-17.8.0.tgz -n basic-components
#这个也是安装只是不需要打包但是需要下载
helm install redis-ha -f my_values.yaml –namespace=basic-components stable/redis-ha
//查看
helm repo list
// 设置新的镜像地址
helm repo add stable https://charts.helm.sh/stable
helm repo add aliyuncs https://apphub.aliyuncs.com
helm repo add aliyun https://apphub.aliyuncs.com/
helm repo add bitnami https://charts.bitnami.com/bitnami
Aug. 5, 2026
一、helm语法
helm repo add harbor https://helm.goharbor.io #添加源
helm search hub #查看可用源
helm show chart stable/redis #打印出指定的Charts的详细信息
helm fetch <>下载
helm search repo harbor -l 查看可下载的harbor版本
二、添加helm源,拉取harbor
#helm repo add harbor https://helm.goharbor.io
#helm fetch harbor/harbor –untar #拉取
https://artifacthub.io/ #helm chart展示页面
三、创建持久化存储storageclass
harbor.sto.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: harbor-data
namespace: cicd
provisioner: kubernetes.io/aws-ebs
parameters:
fsType: ext4
type: gp2
encrypted: “true”
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
修改values.yaml
[root@das1harbor001-new harbor]# cat harbor.yaml
expose:
type: nodePort
tls:
enabled: flase
Aug. 5, 2026
https://www.alibabacloud.com/help/zh/container-service-for-kubernetes/latest/use-gitlab-ci-t
o-run-a-gitlab-runner-and-run-a-pipeline-on-kubernetes
使用GitLab CI运行GitLab Runner并执行Pipeline
本文主要演示如何在Kubernetes集群中安装、注册GitLab Runner,添加Kubernetes类型的
Executor来执行构建,并以此为基础完成一个Java源码示例项目从编译构建、镜像打包到应
用部署的CICD过程。
背景信息
本文以构建一个Java软件项目并将其部署到阿里云容器服务Kubernetes集群中为例,说明如
何使用GitLab CI在阿里云Kubernetes服务上运行GitLab Runner、配置Kubernetes类型的
Executor,并执行Pipeline。
创建GitLab源码项目并上传示例代码
1.创建GitLab源码项目。
2.本示例中创建的GitLab源码项目地址为:http://xx.xx.xx.xx/demo/gitlab-
java-demo.git
3.执行以下命令获取示例代码并上传至GitLab。
4.git clone https://github.com/haoshuwei/gitlab-ci-k8s-demo.git
git remote add gitlab http://xx.xx.xx.xx/demo/gitlab-java-
demo.git
git push gitlab master
在Kubernetes集群中安装GitLab Runner
1.获取GitLab Runner的注册信息。
a.获取项目专用Runner的注册信息。
ⅰ.登录gitlab
ⅲ.在Your projects页签下,选择相应的Project。
ⅳ.在左侧导航栏中,选择Settings > CI / CD
ⅴ.单击Runners右侧的Expand。
ⅵ.获取URL和registration token信息。
b.获取Group Runners的注册信息。
ⅰ.在顶部导航栏中,选择Groups > Your groups
ⅱ.在Your groups页签下,选择相应的group。
ⅲ.在左侧导航栏中,选择Settings > CI / CD
ⅳ.单击Runners右侧的Expand
ⅴ.获取URL和registration token信息。
c.获取Shared Runners的注册信息。
说明只有管理员有权限执行此步操作。
ⅰ.在顶部导航栏中,单击设置进入Admin Area页面。
ⅱ.在左侧导航栏中,选择Overview > Runners
ⅲ.获取URL和registration token信息。
2.执行以下命令获取并修改GitLab Runner的Helm Chart。
git clone https://github.com/haoshuwei/gitlab-runner.git
替换gitlabUrl和runnerRegistrationToken字段,示例如下:
Aug. 5, 2026
下面的配置文件定义了一个 name 为 nginx-demo 的 Pod,该 Pod 包含一个 name 为 nginx 的容器:
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: nginx-demo #pod名称为nginx-demo
labels: #标签,例子中的Pod包含两个标签 environment: production 和 app:nginx
environment: production
app: nginx
spec:
containers:
- name: nginx #pod内部容器的名称nginx
image: nginx:1.14.2 #容器的镜像
ports:
- containerPort: 80 #容器的端口
resources:
limits:
cpu: 200m
memory: 128Mi
requests:
cpu: 0.1
memory: 1M
nodeSelector: #Pod 的节点选择器为例,下面的 Pod 可以被调度到包含标签 accelerator=nvidia-
tesla-p100 的节点上
accelerator: nvidia-tesla-p100
kind:常用的有Namespace、Pod、Service、Deployment、Config
Aug. 5, 2026
查看注册token:
在查看注册runner的和,注册完成后就是全局的runner,也可以创建项目后单独注册
runner。
配置:
helm repo add gitlab https://charts.gitlab.io/
helm repo update
helm pull gitlab/gitlab-runner
tar xf gitlab-runner-0.21.1.tgz
vim gitlab-runner/values.yaml #更改
values.yanl
gitlabUrl: http://gitlab.lzxlinux.com/ #url
runnerRegistrationToken:
“KQj8zJc3RCI0K8wKF3ObroOPMFQT281CkKeHUUV77fro8auh7ZzQBL4PVVVne2EU” #token
concurrent: 10 #最大并发
rbac:
create: true
resources: [“pods”, “pods/exec”, “secrets”]
verbs: [“get”, “list”, “watch”, “create”, “patch”, “delete”]
metrics:
enabled: false
runners:
image: ubuntu:16.04
imagePullPolicy: “if-not-present”
locked: false
tags: “k8s-runner” #runner的标签
runUntagged: false
protected: false
privileged: false #特权模式
namespace: public-service
builds:
cpuLimit: 200m
cpuLimitOverwriteMaxAllowed: 400m
memoryLimit: 256Mi
memoryLimitOverwriteMaxAllowed: 512Mi
cpuRequests: 100m
cpuRequestsOverwriteMaxAllowed: 200m
memoryRequests: 128Mi
memoryRequestsOverwriteMaxAllowed: 256Mi
services:
cpuLimit: 200m
memoryLimit: 256Mi
cpuRequests: 100m
memoryRequests: 128Mi
helpers:
cpuLimit: 200m
memoryLimit: 256Mi
cpuRequests: 100m
memoryRequests: 128Mi
securityContext:
fsGroup: 0
runAsUser: 0
resources:
limits:
memory: 256Mi
cpu: 200m
requests:
memory: 128Mi
cpu: 100m
hostAliases:
Aug. 5, 2026
获取gitlab的·地址及注册token
runner类型:
共享Runner(Shared Runner),所有项目可以使用
群组Runner(Group Runner),特定群组里的所有项目和子群组可以使用
特定Runner(Specific Runner),用于独立的项目。
在全局配置中获取的token就是全局runner
在群组中获取的toke就是群组runner
项目中的token就是特定runner
helm安装gitlab-runner
配置helm并下载chart
#添加仓库
helm repo add gitlab https://charts.gitlab.io/
#更新仓库
helm repo update
#下载chart
helm pull gitlab/gitlab-runner
根据环境修改配置
编辑values.yaml,已修改好的配置文件
values.yaml
相关参数如下:
#gitlab地址
gitlabUrl: http://218.29.223.194:43223/gitlab/
#gitlab的token
runnerRegistrationToken: “H8u_rwN5NkRmxkt9Gv7S”
#用于向GitLab服务器添加新Runner的注册令牌
unregisterRunners: true
#最大并发
concurrent: 10
#rabc权限部分配置
rbac:
create: true
rules:
- resources: [“configmaps”, “pods”, “pods/attach”, “secrets”, “services”]
verbs: [“get”, “list”, “watch”, “create”, “patch”, “update”, “delete”]
- apiGroups: [""]
resources: [“pods/exec”]
verbs: [“create”, “patch”, “delete”]
runners:
#配置文件
config: |
[[runners]]
[runners.kubernetes]
namespace = “{{.Release.Namespace}}”
image = “ubuntu:16.04”
#挂在外部的nfs作为缓存,挂载到 /opt/cache 结合volumeMounts 使用可以写多个 maven缓存使
用
[[runners.kubernetes.volumes.pvc]]
name = “gitlab-runner-cache-pvc”
mount_path = “/opt/cache”
#挂在外部的nfs作为缓存,挂载到 /opt/cache 结合volumeMounts 使用 gradle缓存使用
[[runners.kubernetes.volumes.pvc]]
name = “gitlab-runner-cache”
mount_path = “/home/gradle”
#关于内部调用docker的配置
[[runners.kubernetes.volumes.host_path]]
name = “docker”
mount_path = “/var/run/docker.sock”
read_only = true
host_path = “/var/run/docker.sock”
#runner的tag
tags: “k8s-runner-sy”
#runner的name
name: “k8s-runner-sy”
#runner的namespace
namespace: basic-components
#gitlab的仓库clone的地址,gitlab内外网地址不一样的时候使用
cloneUrl: http://218.29.223.194:43223/gitlab/
#runner内部域名映射,修改内部的hosts
hostAliases:
Aug. 5, 2026
Nginx Ingress 注解使用在 Ingress 资源实例中,用以设置当前 Ingress 资源实例中 Nginx 虚拟主机的相关
配置,对应配置的是 Nginx 当前虚拟主机的 server 指令域内容。在与 Nginx Ingress 配置映射具有相同功能配
置时,将按照所在指令域层级遵循 Nginx 配置规则覆盖。
Nginx Ingress注解按照配置功能有如下分类。
1、Nginx原生配置指令
支持在注解中添加 Nginx 原生配置指令。配置说明如下表所示。
注解类型功能描述
nginx.ingress.kubernetes.io/serv在 server 指令域添加 Nginx 配置
string
er-snippet
nginx.ingress.kubernetes.io/conf在 location 指令域添加 Nginx 配
string
iguration-snippet
配置样例如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-nginxbar-org
annotations:
nginx.ingress.kubernetes.io/server-snippet: |
location / {
return 302 /coffee;
}
spec:
rules:
- host: web.nginxbar.org
http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
2、通用配置
Nginx 虚拟主机中的通用配置。通用配置说明如下表所示。
注解类型功能描述
nginx.ingress.kubernetes.io/ena对当前虚拟主机设置是否启用访
true 或 false
ble-access-log
nginx.ingress.kubernetes.io/serv为 Nginx 添加更多的主机名,同
string
Nginx 配置指令 server name
nginx.ingress.kubernetes.io/app-将当前虚拟主机根目录的访问
string
302 跳转到当前指定的路径
nginx.ingress.kubernetes.io/clie
string
client_body_buffer_size
是否对当前虚拟主机的 Nginx 指
nginx.ingress.kubernetes.io/use-
true 或 false令 location 使用正则方式进行路
regex
径匹配,默认值为 false
nginx.ingress.kubernetes.io/cust根据响应码状态定义为错误状态
[]int
om-http-errors
自定义默认后端的资源对象
nginx.ingress.kubernetes.io/defaService 名称,当客户端的请求
string
没有匹配的 Nginx 规则或响应错
误时,将被转发到默认后端
nginx.ingress.kubernetes.io/whit
CIDR
whitelist-source-range
nginx.ingress.kubernetes.io/per
设置永久重定向的目标地址
manent-redirect
nginx.ingress.kubernetes.io/per自定义永久重定向的响应码,默
number
manent-redirect-code
nginx.ingress.kubernetes.io/tem
设置临时重定向的目标地址
poral-redirect
设置是否将当前虚拟主机子域名
nginx.ingress.kubernetes.io/from
true 或 false为 www 的请求跳转到当前主机
-to-www-redirect
域名
nginx.ingress.kubernetes.io/rewr
同 Nginx 配置指令 rewrite
ite-target
nginx.ingress.kubernetes.io/ena同 Nginx 配置指令 rewrite log,
true 或 false
ble-rewrite-log
nginx.ingress.kubernetes.io/mirr
同 Nginx 配置指令 mirro
or-uri
同 Nginx 配置指令
nginx.ingress.kubernetes.io/mirr
mirror_request_body,默认为
or-request-body
true
配置样例如下:
Aug. 5, 2026
基于gitlab runner 的did(docker in docker ) ci/cd k8s方案
首先,jenkins很强大,尤其是各种插件的支持,但实际个人工作中,用到的并不多,早期大型项目布署负载各种脚本和
远程调用,目前所有项目和k8s深耦合,已经拆解为各种云服务,jenkins的大部分功能用不到
其次,这只是一种可行的方案,并不是最优的方案,不同阶段也都有再调整和优化的空间
最后,对个人的需求,jenkins过于复杂,gitlab-runner足可胜任,对研发人员更透明友好,学习应用成本更低。
CI/CD集成k8s服务,对各种文件抽像的只有三步(部分语言生态只需要一步)
1 编译环境加载依赖编译可执行文件
2 执行环境+可执行文件打包为docker image并上传至docker hub
3 执行k8s布署,启动服务
k8s布署k8s gitlab-runner 服务
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: gitlab-runner-java
namespace: common
spec:
replicas:1
revisionHistoryLimit:10
selector:
matchLabels:
app: gitlab-runner-java
serviceName: gitlab-runner-java
template:
metadata:
creationTimestamp:null
labels:
app: gitlab-runner-java
name: gitlab-runner-java
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
matchExpressions:
key: kubernetes.io/hostname
operator: In
values:
server-svc-2
containers:
image: gitlab/gitlab-runner:v12.4.1
imagePullPolicy: IfNotPresent
name: gitlab-runner-java
resources:
limits:
cpu:“4”
memory: 4Gi
requests:
cpu:“2”
memory: 1Gi
securityContext:
runAsUser:0
volumeMounts:
Aug. 5, 2026
关联(K8S集群节点(node)NotReady问题处理)
K8S集群 NOT READY的解决办法 1.20 错误信息:cni config
uninitialized
错误现象:
untime not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker:
network plugin is not ready: cni config uninitialized
解决方法一:
vim /var/lib/kubelet/kubeadm-flags.env
删除其中的 –network-plugin=cni
重启kubelet
注意:这种方式可能导致节点使用docker的网络
解决方法二:
将master上/etc/cni/net.d 目录下的文件拷贝到有问题的节点上:
scp server4:/etc/cni/net.d/* /etc/cni/net.d/
Aug. 5, 2026
K8S集群 NOT READY的解决办法 1.20 错误信息cni conf
ig uninitialized
问题场景:
K8S master节点安装完kube-flannel之后(加粗是重点) 执行kubectl get nodes命令看到master
状态依旧是NotReady
K8S node节点kubeadm join命令后,已成功添加到集群,但是执行kubectl get nodes命令看
到node状态依旧是NotReady
图片展示的是node节点的NotReady状态,master节点最开始也是这个状态,我已经解决过
了,无论master节点还是node节点,都可以试下这个方法
核对问题症状:
执行journalctl -f -u kubelet命令
报错:NetworkReady=false reason:NetworkPluginNotReady message:docker: network
plugin is not ready: cni config uninitialized
或者报错:Unable to update cni config: no valid networks found in /etc/cni/net.d
执行ls /opt/cni/bin/命令,看是否有flannel这个文件,如果没有,就是有问题的
解决办法:
手工复制flannel到/opt/cni/bin/文件夹,并添加执行权限
下载文件cni-plugins-linux-amd64-v0.8.6.tgz,并提取flannel文件
把提取到的flannel复制或上传到/opt/cni/bin/
执行chmod +x /opt/cni/bin/flannel 命令添加权限
返回master节点,执行kubectl get nodes命令查看状态,问题解决
当然出现问题的原因可能有很多种,这个方案不能百分百解决






Aug. 5, 2026
一、无权限
ERROR: Job failed (system failure): prepare environment: setting up credentials: secrets
is forbidden: User “system:serviceaccount:default:default” cannot create resource
“secrets” in API group ""
in the namespace “default”. Check https://docs.gitlab.com/runner/shells/index.html#shell-
profile-loading for more information
原因是这个pod没有create等权限,需要添加权限
kubectl create clusterrolebinding default:default–clusterrole=cluster-admin –
group=system:serviceaccounts –namespace=default
二、无法访问
fatal: unable to access ‘http://gitlab.dym.com/douxiaoliang/netty-study.git/' : Failed to
connect to gitlab.dym.com port 80 after 130543 ms: Operation timed out
28ERROR: Job failed: command terminated with exit code 1
runner的pod里面通过hostAliases也配置了 hosts域名映射,但是依然报错,没有找到原因,直接将gitlab的地址改为ip
访问
Aug. 5, 2026
首先找到你需要进入对应namespace的pod名
kubectl get pod
找到pod所在的节点以及容器id
kubectl describe pod “pod名”
在所给信息中找到以下字段:
Node:所查pod所在的节点
Container ID:所查pod的容器id,形如docker://…,注意Container ID不包括docker://
ssh到pod对应节点
以root用户权限进入pod
docker exec -it -u root ‘Container ID’ /bin/bash
Aug. 5, 2026
- 简介
安全上下文(Security Context)定义 Pod 或 Container 的特权与访问控制设置。安全上下文
包括但不限于:
自主访问控制(Discretionary Access Control):基于用户 ID(UID)和组 ID(GID).来判
定对对象(例如文件)的访问权限
安全性增强的 Linux(SELinux):为对象赋予安全性标签。
以特权模式或者非特权模式运行。
Linux 权能: 为进程赋予 root 用户的部分特权而非全部特权。
AppArmor:使用程序文件来限制单个程序的权限。
Seccomp:限制一个进程访问文件描述符的权限。
AllowPrivilegeEscalation:控制进程是否可以获得超出其父进程的特权。此布尔值直接控制
是否为容器进程设置no_new_privs 标志。当容器以特权模式运行或者具有
CAP_SYS_ADMIN权能时,AllowPrivilegeEscalation 总是为 true。
readOnlyRootFilesystem:以只读方式加载容器的根文件系统。
2.1 配置pod的安全上下文
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: busybox
command: [ “sh”, “-c”, “sleep 1h” ]
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
在配置文件中,该runAsUser字段指定对于Pod中的任何容器,所有进程都以用户ID 1000运行。
该runAsGroup字段为Pod中的任何容器中的所有进程指定主组ID3000。如果省略此字段,则容器的主要组ID将为root
(0)。runAsGroup指定时,用户1000和组3000也将拥有所有创建的文件。
由于fsGroup指定了字段,因此容器的所有进程也是补充组ID2000的一部分。卷的所有者/data/demo和在该卷中创建的
任何文件都将是组ID 2000。
说明:‘privileged’(特权模式) ‘不等于’ root–>比如:root用户无法’关闭容器网卡’
Aug. 5, 2026
配置/etc/docker/daemon.json后不生效
在node的/etc/docker/daemon.json中配置了私有镜像仓库地址后已经无法连接此镜像仓库。
背景:已经重启了daemon-reload、docker,但依旧不生效。
报错内容:
daemon.json的配置格式:
解决方案:重启daemon-reload与docker时需要先stop再start,有的
docker版本直接restart是不会生效的。


Aug. 5, 2026
一、描述
天翼云上的麒麟服务器默认没有安装docker,需要手动安装。
二、安装准备
查看系统版本,确认版本
cat /etc/kylin-release
Kylin Linux Advanced Server release V10 (Tercel)
查看系统架构
uname -p
x86_64
服务器如果是鲲鹏,架构是aarch64
uname -p
aarch64
注意:该系统是aarch64架构,dockerhub上的大部分镜像都是x86_64架构下的,在使用dockerhub等平台的
镜像时,一定要注意其架构是否支持aarch64!
内核版本
uname -r
4.19.90-23.8.v2101.ky10.aarch64
iptables版本
iptables –version
iptables v1.8.1 (legacy)
三、下载安装docker-ce
删除老版本docker
sudo yum remove docker docker-engine docker.io containerd runc
下载安装docker
官网下载地址:https://download.docker.com/linux/static/stable/aarch64/
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.7.tgz
解压
tar -zxvf docker-20.10.7.tgz
移动解压出来的二进制文件到 /usr/bin 目录中
mv docker/* /usr/bin/
配置添加 systemd
编辑docker的系统服务文件
vi /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
Aug. 5, 2026
#下载指定版本的docker
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.14.tgz
#停止docker
systemctl stop docker
#解压软件包
tar -xvf docker-20.10.14.tgz
#覆盖更新老版本文件
mv docker/* /usr/bin/
#启动docker
systemctl start docker
#查看docker版本
docker –version
Aug. 5, 2026
如果容器无法启动或者启动失败
可以只创建容器(不运行)
docker create –name suspect-container suspect-image:latest
导出容器的文件系统
docker export suspect-container > suspect-container.tar
如果您不需要保存或打开存档,而是更喜欢在终端中获取文件列表,请修改tar命令:
docker export suspect-container | tar t > suspect-container-files.txt
tar t列出输入档案的内容。您最终会得到一个包含图像中所有内容的列表
suspect-container-files.txt。
Aug. 5, 2026
docker save -o nginx.tar nginx:alpine
-o docker高版本不需要,低版本需要此命令
nginx.tar 保存到本地的文件名与文件格式
nginx:alpine 需要save的镜像
docker load < taomcat.tar
docker镜像的批量导出
docker save $(docker images –format ‘{{.Repository}}:{{.Tag}}’|grep -v “192.168”|grep -
v none)-o all.tar
docker save $(docker images |grep -v REPOSITORY|grep -v 192.168|grep -v none |awk
‘{print $1":"$2}’)-o allimages.tar
批量导入
docker load -i allinone.tar
Aug. 5, 2026
docker无法启动,报错grpc: addrConn.createTransport
failed to connect to {unix:///run/containerd/containerd.
docker无法启动,报错。k8s的pod镜像加载失败。
解法方法:
删除/var/lib/docker/和/var/lib/containerd/ 这两个文件夹,重起docker服务。
问题完美解决,结果如下:


Aug. 5, 2026
有时候,我们创建容器时忘了添加参数 –restart=always ,当 Docker 重启时,容器未能自动启动,
现在要添加该参数怎么办呢,方法有二:
1、Docker 命令修改
docker container update –restart=always 容器名字
docker update –restart always mysql
2、直接改配置文件
首先停止容器,不然无法修改配置文件
配置文件路径为:/var/lib/docker/containers/容器ID
在该目录下找到一个文件 hostconfig.json ,找到该文件中关键字 RestartPolicy
修改前配置:“RestartPolicy”:{“Name”:“no”,“MaximumRetryCount”:0}
修改后配置:“RestartPolicy”:{“Name”:“always”,“MaximumRetryCount”:0}
最后启动容器。
Aug. 5, 2026
failed to start daemon: failed to dial
“/run/containerd/containerd.sock”: unknown service
contain…
在搭建k8s集群时,有两台主机中途重启过,然后出现docker无法启动的问题,通过journalctl -u docker.service发报如下错
误:
Nov0814:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service:Main process exited,
code=exited, status=1/FAILURE
Nov0814:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service:Failedwith result
’exit-code’.
Nov0814:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]:Failed to start DockerApplication
ContainerEngine.
Nov0814:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service:Service
RestartSec=2s expired, scheduling restart.
Nov0814:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service:Scheduled restart
job, restart counter is at 2.
Nov0814:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]:StoppedDockerApplicationContainer
Engine.
Nov0814:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]:StartingDockerApplicationContainer
Engine…
Nov0814:54:05 iZm5ehqytm0v0o8vdvzuyjZ dockerd[1011]: time=“2021-11-
08T14:54:05.000732056+08:00” level=info msg=“Starting up”
Nov0814:54:05 iZm5ehqytm0v0o8vdvzuyjZ dockerd[1011]: chmod /var/lib/docker: read-only
file system
可以看到是出现了read-only file system错误导致的,这是由于突然断电停机,导致服务器磁盘处于了保护状态,禁止写,解决
办法为执行mount -o remount rw /
执行完成后,再运行systemctl start docker.service,此时仍然失败,再使用journalctl -u docker.service查看日志,出现如下错
误
Nov 09 09:32:45 iZm5ehqytm0v0o8vdvzuykZ dockerd[45470]: time=“2021-11-
09T09:32:45.783089413+08:00” level=info msg=“Starting up”
Aug. 5, 2026
这个问题是http访问方式的问题,需要在harbor所在的服务器添加以下代码,允许http不安全的操作
编辑 /etc/docker/daemon.json,设置允许访问的 HTTP 仓库地址。
{
“insecure-registries”:[“11.8.36.21:8888”]
}
Aug. 5, 2026
sudo docker run -d -p 6379:6379 –name redis redis:latest redis-server
Aug. 5, 2026
root帐户进入容器:
执行 docker exec -it –user root 5dd1c0bc2d60 /bin/bash
Aug. 5, 2026
在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的。幸
运的是 docker 自己就提供了这样的命令:docker stats。
默认输出
docker stats 命令用来显示容器使用的系统资源。不带任何选项执行 docker stats 命令:
$ docker stats
默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl + c。下面是输出的主要内容:
[CONTAINER]:以短格式显示容器的 ID。
[CPU %]:CPU 的使用情况。
[MEM USAGE / LIMIT]:当前使用的内存和最大可以使用的内存。
[MEM %]:以百分比的形式显示内存使用情况。
[NET I/O]:网络 I/O 数据。
[BLOCK I/O]:磁盘 I/O 数据。
[PIDS]:PID 号。
只返回当前的状态
如果不想持续的监控容器使用资源的情况,可以通过 –no-stream 选项只输出当前的状态:
$ docker stats –no-stream
这样输出的结果就不会变化了,看起来省劲不少。
只输出指定的容器
如果我们只想查看个别容器的资源使用情况,可以为 docker stats 命令显式的指定目标容器的名称或者是 ID:
$ docker stats –no-stream registry 1493
当有很多的容器在运行时,这样的结果看起来会清爽一些。这里的 registry 和 1493 分别是容器的名称和容器的
ID。注意,多个容器的名称或者是 ID 之间需要用空格进行分割。
细心的同学可能已经发现了,第一列不再显示默认的容器 ID,而是显示了我们传入的容器名称和 ID。基于此,
我们可以通过简单的方式使用容器的名称替代默认输出中的容器 ID:
$ docker stats $(docker ps –format={{.Names}})
用容器的名称替代 ID 后输出的结果是不是友好一些?
格式化输出的结果
我们在前面搞了点小手段把输出中的容器 ID 替换成了名称。其实 docker stats 命令支持我们通过 –format 选项
自定义输出的内容和格式:
$ docker stats –format “table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}”
上面的命令中我们只输出了 Name, CPUPerc 和 Memusage 三列。下面是自定义的格式中可以使用的所有占位
符:
.Container 根据用户指定的名称显示容器的名称或 ID。
.Name 容器名称。
.ID 容器 ID。
.CPUPerc CPU 使用率。
.MemUsage 内存使用量。
Aug. 5, 2026
华为欧拉服务器docker内部无法访问外部域名
解决办法,停掉防火墙及iptables,因为iptables版本太老,无法解析所致,去掉之后重启docker,docker会自动重新配
置网络,然后即可访问外部网络
Aug. 5, 2026
从镜像中提取dockerfile的两种方法。
history
我们可以直接用docker自带的参数来查看镜像的dockerfile,但有一点就是看的不完全,只能
看到前面的一小部分;
例如:
#docker history 镜像名称:标签docker history nginx:latest
虽然docker history命令可以看到所有历史层级的操作,但是还是需要手动去写Dockerfile,看
的不是那么全,所以我们还有一个能看到非常详细的工具👇↓👇
dfimage
首先他不是一个命令,他是一个工具。
dfimage是一个alpine的镜像,启动的时候,通过将docker.sock映射到容器内部来运行,通常
将这个操作做成别名,让他变成一个工具(做完别名不能换新的bash,否则该别名就会消
失,如果不想消失,可以做一个永久的别名,这样不管在任何地方都可以用了)
alias dfimage=“docker run -v /var/run/docker.sock:/var/run/docker.sock –rm
alpine/dfimage” dfimage -sV=1.36 nginx:latest
我们拿nginx镜像试验下:
先pull一个nginx镜像,我这里之前有,就直接用了,接着通过上面提到的命令,别名一个
dfimage命令:
做好别名之后,通过dfimage去生成nginx的Dockerfile,其实就是启动一个容器工具,执行完
之后即删除该容器,镜像保留:
如果有报错,不能执行,估计就是缺少-sV=1.36,具体这个报错呢,暂时还没有研究,但是
加上-sV=1.36就可以。
#dfimage -sV=1.36 镜像名称:标签dfimage -sV=1.36 nginx:latest
即可看到完整的dockerfile,这个工具查看的非常的详细。
实操
alias dfimage=“docker run -v /var/run/docker.sock:/var/run/docker.sock –rm
alpine/dfimage”
docker images
docker pull alpine/dfimage:latest
dfimage -sV=1.36 192.168.100.71:31003/zhongtai/gradle:6.5.1






Aug. 5, 2026
从主机复制到容器
从容器复制到主机
Aug. 5, 2026
新安装的docker服务器从harbor拉去镜像报错:
Error response from daemon: unauthorized: unauthorized to access repository: menhu/cas,
action: pull: unauthorized to access repository: menhu/cas, action: pull
原因分析:
由于新机器没有登录Harbor私库,且仓库设置成是有的了,所以提示未授权访问存储库,只需docker登录一下私库即可
解决方案:
登录Docker镜像仓库(如果未指定镜像仓库地址,默认为官方仓库 Docker Hub)
docker login 私库地址
Aug. 5, 2026
默认情况下,docker镜像的默认存储路径是/var/lib/docker,这相当于直接挂载根目录下,然而如果在安装系统时选择了
自动分区,根分区一般不会分太大,CentOS会默认分50G,麒麟v4大概是100G。
docker的默认路径:
修改docker的默认路径,有三种方法
先创建新的docker目录
mkdir /home/docker
centos在安装时如果选择默认分区,会把最大存储空间分给home,此处也可另外挂载一块磁盘,把新的docker目录建
在新磁盘上面
如果已经有镜像已经加载,已经有容器正在运行,请先停了docker服务,并把数据迁移到新目录中
1、修改docker.service
vim /usr/lib/systemd/system/docker.service
#在里面的EXECStart的后面增加–graph /home/docker:
ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock –
graph /home/docker
保存退出后执行以下命令
systemctl enable docker
systemctl daemon-reload
systemctl restart docker
2、编辑配置文件/etc/docker/daemon.json添加 “data-root”:
“/data/docker
vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://registry.docker-cn.com”],
“data-root”: “/data/docker”
“log-driver”:“json-file”,
“log-opts”: {“max-size”:“100m”}
}
保存退出后
重启docker应用
systemctl restart docker
3、使用软链接
使用软链接需要先把/var/lib下的docker目录删除,删除之前记得迁移数据。然后用下面命令创建软链接
ln -s /home/docker /var/lib
systemctl restart docker
重启docker
以上就是修改docker默认路径之方法,可根据实际情况选用。
Aug. 5, 2026
日常在宿主机上使用Docker对象时,如拉取镜像、长期运行或启停容器,就会产生大量的无容器依赖的
镜像、停止不用的容器,以及无容器使用的数据卷、网络等(这些Docker不会主动清理),这些Docker对
象垃圾的日积月累堆积,将会影响宿主机的运行性能,造成主机卡顿或空间资源的浪费等。因此,需要
对宿主机的垃圾进行清理。
对于每种类型的对象,Docker都提供了一个prune命令。也可以使用docker system prune一次清理多种
类型的对象。本文将说明如何使用prune命令来清理这些垃圾。
镜像清理
使用docker image prune命令清理不再使用的镜像,默认情况下,docker image prune仅清除挂起的镜
像。所谓挂起的镜像是指没有被标记且没有被任何容器引用镜像。命令如下:
docker image prune
要删除现有容器未使用的所有镜像,请使用以下-a 标志:
docker image prune -a
默认情况下,系统会提示y/n。要绕过提示,要使用-f或 –force标记。
还可以使用带有–filter标志的过滤表达式限制清理哪些镜像。
例如,要仅清理超过24小时前创建的镜像,命令如下:
docker image prune -a –filter"until=24h"
容器清理
停止容器时一般不会自动删除容器,除非启动容器时使用了–rm标志。
要查看Docker主机上的所有容器,包括已停止的容器,可以使用如下命令:
docker ps -a
STATUS为UP的容器为正在运行的容器。其他停止的容器的可写层仍占用磁盘空间。要清除这些垃圾,
可以使用如下命令:
docker container prune
和清理镜像一样,可以使用 f或 –force 和 –filter参数,含义同上。
数据卷清理
同一数据卷可以被一个或多个容器使用,占用Docker主机上的空间。为防止数据被删除,Docker不会自
动删除卷。详细可参见《简述Docker数据管理》、《详解Docker数据卷》。
要删除数据卷,可以执行如下命令:
docker volume prune
和清理镜像一样,可以使用 f或 –force 和 –filter参数,含义同上。
网络清理
Docker网络不会占用太多磁盘空间,但是创建了iptables 规则,桥接网络设备和路由表条目。要清理这
些内容,可以使用docker network prune清理任何容器未使用的网络。
docker network prune
Aug. 5, 2026
1.如果已经启动了则可以使用如下命令:
2.docker update–restart=always
Aug. 5, 2026
来源:https://www.cnblogs.com/qgc1995/archive/2018/08/29/9553572.html
我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核3.8以
上, RHEL/Centos 的内核修补过, centos6.5的版本就可以——这个可以试试)
1,root账户登录,查看内核版本如下
[root@localhost ~]# uname -a
Linux localhost.qgc 3.10.0-862.11.6.el7.x86_64 #1 SMP Tue Aug 14 21:49:04 UTC 2018
x86_64 x86_64 x86_64 GNU/Linux
2,把yum包更新到最新(很多朋友说更新yum有问题,可以不更新试试,来自笔者的备注—2019年10月30日)
[root@localhost ~]# yum update
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
- base: centos.ustc.edu.cn
- extras: mirrors.aliyun.com
- updates: centos.ustc.edu.cn
正在解决依赖关系
–>正在检查事务
—>软件包 bind-libs.x86_64.32.9.9.4-61.el7 将被升级
—>软件包 bind-libs.x86_64.32.9.9.4-61.el7_5.1 将被更新
—>软件包 bind-libs-lite.x86_64.32.9.9.4-61.el7 将被升级
—>软件包 bind-libs-lite.x86_64.32.9.9.4-61.el7_5.1 将被更新
—>软件包 bind-license.noarch.32.9.9.4-61.el7 将被升级
—>软件包 bind-license.noarch.32.9.9.4-61.el7_5.1 将被更新
…
…
验证中 : 32:bind-license-9.9.4-61.el7.noarch 8/8
更新完毕:
bind-libs.x86_64 32:9.9.4-61.el7_5.1
bind-libs-lite.x86_64 32:9.9.4-61.el7_5.1
bind-license.noarch 32:9.9.4-61.el7_5.1
bind-utils.x86_64 32:9.9.4-61.el7_5.1
完毕!
[root@localhost ~]#
3,安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Aug. 5, 2026
依赖环境:
Openssl
Docker engine Version 17.06.0-ce+ or higher
Docker ComposeVersion 1.18.0 or higher
第一步先安装docker
参考docker安装教程
第二部安装 Openssl
yum install openssl openssl-devel
第三步安装Docker Compose
下载(注意替换版本号)
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s-uname -m` >
/usr/local/docker-compose
授权:
sudo chmod +x docker-compose
建立软连接:
sudo ln -s /usr/local/docker-compose /usr/bin/docker-compose
查看是否安装成功:
docker-compose –version
第四步安装harbor
1、下载安装包
下载地址:/github.com/goharbor/harbor/releases直接选择编译好的包
这里有两个包Harbor offline installer 和 Harbor online installer,两者的区别的是 Harbor offline installer
里就包含的 Harbor 需要使用的镜像文件
下载成功,并解压
[root@master ]# tar zxf harbor-offline-installer-v1.10.1.tgz -C /data/
进入解压的目录,并 ls
[root@master]#cd/data/harbor/
[root@masterharbor]#ls
common.shharbor.v1.10.1.tar.gzharbor.ymlinstall.shLICENSEprepare
2、编辑配置文件
harbor.yml 就是harbor的配置文件 harbor的数据目录为/data 编辑harbor.yml,修改hostname、https证书
路径、admin密码
Aug. 5, 2026
一、Containerd 安装
下载二进制安装包
github链接地址:https://github.com/containerd/containerd/releases
上传安装包到服务器并开始解压安装
tar xf containerd-1.6.6-linux-amd64.tar.gz
cp -r bin/* /usr/local/bin
创建/etc/system/system/containerd.service systemd service启动管理文件:
修改ExecStart=/usr/local/bin/containerd为当前containerd文件路径
Copyright The containerd Authors.
Licensed under the Apache License, Version 2.0 (the “License”);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Aug. 5, 2026
FATA[0000] failed to create shim task: OCI runtime create failed: runc create failed:
unable to start container process: error during container init: error running hook #0:
error running hook: exit status 1, stdout: , stderr: time=“2023-10-31T10:45:16Z”
level=fatal msg=“failed to call cni.Setup: plugin type=“bridge” failed (add): failed to
locate iptables: exec: “iptables”: executable file not found in $PATH”
Failed to write to log, write
/var/lib/nerdctl/1935db59/containers/default/564fab9f6e1bf0ece199473db0d4abbdbda7c44909ef
7ec08610dccb4ab0c657/oci-hook.createRuntime.log: file already closed: unknown
是因为containerd运行需要iptables插件
ubuntu新版的没有这个插件所以需要手动安装
Aug. 5, 2026
containerd 配置私有仓库地址
老版的是修改/etc/containerd/config.toml
修改配置文件如下:
[plugins.“io.containerd.grpc.v1.cri”.registry.configs]
[plugin.“io.containerd.grpc.v1.cri”.registry.configs.“218.29.223.194:31003”.tls]
insecure_skip_verify = true
[plugin.“io.containerd.grpc.v1.cri”.registry.configs.“218.29.223.194:31003”.auth]
username = “admin”
password = “5201314lk.L”
[plugins.“io.containerd.grpc.v1.cri”.registry.headers]
[plugins.“io.containerd.grpc.v1.cri”.registry.mirrors]
[plugin.“io.containerd.grpc.v1.cri”.registry.mirrors.“docker.io”]
endpoint = [“https://dxc7f1d6.mirror.aliyuncs.com”]
[plugin.“io.containerd.grpc.v1.cri”.registry.mirrors.“218.29.223.194:31003”]
endpoint = [“https://218.29.223.194:31003”]
新版本的直接在/etc/containerd/config.toml里配置 registry.mirrors已经失效
了。
最新的配置方法是只在config.toml 中指定hosts.toml的config_path下相应域
名下
特别注意config_path不能设置为/etc/containerd/certs.d
[plugins.“io.containerd.grpc.v1.cri”.registry]
config_path = "" #这里不能配 /etc/containerd/certs.d 配了出错
如下配置:
mkdir /etc/containerd/certs.d/218.29.223.194:31003
vim hosts.toml
server = “https://218.29.223.194:31003”
[host.“https://218.29.223.194:31003”]
capabilities = [“pull”, “resolve”, “push”]
skip_verify = true
修改完,需要daemon-reload, restart containerd
ctr无法配置证书,不生效,所以需要加上–skip-verify
sudo ctr -n k8s.io images pull 218.29.223.194:31003/library/test-k8s:1 –skip-verify
Aug. 5, 2026
如图
镜像全名
bitnami/mysql:8.0.35-debian-11-r0
启动命令
docker run -p 3306:3306 –name mysql -v
/data/mysql/conf/my.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro -v
/data/mysql/logs:/opt/bitnami/mysql/logs -v /data/mysql/data:/bitnami/mysql/data -e
MYSQL_ROOT_PASSWORD=123456 -d bitnami/mysql:8.0.35-debian-11-r0
环境准备
root@DESKTOP-1M3C1UI:mkdir -p /data/mysql/data /data/mysql/conf /data/mysql/logs
root@DESKTOP-1M3C1UI:/data/mysql# ls
conf data logs
root@DESKTOP-1M3C1UI:vim my.cnf
[mysqladmin]
user=
[mysqld]
skip_name_resolve
explicit_defaults_for_timestamp
basedir=/opt/bitnami/mysql
port=3306
tmpdir=/opt/bitnami/mysql/tmp
socket=/opt/bitnami/mysql/tmp/mysql.sock
pid_file=/opt/bitnami/mysql/tmp/mysqld.pid
max_allowed_packet=16M
bind_address=0.0.0.0
log_error=/opt/bitnami/mysql/logs/mysqld.log
slow_query_log=0
long_query_time=10.0
character_set_server=utf8mb4
plugin_dir=/opt/bitnami/mysql/lib/plugin
datadir=/bitnami/mysql/data
[client]
port=3306
socket=/opt/bitnami/mysql/tmp/mysql.sock
default_character_set=utf8mb4
plugin_dir=/opt/bitnami/mysql/lib/plugin
[manager]
port=3306
socket=/opt/bitnami/mysql/tmp/mysql.sock
pid_file=/opt/bitnami/mysql/tmp/mysqld.pid
解决问题
将以上docker启动命令加上 -e BITNAMI_DEBUG=true 可以查看启动详细日志
发现是上面创建的文件的权限问题修改文件夹权限
chown -R 1001.1001 /data/mysql/
启动成功
最后修改可远程连接就可以正常使用了
Aug. 5, 2026
sudo docker run –name nginx -p 89:80 -v
/home/lib/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v
/home/lib/nginx/log:/var/log/nginx
-v /home/lib/nginx/conf/conf.d:/etc/nginx/conf.d –restart=always -d nginx:latest
上面的命令可以启动但是无法访问,原因是conf.d文件夹下没有配置文件,只有nginx.conf,去掉conf.d之后就可以了
sudo docker run –name nginx -d -p 8700:80 -p 2600:3600 -p 2700:3700 -v
/home/lib/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/lib/nginx/log:/var/log/nginx -v
/home/lib/nginx/html:/usr/share/nginx/html –restart=always nginx:latest
第一个 -p 是nginx本身的端口
第二、三个 -p 是nginx代理的一个服务的端口
前面的是容器的端口后面的是容器内部nginx监听的端口
server {
listen 3600; //监听的端口(既是你访问的代理端口)
server_name 192.168.30.129;//你访问的地址可以是域名
charset utf-8;//字符集
location / {
//前端文件放的地方,此处注意()前面是挂载的本地地址,后面是容
器内部真实路径,当你访问代理的时候容器会向()去找,经过挂载后会向宿主机
()去找,但是配置文件里面要写容器内部的地址,配置文件时给容器内nginx使用的,所以nginx
的配置以容器内的为准,且只识别容器内的路径,若你配置()是找不到的,会报404,且日志会报
(2019/09/23 02:50:34 [error] 7#7: *1 “/home/data/dma/designer/front/index.html” is not found (2: No such file or
directory), client: 192.168.30.168, server: 192.168.30.129, request: “GET / HTTP/1.1”, host: “192.168.30.129:2700”)
root /usr/share/nginx/html/dma-designer;
index index.html index.htm;
#try_files $uri $uri/ /index.html;
}
location /dma/{
proxy_pass http://192.168.30.129:3600/dma/;
}
location /dmm_cas/ {
proxy_pass http://192.168.30.72:8080/cas;
}
error_page 500 502 503 504 /50x.html;
Aug. 5, 2026
1.停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)
如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)
2.查看当前有些什么images
docker images
3.删除images,通过image的id来指定删除谁
docker rmi 想要删除untagged images,也就是那些id为的image的话可以用
docker rmi $(docker images | grep “^"| awk “{print $3}”)
要删除全部image的话
docker rmi $(docker images -q)
Aug. 5, 2026
wget -qO- https://get.docker.com/ | sh
安装docker可以使用阿里云加速安装过程
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet |
sh -
下载镜像也可以使用阿里云加速
sudo tee /etc/docker/daemon.json «-‘EOF’
{
“registry-mirrors”:[“https://nbijnqvd.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Aug. 5, 2026
rabbitmq
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rabbitmq:3.7.25-
management-alpine
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rabbitmq:3.7.25-
management-alpine docker.io/rabbitmq:3.7.25-management-alpine
docker run -id –name rabbitmq -v /data/rabbitmq:/var/lib/rabbitmq -p 15672:15672 -p
5672:5672 -e RABBITMQ_DEFAULT_USER=rabbitmq -e RABBITMQ_DEFAULT_PASS=123456
rabbitmq:3.7.25-management-alpine
es
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/elasticsearch:7.12.0
docker run -d –name es1 -e “ES_JAVA_OPTS=-Xms512m -Xmx512m”
-e “discovery.type=single-node”
-v /opt/elasticsearch/data:/usr/local/elasticsearch7.12.0/data
-v /opt/elasticsearch/plugins:/usr/local/elasticsearch7.12.0/plugins
-v /opt/elasticsearch/logs:/usr/local/elasticsearch7.12.0/logs
–privileged
-p 9200:9200
-p 9300:9300
redis
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/redis:6-alpine
docker run -d –name redis –restart=always -v /opt/redis/data:/data -p 6379:6379
3900abf41552 redis-server –requirepass 123456
chmod -R 755 /home/dawenzi/docker/redis/data
docker run -d
–name redis
-p 6379:6379 \
Aug. 5, 2026
设置为自启动:
chkconfig docker on
下载docker镜像
docker pull rabbitmq:management
启用rabbitmq
也可以用: sudo docker start rabbitmq(NAMES)
或者用: sudo docker start 62332131(CONTAINER ID )
sudo docker run -p 192.168.11.30:8080:8081 tomcat:latest(docker run -d -it -p 8000:80
tang1:latest /bin/bash)(不好使)
sudo docker run -d –hostname tomcat –name tomcat9 -p 8083:8080 –restart=always
tomcat:9
sudo docker run -d –hostname rabbit –name rabbit2 -v /data/rabbit2:/var/lib/rabbitmq -p
5673:5672 -p 15673:15672 –restart=always rabbitmq:management
sudo docker load < taomcat.tar # 导入镜像
启动tomcat并将端口与文件映射到制定地方
sudo docker run -d –name tomcat -v /home/dou/cas/:/usr/local/tomcat -p 8083:8080 –
restart=always tomcat
sudo docker run –name tomcat1 -p 8090:8080 -v
/home/data/tomcat/:/usr/local/tomcat/webapps/ –restart=always -d tomcat
关闭rabbitmq
Aug. 5, 2026
修改/etc/docker/daemon.json,添加hosts部分
{
“hosts”: [
“unix:///var/run/docker.sock”,
“tcp://0.0.0.0:2375”
],
“registry-mirrors”: [
“https://docker.hpcloud.cloud”,
“https://docker.m.daocloud.io”,
“https://docker.unsee.tech”,
“https://docker.1panel.live”,
“http://mirrors.ustc.edu.cn”,
“https://docker.chenby.cn”,
“http://mirror.azure.cn”,
“https://dockerpull.org”,
“https://dockerhub.icu”,
“https://hub.rat.dev”
]
}
修改/usr/lib/systemd/system/docker.service
修改如下:
ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd
重启
划重点:systemctl daemon-reload
然后:systemctl restart docker
Aug. 5, 2026
docker run -p 3306:3306 –name mysql-5.7 -v $PWD/home/dawenzi/mysql/conf/my.cnf:/etc/mysql//my.cnf -v
$PWD/home/dawenzi/mysql/logs:/logs -v $PWD/home/dawenzi/mysql/data:/var/lib/mysql -e
MYSQL_ROOT_PASSWORD=root -d mysql:5.7
docker run -d -p 8088:8088 -v D:/Docker/Superset:/home/superset amancevice/superset
-d:表示后台运行
-p:表示宿主机和容器的端口映射,以上面为例冒号前的9088是你自己主机的端口号,冒号后的8088是容器自身的端口
号
-v:表示宿主机与容器的文件路径映射,以上面为例D:/Docker/Superset是你自己主机的目录,/home/superset是容器内
应用目录。
docker run -p 3306:3306 -v /home/lib/mysql/data:/var/lib/mysql:rw -v /home/lib/mysql/log:/var/log/mysql:rw -v
/home/lib/mysql/config/my.cnf:/etc/mysql/my.cnf:rw -v /etc/localtime:/etc/localtime:ro -e
MYSQL_ROOT_PASSWORD=root –name mysql8 –restart=always -d mysql
docker run -p 3306:3306 –name mysql -v /home/lib/mysql/conf:/etc/mysql/conf.d -v /home/lib/mysql/logs:/logs -v
/home/lib/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root –restart=always -d mysql:latest
配置文件(mysql8):
my.cnf
出现连接不上时:
https://blog.csdn.net/mxskymx/article/details/88765072
1.登录mysql : mysql -u root -p
2.输入密码: Enter password: xxxxx
—— Server version: 8.0.15 MySQL Community Server - GPL
3.进入mysql数据库:use mysql;
4.设置允许远程用户访问:
Aug. 5, 2026
一、根据对外暴漏的端口通信
二、每个容器都会被docker分配一个ip,一般是172开头的,直接根据ip通
信,但是这个ip每次都会变,实用性不强。
三、使用–link参数,–link就是在hosts里面添加映射(官方不推荐使用)
第一步先启动访问目标容器
docker run -it -d -p 9081:80 –name nginx1 nginx
第二步启动客户端容器,并使用–link指定目标服务器的访问别名(第一个是容器的名称/ID,第二个是访问别
名)
docker run -it -d -p 9091:80 –link nginx1:qyg –name nginx2 nginx
docker exec -it nginx2 /bin/bash
root@d323c08453f0:/# cat /etc/hosts
127.0.0.1localhost
::1localhost ip6-localhost ip6-loopback
fe00::0ip6-localnet
ff00::0ip6-mcastprefix
ff02::1ip6-allnodes
ff02::2ip6-allrouters
172.17.0.3qyg 274ba29d1624 nginx1
172.17.0.4d323c08453f0
四、自定义bridge网桥
首先在主机上创建一个网络,命令如下:
docker network create mynet
docker network create \ –driver bridge \ –
subnet=172.25.0.0/16 \ –gateway=172.25.0.1 \ –ip-range=172.25.50.0/24 \ –aux-
address=“my-router=172.25.50.10”\ my-custom-network
// 已启动的连接如网络
docker network connect –alias db wisemapping-network mysql
// 检查王国有哪些镜像
Aug. 5, 2026
Docker无法在WSL2的Ubuntu启动的问题
今天在更新了WSL2上的Ubuntu22.04版本,在安装Docker后无法启动,查看Docker的日志显示如下的错误
INFO[2022-04-22T16:14:55.718999500+08:00] stopping event stream following graceful
shutdown error="" module=libcontainerd namespace=moby
INFO[2022-04-22T16:14:55.719787400+08:00] stopping event stream following graceful
shutdown error=“context canceled” module=libcontainerd namespace=plugins.moby
INFO[2022-04-22T16:14:55.719906400+08:00] stopping healthcheck following graceful
shutdown module=libcontainerd
failed to start daemon: Error initializing network controller: error obtaining
controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain:
(iptables failed: iptables –wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7
(nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER-
ISOLATION-STAGE-1
(exit status 4))
原因是由于新的ubuntu系统使用了iptables-nft,而WSL2不支持导致的。
可以通过以下命令进行修改
sudo update-alternatives –config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).
Selection Path Priority Status
0 /usr/sbin/iptables-nft 20 auto mode
1 /usr/sbin/iptables-legacy 10 manual mode
2 /usr/sbin/iptables-nft 20 manual mode
Press to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables
(iptables) in manual mode
修改完成后重启Docker服务即可。
Aug. 5, 2026
failed to start daemon: failed to dial
“/run/containerd/containerd.sock”: unknown service
contain…
在搭建k8s集群时,有两台主机中途重启过,然后出现docker无法启动的问题,通过journalctl -u docker.service发报如下错
误:
Nov 08 14:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service: Main process exited,
code=exited, status=1/FAILURE
Nov 08 14:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service: Failed with result
’exit-code’.
Nov 08 14:54:02 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: Failed to start Docker Application
Container Engine.
Nov 08 14:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service: Service
RestartSec=2s expired, scheduling restart.
Nov 08 14:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: docker.service: Scheduled restart
job, restart counter is at 2.
Nov 08 14:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: Stopped Docker Application Container
Engine.
Nov 08 14:54:04 iZm5ehqytm0v0o8vdvzuyjZ systemd[1]: Starting Docker Application
Container Engine…
Nov 08 14:54:05 iZm5ehqytm0v0o8vdvzuyjZ dockerd[1011]: time=“2021-11-
08T14:54:05.000732056+08:00” level=info msg=“Starting up”
Nov 08 14:54:05 iZm5ehqytm0v0o8vdvzuyjZ dockerd[1011]: chmod /var/lib/docker: read-only
file system
可以看到是出现了read-only file system错误导致的,这是由于突然断电停机,导致服务器磁盘处于了保护状态,禁止写,解决
办法为执行mount -o remount rw /
执行完成后,再运行systemctl start docker.service,此时仍然失败,再使用journalctl -u docker.service查看日志,出现如下错
误
Nov 09 09:32:45 iZm5ehqytm0v0o8vdvzuykZ dockerd[45470]: time=“2021-11-
09T09:32:45.783089413+08:00” level=info msg=“Starting up”
Nov 09 09:32:45 iZm5ehqytm0v0o8vdvzuykZ dockerd[45470]: time=“2021-11-
09T09:32:45.785039235+08:00” level=info msg=“parsed scheme: "unix"” module=grpc
Aug. 5, 2026
1.安装docker
已完成,记录于centos中docker安装mysql
2.获取Oracle 11g docker镜像
[root@plmomn-gw ~]# docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
Using default tag: latest
latest: Pulling from helowin/oracle_11g
[DEPRECATION NOTICE] Docker Image Format v1 and Docker Image manifest version 2, schema
1 support is disabled by default and will be removed in an upcoming release. Suggest the
author of registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g:latest to upgrade the
image to the OCI Format or Docker Image manifest v2, schema 2. More information at
https://docs.docker.com/go/deprecated-image-specs/
3.创建容器
[root@plmomn-gw ~]# docker run -d –privileged -p 1521:1521 –name oracle11g –
restart=always -v /home/oracle/data:/data/oracle registry.cn-
hangzhou.aliyuncs.com/helowin/oracle_11g
命令说明:
-p:端口映射,主机端口:容器端口
-v:挂载文件夹,主机文件夹:容器文件夹
–privileged 允许挂在数据卷,默认读写权限rw
创建成功
4.修改root密码
进入容器,切换到root用户
[root@plmomn-gw ~]# docker exec -it oracle11g bash
[oracle@3fe959481973 /]$ su root
Password: helowin
修改root用户密码,失败
[root@3fe959481973 /]# passwd
Aug. 5, 2026
sudo docker logs –tail=100 bz-inner-cst
查看docker内部日志
Aug. 5, 2026
docker-cli:这是一个命令行工具,它是用来完成 docker pull ,build,run,exec
containerd:这是一个管理和运行容器的守护进程。它推送和拉动镜像,管理存储和网络,并监督容器的运
行。
runc:这是低级别的容器运行时间(实际创建和运行容器的东西)。它包括 libcontainer,一个用于创建容
器的基于 Go 的本地实现。实现了容器启停、资源隔离等功能。
更换 Containerd 后,以往我们常用的 docker 命令也不再使用,取而代之的分别是 crictl 和 ctr 两个
命令客户端。
crictl 是遵循 CRI 接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜
像。
ctr 是 containerd 的一个客户端工具。
ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认
为 crictl 是用于 k8s 的。
一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装
了 containerd 服务后就可以操作 ctr 命令。
使用crictl命令之前,需要先配置/etc/crictl.yaml如下:
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
或者使用命令:
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock
由于 Containerd 也有 namespaces 的概念,对于上层编排系统的支持,ctr 客户端主要区分了 3 个命名
空间分别是k8s.io、moby和default,
k8s会使用k8s.io作为命名空间,
containerd默认会使用default。
docker 其实也是默认调用的 containerd,事实上 docker 使用的 containerd 下面的命名空间默认
是 moby。
以上我们用crictl操作的均在k8s.io命名空间,使用ctr 看镜像列表就需要加上-n 参数。crictl 是只有一
个k8s.io命名空间,但是没有-n 参数。
【温馨提示】ctr images pull 拉取的镜像默认放在default,而 crictl pull 和 kubelet 默认拉取的镜
像都在 k8s.io 命名空间下。所以通过ctr导入镜像的时候特别注意一点,最好指定命名空间。
注意-n不能放在命令最后面,下面几行查看的镜像是一样的
ctr -n=k8s.io image ls
ctr -n k8s.io image ls
Aug. 5, 2026
1、安装基础包
apt-get install -y gnupg2 sudo vim wget
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 -
3、安装postgresql-14
apt-get update&&apt-get -y install postgresql-14
4、添加访问权限
sudo sed -i ‘/^local/s/peer/trust/’/etc/postgresql/14/main/pg_hba.conf
sudo sed -i ‘/^host/s/ident/md5/’/etc/postgresql/14/main/pg_hba.conf
5、允许ipv4和ipv6访问
sudo vim /etc/postgresql/14/main/pg_hba.conf
添加下面这两行在图片位置
host all all 0.0.0.0/32 md5
host all all 0.0.0.0/0 md5
sudo vim /etc/postgresql/14/main/postgresql.conf
添加这行在图片位置
listen_addresses=’*’
6、重启数据库、设置开机自启
sudo systemctl restart postgresql
sudo systemctl enable postgresql
7、创建角色名为admin密码为MyPassword的角色
sudo -u postgres psql
CREATE ROLE admin WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD ‘MyPassword’;
8、连接数据库
数据库连接工具:Download | DBeaver Community
选择PostgreSQL
Aug. 5, 2026
默认超级用户(root)不能启动postgresql,需要建用户postgres。
安装完毕后,系统会创建一个数据库超级用户 postgres,密码为空。
默认psql本地登录是不需要密码的,即使我们设置了密码,也不需要密码就能登录。应为配置文件
pg_hba.conf中的local设置为trust
su - postgres 与下面的相同
sudo -i -u postgres
这时使用以下命令进入 postgres,输出以下信息,说明安装成功:
~$ psql
psql (9.5.17)
Type “help” for help.
postgres=#
查看版本
psql -V
输入以下命令退出 PostgreSQL 提示符:
\q
PostgreSQL 安装完成后默认是已经启动的,但是也可以通过下面的方式来手动启动服务。
sudo /etc/init.d/postgresql start # 开启
sudo /etc/init.d/postgresql stop # 关闭
sudo /etc/init.d/postgresql restart # 重启
创建数据库test
CREATE DATABASE test;
创建用户
create user server with password ‘123456’;
查看用户列表
\du
使用 \l 用于查看已经存在的数据库:
接下来我们可以使用 \c + 数据库名来进入数据库:
我们可以使用 \d 命令来查看表
在系统的命令行查看,我么可以在连接数据库后面添加数据库名来选择数据库:
psql -h localhost -p 5432 -U postgres runoobdb
Aug. 5, 2026
select COLUMN_NAME from information_schema.columns where table_name=‘TableName’
Aug. 5, 2026
- 查询数据库对象
下面通过示例分别展示如何查询各种数据库对象。
1.1 表查询
PostgreSql 表信息可以从information_schema.tables 或 pg_catalog.pg_tables 视图中查询:
select * from information_schema.tab
1
les;
2
select * from pg_catalog.pg_tables;
1.2 查询Schema
获取用户当前选择的schema:
1select current_schema();
返回数据库中所有schema:
select * from information_schema.sch
1emata;
2select * from pg_catalog.pg_namespac
e
1.3 查询数据库
查询当前选择的数据库:
1select current_database();
返回服务器上所有数据库:
1select * from pg_catalog.pg_database
1.4 查询视图
查询数据库中所有schema中的所有视图:
select * from information_schema.vie
1
ws
2
3
select * from pg_catalog.pg_views;
1.5 查询表的列信息
查询某个表的列信息:
SELECT
*
FROM
information_schema.columns
WHERE
6 table_name = ’employee'
ORDER BY
ordinal_position;
1.6 查询索引信息
查询数据库中所有索引信息;
1select * from pg_catalog.pg_indexes;
1.6 查询函数信息
返回数据库中所有函数。对于用户定义函数,routine_definition 列会有函数体:
select * from information_schema.rou
1tines where routine_type
= ‘FUNCTION’;
1.7 触发器
查询数据库中所有触发器,action_statemen类别包括触发器body信息:
select * from information_schema.tri
1
ggers;
2. 查询表占用空间
2.1 查询表占用空间
实际应用中,通常需要表占用磁盘空间情况,我们可以利用系统表实现:
SELECT nspname || ‘.’ ||
relname AS"relation",
pg_size_pretty(pg_total_relation_si
1
ze(C.oid))AS “total_size”
2
FROM pg_class C
3
LEFT JOIN pg_namespace N ON (N.oid
4
= C.relnamespace)
5
WHERE nspname NOT IN (‘pg_catalog’,
6
‘information_schema’)
7
AND C.relkind <> ‘i’
8
AND nspname !~ ‘^pg_toast’
9
ORDER BY pg_total_relation_size(C.o
id) DESC
LIMIT 5;
示例输出:
Aug. 5, 2026
协和2.5柜子数据初始化及程序更新说明.docx
数据初始化存储过程.txt
Aug. 5, 2026
CREATEDATABASEIFNOTEXISTS boot_tool CHARACTERSET utf8mb4 collate utf8mb4_general_ci;
Aug. 5, 2026
资源文件properties:
url=jdbc:mysql://localhost/studentManagement?useUnicode=true&characterEncoding=utf-8
driver=com.mysql.jdbc.Driver
userName=root
password=root
工具程序:
package com.dawenzi.conn;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
/**
- Created by root on 16-12-14.
*/
public class ConnectionDatabase {
private static Properties properties=new Properties();
static {
try {
properties.load(ConnectionDatabase.class.getResourceAsStream(“ConnectionMessage.properties”));
} catch (IOException e) {
e.printStackTrace();
}
}
public Connection conn;
public PreparedStatement pst=null;
public String sql=null;
public void createConn(){
try {
Class.forName(properties.getProperty(“driver”));
conn= DriverManager.getConnection(
properties.getProperty(“url”),
properties.getProperty(“userName”),
properties.getProperty(“password”));
if (sql!=null){
pst=conn.prepareStatement(sql);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void close(){
try {
this.conn.close();
if (sql!=null){
pst1.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Aug. 5, 2026
linux应用之mysql8安装
1、安装前工作
在安装前需要确定现在这个系统有没有 mysql,如果有那么必须卸载(在 centos7 自带的是 mariaDb 数据库,所以第
一步是卸载数据库)。
#查看mariadb数据库:rpm -qa | grep mariadb
#卸载mariadb数据库:rpm -e –nodeps mariadb文件名
#查看 mysql 数据库:rpm -qa | grep -i mysql
#卸载 mysql 数据库:rpm -e mysql文件名 # 如果有关联文件,不能直接卸载。可以用一下命令强制卸载:rpm -e -
-nodeps mysql文件名)
#删除etc目录下的my.cnf文件:rm /etc/my.cnf
2、官网下载
下载成功之后,上传到云服务(我是上传到/usr/src目录下)可先安装rz命令(yum install lrzsz -y)
3、解压到local下面,并且重新命名为mysql
解压命令:tar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
重命名命令:mv mysql-8.0.13-linux-glibc2.12-x86_64/ mysql
4、添加mysql用户组和用户
#首先检查mysql用户和组是否存在
cat /etc/group | grep mysql
cat /etc/passwd | grep mysql
#添加mysql用户和组
groupadd mysql
useradd -r -g mysql mysql
5、初始化mysql配置表
# chown -R mysql:mysql ./ 修改当前目录为mysql用户
Aug. 5, 2026
一、下载
链接:https://dev.mysql.com/downloads/mysql/
点击 Download,如下图:
没有登陆,点击 “No thanks,just start my downlaod.” 即可下载
二、安装
2.1 将下载的mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz上传到服务器,并解压为tar
命令:xz -dev mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz
如下图:
2.2 解压mysql-8.0.23-linux-glibc2.12-x86_64.tar 到目录 /opt/module下面
解压命令:tar -xvf mysql-8.0.23-linux-glibc2.12-x86_64.tar -C /opt/module/
重命名:mv mysql-8.0.23-linux-glibc2.12-x86_64 mysql8
如下图,
2.3 进入mysql解压后的目录mysql8,并创建存放mysql日志的目录
cd /opt/module/mysql8/
mkdir data
2.4 配置mysql环境变量
MYSQL_HOME=/opt/module/mysql8/bin
PATH=$PATH:$MYSQL_HOME
export MYSQL_HOME PATH
如下图:
配置完成后重载:
source /etc/profile
2.5 创建mysql用户组和mysql用户
groupadd mysql
useradd -g mysql mysql
如下图:
2.6 关联myql用户到mysql用户组中
进入到mysql8所在目录,此例中为/opt/module/
chown -R mysql:mysql ./
chown -R mysql:mysql ./data/
chown -R mysql ./data/
chown -R mysql ./
2.7 更改mysql安装文件夹mysql的权限
[root@localhost module]# chmod -R 755 mysql8
2.8 安装libaio依赖包
查询是否安装libaio依赖包
Aug. 5, 2026
一、mysql8修改AUTO_INCREMENT的值。执行sql如下,“tablename”为数据表名称。
注意:修改的auto_increment的值得大于现有主键的最大值。否则,语句不报错,但不会生效。
ALTER TABLE tablename auto_increment=1;
二、修改后查询一下auto_increment的值,执行下面sql可查询(结果发现还是修改之前的值)
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name=“tablename”;
三、分析数据表。重新分析一下数据表即可,执行如下sql。
analyze table tablename;
分析数据表之后,在执行第二步中的查询即可看到auto_increment的值修改成功。
Aug. 5, 2026
mysql 版本 8.0.28
master192.168.2.123
slave192.168.2.124
部署请参考(linux下tar包mysql8安装(经过本人多次测试))
配置文件如下:
my.cnf
1、主从服务器分别作以下操作:
1.1、版本一致
1.2、初始化表,并在后台启动mysql
1.3、修改root的密码
2、修改主服务器master
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=1 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
3、修改从服务器slave:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=2 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
4、重启两台服务器的mysql
/etc/init.d/mysql restart
5、在主服务器上建立帐户并授权slave:
#/usr/local/mysql/bin/mysql -uroot -p123456
#use mysql;
#CREATE USER ‘slave’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;
#mysql> GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’;
//一般不用root帐号 ‘%‘表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如
192.168.137.141,加强安全。
6、登录主服务器的mysql,查询master的状态
mysql>show master status;
±—————–±———±————-±—————–+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
±—————–±———±————-±—————–+
| bin.000005 | 694 | | |
±—————–±———±————-±—————–+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7、从服务器设置普通用户只读模式
mysql>create user ‘test’@’%’ identified by ‘123456’; // 创建普通用户,可以远程连接
mysql> grant select on . to test@’%‘identified by ‘123456’; //授权所有库,只能查询操作
mysql> grant all privileges on . to test@’%‘identified by ‘123456’; //这是授予所有权限
关于mysql创建用户以及权限,下面有详细说明;这里只是做了主从复制避免从库添加数据做准备;
从库远程登录就用刚才设置的普通的只要查询权限的账号去登录,避免导致主从出错
8、配置从服务器Slave:
在从库上配置需要连接的主库信息:
mysql>change master to
master_host=‘192.168.2.123’,master_user=‘slave’,master_password=‘123456’,
master_log_file=‘bin.000005’,master_log_pos=694; //注意不要断开,308数字前后无单引号。
Mysql>start slave; //启动从服务器复制功能
Aug. 5, 2026
yum安装没有问题
执行初始化命令执行也没有问题
mysqld –user=mysql –datadir=/var/lib/data –lower-case-table-names=1 –initialize-
insecure
执行启动命令无法启动
查看mysql的日志如下
2023-09-21T08:47:39.248185Z 0 [System] [MY-
013169] [Server] /usr/sbin/mysqld (mysqld 8.0.34) initializing of server in progress as p
rocess 14205
2023-09-21T08:47:39.257367Z 1 [System] [MY-
013576] [InnoDB] InnoDB initialization has started.
2023-09-21T08:47:39.815707Z 1 [System] [MY-
013577] [InnoDB] InnoDB initialization has ended.
2023-09-21T08:47:41.364490Z 6 [Warning] [MY-
010453] [Server] root@localhost is created with an empty password ! Please consider switc
hing off the –initialize-insecure option.
2023-09-21T08:48:23.110943Z 0 [System] [MY-
010116] [Server] /usr/sbin/mysqld (mysqld 8.0.34) starting as process 14314
2023-09-21T08:48:23.116456Z 0 [Warning] [MY-
010075] [Server] No existing UUID has been found, so we assume that this is the first tim
e that this server has been started. Generating a new UUID: 9f31a861-585b-11ee-a8e0-
00505685cbf9.
mysqld: File ‘/var/lib/data/auto.cnf’ not found (OS errno 13 - Permission denied)
2023-09-21T08:48:23.116508Z 0 [ERROR] [MY-
010183] [Server] Failed to create file(file: ‘/var/lib/data/auto.cnf’, errno 13)
2023-09-21T08:48:23.116516Z 0 [ERROR] [MY-
010076] [Server] Initialization of the server’s UUID failed because it could not be read
from the auto.cnf file. If this is a new server, the initialization failed because it was
not possible to generate a new UUID.
2023-09-21T08:48:23.116543Z 0 [ERROR] [MY-010119] [Server] Aborting
2023-09-21T08:48:23.116995Z 0 [System] [MY-
010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.34) MySQL Community Ser
ver - GPL.
一直报
mysqld: File ‘/var/lib/data/auto.cnf’ not found (OS errno 13 - Permissio
n denied)
Aug. 5, 2026
SELECT
t.id AS id,
t.count AS count,
t.basenum AS bnum,
c1.cst_name AS NAME,
v.vendor_name AS vname,
m.name AS mname,
c1.cst_code AS cstcode,
c1.wrap_name AS wrapname
FROM
(
SELECT
d.id AS id,
d.hospital_consumable_code AS hcode,
c.status AS status,
s.id AS sid,
d.base_num AS basenum,
COUNT(*) AS count
FROM
consumables_inventory c
LEFT JOIN department_store_house d ON c.department_store_house_code = d.code
LEFT JOIN store_house s ON s.code = d.store_house_code
WHERE
STATUS = 3
AND s.id = 1
GROUP BY
id,
hcode,
status,
sid,
basenum
– HAVING
– status=3 AND sid = 1
) AS t
LEFT JOIN hospital_consumable h ON h.code = t.hcode
LEFT JOIN consumables_dict c1 ON h.consumables_dict_code = c1.code
LEFT JOIN vendor_dict v ON v. CODE = c1.vendor_dict_code
LEFT JOIN manufacturer m ON m. CODE = c1.manufacturer_code
WHERE
t.count < t.basenum
LIMIT 0,10
Aug. 5, 2026
原因有四种:
(1)外键对应的字段数据类型不一致
(2)两张表的存储引擎不一致
(3)设置外键时“删除时”设置为“SET NULL”
(4)字段的编码或排序不一致
(5) 外键所关联的字段的值在另一张表不存在
Aug. 5, 2026
图解SQL的inner join、left join、right join、full outer join、union、union all的区别
对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对
于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的
Join。我觉得清楚易懂,转过来。
假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所
示:让我们看看不同JOIN的不同
1.INNER JOIN
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
2.FULL [OUTER] JOIN
(1)
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name
4.RIGHT [OUTER] JOIN
RIGHT OUTERJOIN 是后面的表为基础,与LEFT OUTER JOIN用法类似。这里不介绍了。
5.UNION 与 UNION ALL
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的
列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。
(1)SELECT name FROM TableA UNION SELECT name FROM TableB
Aug. 5, 2026
四种隔离级别
1.读未提交(Read Uncommitted)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比
其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)
2.读已提交(Read Committed)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提
交事务所做的改变。这种隔离级别也支持所谓的不可重复读(NonrepeatableRead),因为同一事务的其他实例在该实
例处理其间可能会有新的commit,所以同一select可能返回不同结果
3.可重复读(Repeatable Read)
这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致
另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该
范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
4.可串行化(Serializable)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据
行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争
这四种隔离级别越往后越影响性能,如何选取根据业务需求而定。以下是四种隔离级别中对脏读、不可重复读、幻读的
影响情况。
读未提交(Read Uncommitted)依旧存在脏读、不可重复读和幻读;
读已提交(Read Committed)解决了脏读问题,因为发生脏读的条件就是读未提交的数据;
可重复读(Repeatable Read)进一步解决了不可重复读的问题,从隔离名称就可以看出,但还存在幻读问题;
可串行化(Serializable)解决了脏读、幻读、不可重复读问题,但是设立这种隔离级别会大大消耗性能。


Aug. 5, 2026
1.下载mysql rpm 安装包。选择对应的操作系统版本官网地址:如下
2.上传tar 包到linux 服务器并解压
3.解压结果如上图,会产生多个rpm包,我们不会用到这么多,只会用到其中的四个,依次执行下面命令(具体到版本号
有差别,请注意)
rpm -ivh mysql-community-common-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.22-1.el7.x86_64.rpm
4、安装过程中出现
error: Failed dependencies:
libcrypto.so.10()(64bit) is needed by mysql-community-libs-8.0.27-1.el7.x86_64
libcrypto.so.10(libcrypto.so.10)(64bit) is needed by mysql-community-libs-8.0.27-
1.el7.x86_64
libssl.so.10()(64bit) is needed by mysql-community-libs-8.0.27-1.el7.x86_64
libssl.so.10(libssl.so.10)(64bit) is needed by mysql-community-libs-8.0.27-1.el7.x86_64
mysql-community-client-plugins = 8.0.27-1.el7 is needed by mysql-community-libs-8.0.27-
1.el7.x86_64
需要安装compat-openssl10-1.0.2o-3.el8.x86_64.rpm
下载
wget https://vault.centos.org/centos/8/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-3.el8.x86_64.rpm
安装
rpm -ivh compat-openssl10-1.0.2o-3.el8.x86_64.rpm
安装
rpm -ivh mysql-community-client-8.0.27-1.el7.x86_64.rpm
warning: mysql-community-client-8.0.27-1.el7.x86_64.rpm: Header V3 DSA/SHA256 Signature, key ID 5072e1f5:
NOKEY
error: Failed dependencies:
libncurses.so.5()(64bit) is needed by mysql-community-client-8.0.27-1.el7.x86_64
libtinfo.so.5()(64bit) is needed by mysql-community-client-8.0.27-1.el7.x86_64
解决
[root@localhost mysql]# sudo yum install libncurses*
[root@localhost mysql8]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2023-04-12 13:32:56 CST; 3min 24s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 3930 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE)
Process: 3851 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 3930 (code=exited, status=1/FAILURE)
Status: “Server startup in progress”
Error: 13 (Permission denied)
Aug. 5, 2026
error while loading shared libraries:libtinfo.so.5: cannot
open shared object file : No such file
error while loading shared libraries:libtinfo.so.5: cannot
open shared object file : No such file or directory
一、错误原因
进入到 mysql 的 bin 目录时,进行登录,报出如上的错误,
从错误信息可知,服务器上没有 libtinfo.so.5 这个文件或者
目录
二、解决方案
在docs 命令下执行以下命令
安装yum install libncurses*
或者
软连接出一个新的文件
sudo ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5
执行完上条指令后,重新进行登录即可
./mysql -u root -p
————————————————
版权声明:本文为CSDN博主「976979786」的原创文章,
遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及
本声明。
原文链接:
https://blog.csdn.net/hbtstsxy/article/details/125479835
Aug. 5, 2026
本文以mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz为例
第一步:预置环境
1.1、将软件包上传到服务器上,上传完成后解压软件,解压后将软件重命名,最后将软件移
动到/usr/local下
tar -xvf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz
mv mysql-8.0.28-linux-glibc2.12-x86_64 mysql-8.0.28
mv mysql-8.0.28 /usr/local/
1.2、添加数据文件目录、日志文件目录,添加用户与用户组,修改文件夹及其下所有文件的
用户及用户组
mkdir -p /usr/local/mysql-8.0.28/logs
cd /usr/local/mysql-8.0.28/logs
mkdir err_logs slow_logs bin_logs
touch err_logs/error.log
#此处注意数据文件夹下不能有任何的文件或者文件夹
mkdir -p /data/mysql
groupadd mysql
#此处要建立系统账号加-r
useradd -r -g mysql mysql
chown -R mysql.mysql /data/mysql/
chown -R mysql.mysql /usr/local/mysql-8.0.28/
第二部:初始化mysql
2.1、在/etc创建配置文件my.cnf
简版-my.cnf
完善版-my.cnf
将配置my.cnf文件放置在/etc下
**注意先配置配置文件初始化后mysql.service直接就能用,后配置配置文件还需要手动修改mysql.service
之后才能使用
2.2、执行初始化脚本,记录生成的临时密码
#注意 –initialize-insecure 初始化后无密码 –initialize 有密码
cd /usr/local/mysql-8.0.28
[root@localhost mysql-8.0.28]# ./bin/mysqld –initialize –user=mysql –
basedir=/usr/local/mysql-8.0.28/ –datadir=/data/mysql –lower_case_table_names=1 –
console
2022-06-30T15:10:43.926164Z 0 [Warning] [MY-010918] [Server]
‘default_authentication_plugin’ is deprecated and will be removed in a future release.
Please use authentication_policy instead.
2022-06-30T15:10:43.927002Z 0 [System] [MY-013169] [Server] /usr/local/mysql-
8.0.28/bin/mysqld (mysqld 8.0.28) initializing of server in progress as process 1563
2022-06-30T15:10:44.341508Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has
started.
2022-06-30T15:10:55.721028Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has
ended.
2022-06-30T15:11:25.709770Z 6 [Note] [MY-010454] [Server] A temporary password is
generated for root@localhost: rX.hycK1lqy_
上面的 “rX.hycK1lqy_” 既是生成的随机文件
2.3、启动mysql
配置service启动文件
cp support-files/mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql
将mysql服务加到系统服务中
chkconfig –add mysql
开机自启动
chkconfig mysql on
#启动mysql
service mysql start
Aug. 5, 2026
#添加字段
ALTER TABLE doc_file_info ADD COLUMN chunk_count int DEFAULT NULL COMMENT ‘分片大小’
after size;
Aug. 5, 2026
/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50519
Source Host : localhost:3306
Source Database : test
Target Server Type : MYSQL
Target Server Version : 50519
File Encoding : 65001
Date: 2015-11-23 11:28:21
*/
SET FOREIGN_KEY_CHECKS=0;
– Table structure for club_customer
DROP TABLE IF EXISTS club_customer;
CREATE TABLE club_customer (
id int(11) NOT NULL AUTO_INCREMENT,
custname varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
Aug. 5, 2026
1.1 概述
有时候不知道小伙伴有没有跟我一样的情况,明明已经建立了索引,但是通过explain发
现语句并没有使用上索引,这可能是某些原因导致了我们的索引失效。所以本篇主要介绍的
是索引失效的常见原因和如何用好索引,给有需要的朋友一个参考。
1.2 索引失效
1.2.1 索引失效常见原因
我们先来看一张图,总结了常见的索引失效的原因
1.2.2 索引失效常见误区
1.2.3 索引设计的几个建议
1.3 索引示例
1.3.1 准备工作
创建一张表 test1
CREATE TABLE test1 (
id bigint NOT NULL,
code varchar(30) NOT NULL,
age int NOT NULL,
name varchar(30) NOT NULL,
height int NOT NULL,
PRIMARY KEY (id),
KEY idx_code_age_name (code,age,name) USING BTREE,
KEY idx_height (height) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
插入两条数据:
INSERT INTO test1(id, code, name, age,height) VALUES (1, ‘001’, ‘张飞’, 18,‘7’);
INSERT INTO test1(id, code, name, age,height) VALUES (2, ‘002’, ‘关羽’, 19,‘8’);
查询一下:
select * from test1;
结果:
此外建立了两个索引:idx_code_age_name( code , age , name )联合索引和
idx_height(height)普通索引
1.3.2 索引失效常见原因
1.3.2.1 不满足最左前缀原则
1.3.2.1.1 第1种情况
where 条件后的字段包含了联合索引的所有索引字段,并且顺序是按照: code 、 age 、
name
执行sql如下:
explain select * from test1
where code=‘001’ and age=18 and name=‘张飞’ ;
可以看出已经走了联合索引idx_code_name_age,并且索引的长度是 188, 188 = 30 * 3 + 2
Aug. 5, 2026
DISTINCT关键字经常在MySQL中使用,在mysql5.7以前的版本中一般
没有什么问题,但是在5.7以后的版本中会遇到这样的错误
Caused by: java.sql.SQLException: Expression #1 of ORDER BY clause is not in SELECT list, references column
‘game.giftbag0_.create_date’ which is not in SELECT list; this is incompatible with DISTINCT
错误提示DISTINCT不兼容,要么更改SQL,但是对于开发者来讲,sql运行一直都是正常的,可能是
mysql 版本升级导致的安全问题,5.7.x安全性提升了很多,解决办法可以考虑修改MySQL配置文件,找到
对应的my.cnf或者my.ini
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
1
添加该行就ok!
还有一种错也是不兼容的问题导致的
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘nctest.pivot.id’ which
is not functionally dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by
这种问题就是sql_mode=only_full_group_by导致的,去掉only_full_group_by就解决了
查看方法
SELECT @@GLOBAL.sql_mode
解决办法,在navicat里所操作的库里执行
SET GLOBAL sql_mode =
‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO
_CREATE_USER,NO_ENGINE_SUBSTITUTION '
Aug. 5, 2026
客户端设置
[client]
port = 3306
默认情况下,socket文件应为/usr/local/mysql/mysql.socket,所以可以ln -s xx /tmp/mysql.sock
socket = /tmp/mysql.sock
服务端设置
[mysqld]
#########################################################################################
#################
基础信息
#Mysql服务的唯一编号每个mysql服务Id需唯一
server-id = 1
#服务端口号默认3306
port = 3306
启动mysql服务进程的用户
user = mysql
#########################################################################################
#################
安装目录相关
mysql安装根目录
basedir = /usr/local/mysql-5.7.21
mysql数据文件所在位置
datadir = /usr/local/mysql-5.7.21/data
临时目录比如load data infile会用到,一般都是使用/tmp
tmpdir = /tmp
设置socke文件地址
socket = /tmp/mysql.sock
#########################################################################################
#################
事务隔离级别,默认为可重复读(REPEATABLE-READ)。(此级别下可能参数很多间隙锁,影响性能,但是
修改又影响主从复制及灾难恢复,建议还是修改代码逻辑吧)
隔离级别可选项目:READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE
transaction_isolation = READ-COMMITTED
transaction_isolation = REPEATABLE-READ
#########################################################################################
#################
数据库引擎与字符集相关设置
mysql 5.1之后,默认引擎就是InnoDB了
default_storage_engine = InnoDB
内存临时表默认引擎,默认InnoDB
default_tmp_storage_engine = InnoDB
Aug. 5, 2026
一、事务的四个特性(ACID)【面试常考项】
😀
有都发生和都不发生两种情况
一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致
状态,举一个栗子,李二给王五转账50元,其事务就是让李二账户上减去50元,
王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五
转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元,
王五还没加上50元这个中间状态是不可见的。
隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的
操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互
相干扰。
持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永
久性的,接下来的其他操作或故障不应对其有任何影响
Aug. 5, 2026
package database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
- Created by root on 16-11-15.
*/
publicclassDatabasesManager{
publicstatic final String url =“jdbc:mysql://127.0.0.1/shop?"+
“useUnicode=true&characterEncoding=utf-8”;
publicstatic final String name =“com.mysql.jdbc.Driver”;
publicstatic final String user =“root”;
publicstatic final String password =”";
public Connection conn =null;
public PreparedStatement pst =null;
public String sql =null;
publicDatabasesManager(){}
publicvoidcreateconn(){
try{
//1、注册连接数据库的驱动
Class.forName(name);
try{
//2、创建数据库连接
conn = DriverManager.getConnection(url, user, password);
//设置数据库自动提交属性为假
// conn.setAutoCommit(false);
//3、创建数据库命令
pst = conn.prepareStatement(sql);
}catch(SQLException e){
e.printStackTrace();
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}
}
publicvoidclose(){
try{
//关闭数据库链接
this.conn.close();
//关闭数据库命令
this.pst.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
Aug. 5, 2026
SHOW PROC ‘/backends’;
SHOW PROC ‘/frontends’;
ALTER SYSTEM DROP FOLLOWER “211.67.156.98:9010”;
ALTER SYSTEM ADD FOLLOWER “211.67.156.98:9010”;
ALTER SYSTEM ADD BACKEND “192.168.0.1:9050”;
IP
内存
priority_networks = 211.67.156.98/24
1stop fe
2
ALTER SYSTEM DROP FOLLOWER “211.67.156.98:9010”;
ALTER SYSTEM ADD FOLLOWER “211.67.156.98:9010”;
3
换包
–helper 211.67.156.99:9010 –daemon
/opt/user/jdk1.8.0_181/
SHOW PROC ‘/backends’;
SHOW PROC ‘/frontends’;
ALTER SYSTEM DROP FOLLOWER “211.67.156.99:9010”;
ALTER SYSTEM ADD FOLLOWER “211.67.156.99:9010”;
curl -i -k https://117.158.83.73:8001/api/v1/auth/get-access-token
curl -i -k https://172.16.251.2:8001/api/v1/auth/get-access-token
select DISTINCT TO_CHAR(CLRQ,‘yyyy-MM-dd’) c from T_REC_CONSUME ORDER BY c desc;
ALTER SESSION SET NLS_DATE_LANGUAGE=‘simplified chinese’;
select DISTINCT TO_CHAR(cast(to_timestamp(OPDT,‘dd-MON-yy hh:mi:ss.ff AM’) as
date),‘yyyy-MM-dd’) c from T_REC_KQMJ ORDER BY c desc;
select DISTINCT TO_CHAR(CLRQ,‘yyyy-MM-dd’) c from T_REC_SAVE ORDER BY c desc;
select DISTINCT TO_CHAR(SWINGTIME,‘yyyy-MM-dd’) c from DZ_T_SJTB_MJJL ORDER BY c desc;
select DISTINCT TO_DATE((SUBSTR(HSRQ, 0, 10)||’ ‘||SUBSTR(HSRQ, 11, 18)),‘yyyy-MM-dd
HH24:mi:ss’) c from T_TS_JYLS ORDER BY c desc;
select DISTINCT left(CLRQ,10) c from T_REC_SAVE ORDER BY c desc;
select DISTINCT left(CLRQ,10) c from T_REC_CONSUME ORDER BY c desc;
SHOW PROC ‘/backends’;
SHOW PROC ‘/frontends’;
SHOW PROC ‘/statistic’;
SHOW PROC ‘/statistic/6119160’;
SHOW TABLET FROM dmm_dw.STU_COURSE;
ADMIN SHOW REPLICA STATUS FROM dmm_dw.STU_COURSE PARTITION (p1, p2, p3) WHERE STATUS =
“NORMAL”;
Aug. 5, 2026
解决,查看MYSQL的依赖
$ ldd mysql
libtinfo.so.5 => not found
1
2
查看依赖是否存在
$ ls /lib/x86_64-linux-gnu/libtinfo.so.*
1
如果不存在,则去一个好的ubunu中复制一个libtinfo.so.5,并放入 /lib/x86_64-linux-gnu 目录下:
$ locate libtinfo.so.5 # 或者直接定位看linux中有没有然后复制一个就可以了
1
sudo mv libtinfo.so.5 /lib/x86_64-linux-gnu/
1
就可以了
Aug. 5, 2026
tar包安装mysql8 Failed to start mysql.service: Unit mysql.service not found.
想利用 service mysql start 启动mysql数据库,但是发现出现错误:
Failed to start mysql.service: Unit not found.
1、查询/etc/init.d/下是否存在mysql
ll /etc/init.d/ | grep mysql
发现该目录下并没有mysql的文件,若存在,请备份一下
2、查询mysql.server
find / -name mysql.server
mysql.server一般在你安装的mysql目录下,自己是编译安装,所以知道目录在哪里,不知道的这样看一下
3、执行复制操作,/usr/local/mysql/是我自己的mysql安装目录,大家根据查询出来的结果复制
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
然后 service mysql start 启动成功!
Aug. 5, 2026
在 Linux 下安装 mysql,想要知道 mysql 服务默认去哪里加载配置文件,包括查找顺序,只要通过下面这条语句即可:
1.mysqld –verbose –help | grep -A 1’Default options'
可以看到,配置文件查找顺序是:/etc/my.cnf > /etc/mysql/my.cnf > ~/.my.cnf
知道了配置文件目录(如上 /etc/my.cnf ),就可以在配置文件下进行相关配置了。或者如果该目录下没有配置文件,可
以拷贝外部配置文件到该目录下,甚至自己在目录下创建配置文件。
延伸
另外,怎么让 my.cnf include 其他配置文件呢?在 my.cnf 内加如下内容:
1.!includedir /etc/mysql/conf.d/
则除加载 my.cnf 配置文件外,还会到/etc/mysql/conf.d/目录下加载其他配置文件。当然可以配置多个!includedir
这样做的好处是可以把不同目的或功能的配置放在不同的多个文件下,然后由 my.cnf 去统一加载这些配置。避免所有
配置在一个文件中。

Aug. 5, 2026
一:下载Mysql安装包
Mysql5.7.35下载地址,或者直接去官网找到对应的包下载也行。我这边就直接用命令的方式下载了。废话不多说直接
开干。
// 进入local目录,这里你可以自定义其它安装目录
[root@xxxx/]# cd /usr/local/
// 下载mysql5.7.35版本的安装包
[root@xxxx local]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.35-
linux-glibc2.12-x86_64.tar.gz
下图表示下载完成
二:安装
// 解压安装包
[root@xxxx local]# tar -zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
// 重命名为mysql目录
[root@xxxx local]# mv mysql-5.7.35-linux-glibc2.12-x86_64/ mysql
// 创建mysql用户组和用户
[root@xxxx local]# groupadd mysql
[root@xxxx local]# useradd -r -g mysql mysql
[root@xxxx local]# groups mysql
mysql : mysql
[root@xxxx local]# cd mysql/
// 创建目录
[root@xxxx mysql]# mkdir data
// 赋权
[root@xxxx mysql]# chown -R mysql:mysql ./
// 配置my.cnf
[root@xxxx mysql]# vim /etc/my.cnf
my.cnf配置如下
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
Aug. 5, 2026
merge into T_USER_MEA_RESULT_DATA_INFO3 t1
using (select USERNUM,MEAYEARNAME,sum(WEIGHTSCORE) score from T_USER_MEA_RESULT_DATA_INFO3
t1 group by USERNUM,MEAYEARNAME) t2
on (t1.MEAYEARNAME=t2.MEAYEARNAME and t1.USERNUM=t2.USERNUM)
when matched then
UPDATE SET MEASCORE = t2.score
注意 update后面不跟表名直接跟set
适合两个以内的表关联的大数据量的更新
Aug. 5, 2026
1.1 概述
做完项目上线前,都需要做一些测试,比如:使用jmeter进行压力测
试、使用慢查询日志/mySQLdumslow对数据库的查询响应做测试,找到一
些执行时间比较久的SQL语句,然后对这些SQL语句进行优化,优化过程常
常这样做:我们常常用到explain这个命令来查看SQL语句的执行计划,查看
该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain
命令来查看。
1.2 expalin 介绍
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句。
在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执
行查询会返回执行计划的信息,而不是执行SQL。
1.2.1 expalin 作用
通过explain+sql语句可以知道如下内容:
1、表的读取顺序。(对应id)
2、数据读取操作的操作类型。(对应select_type)
3、哪些索引可以使用。(对应possible_keys)
4、哪些索引被实际使用。(对应key)
5、表直接的引用。(对应ref)
6、每张表有多少行被优化器查询。(对应rows)
1.2.2 expalin 使用方法
1、只需要在SELECT前面加上EXPLAIN即可,例如
explain select surname,first_name form a,b where a.id=b.id
2、在语句结尾(;之前)加上\G能够更清晰的查看。
3、需要说的是EXPLAIN只对SELECT查询作解释,INSERT、UPDATE、
DELETE不会
mysql> explain select * from servers;
+—-+————-+———+——+—————+——+———+——+——+—–
–+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows |
Extra |
+—-+————-+———+——+—————+——+———+——+——+—–
–+
| 1 | SIMPLE | servers | ALL | NULL | NULL | NULL | NULL | 1 |
NULL |
+—-+————-+———+——+—————+——+———+——+——+—–
–+
row in set (0.03 sec)
expain出来的信息有10列,分别是id、select_type、table、type、
possible_keys、key、key_len、ref、rows、Extra。
1.3 explain详解
1.3.1 id
SQL执行的成功的标识,SQL从大到小的执行。
id相同时,执行顺序由上至下
如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行,id为
NULL最后执行
id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越
大,优先级越高,越先执行
mysql> explain select * from (select * from ( select * from t3 where id=123) a) b;
+—-+————-+————+——–+——————-+———+———+——
+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref
| rows | Extra |
Aug. 5, 2026
查询所有的表空间
SELECT tablespace_name, block_size, initial_extent, next_extent, min_extents,
max_extents,
status, contents, logging, allocation_type, extent_management,
segment_space_management
FROM dba_tablespaces;
SELECT
tablespace_name,–表空间名称
file_id,–文件ID
file_name,–文件名
round( bytes / ( 1024 * 1024 ), 0 ) total_space –数据文件大小(M)
FROM
dba_data_files
WHERE
tablespace_name = ‘TSP_DPSTAR’
ORDER BY
tablespace_name;
–查询表空间文件
ALTER database datafile ‘/u01/app/oracle/product/11.2.0/dbhome_1/dbs/dpstar_temp01.dbf’ r
esize 32000M;
–修改已有数据文件大小
根据用户查询所在表空间
select default_tablespace from dba_users where username=‘DATA_PLATFORM’;
select a.tablespace_name as “表空间名” ,
a.bytes / 1024 / 1024 as “表空间大小(M)” ,
(a.bytes - b.bytes) / 1024 / 1024 as “已使用空间(M)” ,
b.bytes / 1024 / 1024 “空闲空间(M)” ,
round(((a.bytes - b.bytes) / a.bytes) * 100, 2) “使用比”
from ( select tablespace_name, sum (bytes) bytes
from dba_data_files
group by tablespace_name) a,
( select tablespace_name, sum (bytes) bytes, max (bytes) largest
from dba_free_space
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name
Aug. 5, 2026
dmp文件导出
dmp文件导出用的比较多的一般是三种,他们分别是:导出整个数据库实例下的所有数据、导出指定用户的所有表、
导出指定表。
这里已我的数据库为例,进行介绍,我的Oracle数据库实例为"ORACLE",查看自己数据库实例可以从"任务管理器–>
服务"中进行查看,如下图
打开命令行:
1,将数据库ORACLE完全导出,用户名system密码manager 导出到c:\daochu.dmp中
exp system/manager@ORACLE file=c:\daochu.dmp full=y
2,将数据库中RFD用户与,JYZGCX用户的表导出
exp system/manager@ORACLE file=d:\daochu.dmpowner=(RFD,JYZGCX)
3,将数据库中的表T_USER、T_ROLE导出
expJYZGCX/JYZGCX@ORACLEfile= d:\data\newsmgnt.dmp tables=(T_USER,T_ROLE)
上面的system为用户名,manager为密码,ORACLE为数据库实例名,其实不一定非的用system用户,只要是拥有
管理员权限的用户都可以。
dmp文件导入
步骤如下:
机器环境是windows条件下,win7:
1.打开“开始”—>输入cmd,打开cmd命令窗口,输入:sqlplus / as sysdba;然后使用conn / as sysdba;这样就可以以超
级管理员的最高权限登录,当然这决定于init.ora 文件中的数据库初始化参数,可以参考:
http://blog.chinaunix.net/uid-43642-id-2124603.html
2.上面以sysdba登录后,就可以创建表空间和用户了。(打开“开始”–>输入cmd—> sqlplus /nolog;输入 conn / as
sysdba管理员账户登录;)
由于目前有dmp文件,可以用notepad++(或者Editplus或者UltraEdit)打开dmp文件(UltraEdit或者Editplus打开效果
更好,没有乱码,因为是二进制文件嘛,不过其他方面我更喜欢notepad++),使用快捷键ctrl+F,查找tablespace ,
可以找到这个dmp文件所对应数据库的表空间,我查找我的表空间的名称是USERS,下面创建语句创建的表空间的名
称就是USERS,创建语句不太明白的,可以百度一下。
2.1然后创建表空间,命令如下:
create tablespace USERS
logging
datafile ‘D:\oracle\product\10.2.0\oradata\orcl\USERS.dbf’
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;
2.2创建用户,命令如下:
创建test用户,密码也是test222,使用上面创建的表空间
create user test identified by test222
default tablespace USERS
3.给创建的test用户分配权限,这里我比较懒,直接分配了dba权限,命令如下:
grant dba to test;
这样前期工作准备就绪了,然后可以关掉刚刚这个命令窗口了。
4.打开“开始”–>输入cmd(记住:这里是cmd窗口,不是sqlplus窗口!!!)
由于在上面几个步骤中,创建了test这个用户,所以往test用户导入数据:
直接输入如下语句:imp test/test222@localhost/orcl file=“C:\Users\zhengyi\Desktop\test20140221.DMP” full=y;
上述语句说明如下:
test是上面创建的登录数据库用户名;
test222是登录数据库的密码;
localhost:代表当前数据库的地址是本机,如果是远程导入,替换成对应的ip地址就行
orcl:是实例名称(这个如果不知道实例名称的话,应该可以查,如果不能查,额,我还不知道咋弄,我先试试!)
file:后面的是你当前dmp文件存放的路径
full=y,这个貌似是全部导入,我再查查核实一下!
1.导出用户所有的表到D盘:exp aa/1234 file=D:\biao.dmp owner=aa;
2.导出用户aa中的表dept到D盘:exp aa/1234 file=d:\dept.dmp tables=(dept);
3.导出用户aa中的表dept,emp到D盘:exp aa/1234 file=d:\dept.dmp tables=(dept,emp);
只导出owner=DMM_TZJK的所有表
exp DMM_TZJK/DMM_TZJK@127.0.0.1 /ORCL file=C:\Users\Administrator\Desktop\EXPORT\TZJK.dmp owne
r=DMM_TZJK log=C:\Users\Administrator\Desktop\EXPORT\gd_base.log
导出所有表(DMM_TZJK必须是系统用户)
exp DMM_TZJK/DMM_TZJK@127.0.0.1 /ORCL file=C:\Users\Administrator\Desktop\EXPORT\TZJK.dmp
log=C:\Users\Administrator\Desktop\EXPORT\gd_base.log full=y
Aug. 5, 2026
Oracle树形结构查询(递归)
引用:https://blog.csdn.net/u012615705/article/details/78321022文章转自上述地址,内部有稍许改动,如
有需要请查看原文。
oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经
常遇到的。
概要:树状结构通常由根节点、父节点、子节点和叶节点组成,简单来说,一张表中存在两个字段,
dept_id,par_dept_id,那么通过找到每一条记录的父级id即可形成一个树状结构,也就是par_dept_id(子)
=dept_id(父),通俗的说就是这条记录的par_dept_id是另外一条记录也就是父级的dept_id,其树状结构层级查
询的基本语法是:
SELECT [LEVEL],*
FEOM table_name
START WITH 条件1
CONNECT BY PRIOR 条件2
WHERE 条件3
ORDERBY 排序字段
说明:LEVEL—伪列,用于表示树的层次
条件1—根节点的限定条件,当然也可以放宽权限,以获得多个根节点,也就是获取多个树
条件2—连接条件,目的就是给出父子之间的关系是什么,根据这个关系进行递归查询
条件3—过滤条件,对所有返回的记录进行过滤。
排序字段—对所有返回记录进行排序
对prior说明:要的时候有两种写法:connect by prior dept_id=par_dept_id 或 connect by dept_id=prior
par_dept_id,前一种写法表示采用自上而下的搜索方式(先找父节点然后找子节点),后一种写法表示采用自下而上
的搜索方式(先找叶子节点然后找父节点)。
树状结构层次化查询需要对树结构的每一个节点进行访问并且不能重复,其访问步骤为:
大致意思就是扫描整个树结构的过程即遍历树的过程,其用语言描述就是:
步骤一:从根节点开始;
步骤二:访问该节点;
步骤三:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行
第四步;
步骤四:若该节点为根节点,则访问完毕,否则执行第五步;
步骤五:返回到该节点的父节点,并执行第三步骤。
除此之外,sys_connect_by_path函数是和connect by 一起使用的,在实战中具体带目的具体介绍!
实战:最近做项目的组织结构,对于部门的各级层次显示,由于这部分掌握不牢固,用最笨的like模糊查询解决了,虽
然功能实现了,但是问题很多,如扩展性不好,稍微改下需求就要进行大改,不满意最后对其进行了优化。在开发中能
用数据库解决的就不要用java去解决,这也是我一直保持的想法并坚持着。
创建表:
1: create table SYS_DEPT
2: (
3: dept_id VARCHAR2(32) not null,
4: dept_name VARCHAR2(128),
5: dept_code VARCHAR2(32),
6: par_dept_id VARCHAR2(32),
7: dept_leader VARCHAR2(32),
8: dept_desc VARCHAR2(256),
9: create_time CHAR(19),
10: org_id VARCHAR2(32),
11: dept_type VARCHAR2(1),
12: order_id NUMBER,
13: state CHAR(1) default'1’,
14: bqq_dept_id VARCHAR2(128),
15: bqq_par_dept_id VARCHAR2(128)
16: )
17:
18: – Add comments to the table
19: comment on table SYS_DEPT
20:is’部门信息,和单位多对一’;
21: – Add comments to the columns
22: comment on column SYS_DEPT.dept_id
23:is’主键’;
24: comment on column SYS_DEPT.dept_name
25:is’名称’;
26: comment on column SYS_DEPT.dept_code
27:is’编码,用于递归';
Aug. 5, 2026
select *
from (select t.*,
row_number() over(partition by t.strcaseid order by t.cu_date desc) rn
from b_push t) c
where rn = 1;
1) row_number() over()分组排序功能:
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where group by order by 的执行。
partition by 用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它和聚合函数不同的地方在于它能
够返回一个分组中的多条记录,而聚合函数一般只有一个反映统计值的记录。
Aug. 5, 2026
Oracle中start with…connect by prior子句使用方法
connect by 是结构化查询中用到的,其基本的语法是:
select … from tablename start with 条件1
connect by 条件2
where 条件3;
例:
select * from table
start with org_id = ‘HBHqfWGWPy’
connect by prior org_id = parent_id;
简单说来是将一个树状结构存储在一张表里,比方一个表中存在两个字段:
org_id,parent_id那么通过表示每一条记录的parent是谁,就能够形成一个树状结构。
用上述语法的查询能够取得这棵树的全部记录。
当中:
条件1 是根结点的限定语句,当然能够放宽限定条件,以取得多个根结点,实际就是多棵树。
条件2 是连接条件,当中用PRIOR表示上一条记录,比方 CONNECT BY PRIOR org_id = parent_id就是说上一条
记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
条件3 是过滤条件,用于对返回的全部记录进行过滤。
简介例如以下:
早扫描树结构表时,须要依此訪问树结构的每一个节点,一个节点仅仅能訪问一次,其訪问的过程例如以下:
第一步:从根节点開始;
第二步:訪问该节点;
第三步:推断该节点有无未被訪问的子节点,若有,则转向它最左側的未被訪问的子节,并运行第二步,否则运行第四
步;
第四步:若该节点为根节点,则訪问完成,否则运行第五步;
第五步:返回到该节点的父节点,并运行第三步骤。
总之:扫描整个树结构的过程也即是中序遍历树的过程。
1.树结构的描写叙述
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描写叙述,如EMP表中的
EMPNO和MGR。EMPNO表示该雇员的编号,MGR表示领导该雇员的人的编号,即子节点的MGR值等于父节点的
EMPNO值。在表的每一行中都有一个表示父节点的MGR(除根节点外),通过每一个节点的父节点,就能够确定整个
树结构。
在SELECT命令中使用CONNECT BY 和蔼START WITH 子句能够查询表中的树型结构关系。其命令格式例如以下:
SELECT 。。。
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}
[START WITH];
当中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运
算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一側表示父节点,在还有一
側表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了能够使用列名外,还同意
Aug. 5, 2026
#查询所有的表
SELECT * FROM USER_TABLES;
#查询所有的用户
select username from sys.dba_users;
#查询对象是表还是视图
Select OBJECT_NAME,OBJECT_TYPE From user_objects Where object_name=‘DDDFF’;
#获取表或视图的ddl语句
SELECT DBMS_METADATA.GET_DDL(‘VIEW’,‘C_TONGBU’) FROM DUAL;
#查询所有的表空间
SELECT tablespace_name, block_size, initial_extent, next_extent, min_extents,
max_extents,
status, contents, logging, allocation_type, extent_management, segment_space_management
FROM dba_tablespaces;
#查询指定的表空间
SELECT
tablespace_name,–表空间名称
file_id,–文件ID
file_name,–文件名
round( bytes / ( 1024 * 1024 ), 0 ) total_space –数据文件大小(M)
FROM
dba_data_files
WHERE
tablespace_name = ‘TSP_DPSTAR’
ORDER BY
tablespace_name;
#创建表空间
CREATE TABLESPACE test
LOGGING
DATAFILE ‘/data/oracle/oradata/orcl/test01.dbf’
SIZE 500M
AUTOEXTEND ON
NEXT 500M MAXSIZE 20480M
EXTENT MANAGEMENT LOCAL;
Aug. 5, 2026
sum() over ( )
ratio_to_report () over ( )
SELECT
b.zdmc,SUM(CZE/100) as je,sum(SUM(CZE/100)) over ( ) AS ttje
FROM
T_YKT_REC_CONSUME c
left join SJZX.T_YKT_BASE_TERM b on c.ZDBH=b.ZDBH
INNER JOIN SJZX.T_BZKS s on s.XH = c.XGH AND to_date(s.SJBYSJ,‘yyyy-MM-dd
HH24:mi:ss’)>sysdate
GROUP BY b.zdmc
ORDER BY je desc
Aug. 5, 2026
1、官网下载最新版的solr
官网地址:https://solr.apache.org/downloads.html
上传压缩包到服务器,解压压缩包将解压后的文件下移动到自己的目录下
tar-zxvf solr-8.11.2.tgz
mv solr-8.11.2 /usr/local/
2、solr单机服务启动
增加solr用户以及solr组
cd 至solr文件夹下进入到bin目录启动服务默认IP为8983 调整防火墙IP
groupadd solr
useradd solr -G solr
chown -R solr.solr /usr/local/solr-8.11.2
cd /usr/local/solr-8.11.2
./bin/solr start -force #启动服务
新建core
1、复制configsets/_default/conf 到新建的core目录下 pe_book为新建的core
cd ..
cd ..
cp -rf solr-8.10.1/server/solr/configsets/_default/conf solr-8.10.1/server/solr/pe_book/
或者
cp -rf /usr/local/solr-8.10.1/server/solr/configsets/_default/conf /usr/local/solr-
8.10.1/server/solr/pe_book/
2、新建core
三、中文分词插件安装
1、solr8 自带分词工具
在slor的 solr-8.10.1/contrib/analysis-extras/lucene-libs 目录下找到lucene-analyzers-smartcn-8.10.1.jar cp 到 webapp
路径的lib 下路径为 solr-8.10.1/server/solr-webapp/webapp/WEB-INF/lib
配置文件managed-schema 增加配置
大抵命令原理是这样得
cp contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-8.10.1.jar server/solr-
webapp/webapp/WEB-INF/lib/
image.png
cd /usr/local/solr-8.10.1/server/solr/pe_book/conf/
如果你找不到managed-schema在哪,可以使用以下命令进行查询
find /usr/local/ -type f -name “managed-schema”
Aug. 5, 2026
错误内容:
Could not execute ruok towards ZK host xxx:2181. Add this line to the ‘zoo.cfg’ configuration file on each zookeeper
node: ‘4lw.commands.whitelist=mntr,conf,ruok’. See also chapter ‘Setting Up an External ZooKeeper Ensemble’ in the
Solr Reference Guide.
其中xxx是主机名或IP地址
解决方法:
就是按提示里面说的,在zoo.cfg里面添加一行4lw.commands.whitelist=mntr,conf,ruok
vim zookeeper/conf/zoo.cfg
在末尾加入一行:
4lw.commands.whitelist=mntr,conf,ruok
保存后退出,然后重启ZooKeeper:
zkServer.sh restart
Aug. 5, 2026
ERROR: “javax.security.auth.login.LoginException: Cannot
locate KDC” while testing Kafka connection in Application
Integration.
此问题的原因之一是连接无法找到 krb5.conf/krb5.ini 文件,或者无法在代理上访问该文件。
上传krb5.conf
Aug. 5, 2026
启动kafka报错:
/home/app/kafka/kafka_2.12-2.4.0/bin/kafka-run-class.sh: 第 309 行:exec: java: 未找到
查了相关资料,分析可能是Kafka默认路径与我实际的路径不一致导致的。
解决:
ln -s /usr/local/jdk1.8.0_202/bin/java /usr/bin/java
结束。
Aug. 5, 2026
前置条件:服务器及安装情况
hostnameprincipal
192.168.2.123db-123kerberos
zookeeper、kafkakafka/db-124@DB-123.COM
zookeeper、kafkakafka/db-125@DB-123.COM
zookeeper、kafkakafka/db-126@DB-123.COM
java version 1.8.0_241
zookeeper 版本:zookeeper-3.4.12 安装路径 /usr/local/kafka_zk/zookeeper-3.4.12
kafka 版本:kafka_2.12-2.3.1 安装路径 /usr/local/kafka_zk/kafka_2.12-2.3.1
配置文件路径: /usr/local/kafka_zk/config, 包括:
kafka124.keytab kafka与zookeeper所需的principal(两个principal放在了一起)
kafka.jaas kafka的jaas文件
ker.pro kafka的consumer与producer所需的认证文件
zookeeper.jaas zookeeper的jaas文件
一、安装kerberos服务
请参考Kerberos认证原理与环境部署
二、创建principal导出keytable文件以及其他相关的配置
三台服务器分别按照前置条件修改hostname与hosts
分别添加san’taisantai服务器的principal并生成ketable
将keytable文件放到三台服务器中对应的服务器的指定的位置/usr/local/kafka_zk/config下
三、部署zookeeper并开启kerberos
分别在三台服务器做以下配置,注意相关地址的修改,以下以db-124为例
3.1、修改zoo.cfg
添加以下安全相关的配置追加下文
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
#完整配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/kafka_zk/zookeeper-3.4.12/data
clientPort=2181
server.124=db-124:2888:3888
server.125=db-125:2888:3888
server.126=db-126:2888:3888
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
3.2、在conf目录创建java.env文件,添加以下内容
export JVMFLAGS="-
Djava.security.auth.login.config=/usr/local/kafka_zk/config/zookeeper.jaas"
3.3、在/usr/local/kafka_zk/config目录创建zookeeper.jaas文件
Server{
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="/usr/local/kafka_zk/config/kafka124.keytab"
principal=“zookeeper/db-124@DB-123.COM ”
userTicketCache=false;
};
Client{
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
Aug. 5, 2026
集群环境:
节点名ip地址OS版本部署服务broker信息
kafka01192.168.96.10CentOS Linux release 7.9.2009(Core)jdk、zookeeper、kafka
broker :0
kafka02192.168.96.11CentOS Linux release 7.9.2009(Core)jdk、zookeeper、kafka
broker :1
kafka03192.168.96.12CentOS Linux release 7.9.2009(Core)jdk、zookeeper、kafka
broker :2
软件版本:
jdk 1.8版本: https://www.oracle.com/java/technologies/downloads/#java8
zookeeper 3.7.0版本: https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-
zookeeper-3.7.0-bin.tar.gz
kafka 2.13-3.1.0版本: https://dlcdn.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz
开始部署:
一、部署jdk
解压并重命名服务
cd /opt/software/
tar -zxvf jdk-8u321-linux-x64.tar.gz
mv jdk1.8.0_321/usr/local/jdk1.8.0
添加环境变量
vi /etc/profile
在文件尾部追加以下内容
exportJAVA_HOME=/usr/local/jdk1.8.0
exportJRE_HOME=${JAVA_HOME}/jre
exportCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
exportPATH=${JAVA_HOME}/bin:$PATH
重载环境变量,使新配置生效
source /etc/profile
验证
java -version
继续按照以上方法部署另外2台服务器
二、部署zookeeper
在线下载安装包
cd /opt/software/
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-
bin.tar.gz –no-check-certificate
解压并重命名服务
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
mv apache-zookeeper-3.7.0-bin /usr/local/zookeeper-3.7.0
创建zookeeper服务的data目录
mkdir /usr/local/zookeeper-3.7.0/data
创建myid文件(zookeeper用于惟一标识自己的id)
echo 1>/usr/local/zookeeper-3.7.0/data/myid
生成zoo.cfg配置文件
cp /usr/local/zookeeper-3.7.0/conf/zoo_sample.cfg /usr/local/zookeeper-3.7.0/conf/zoo.cfg
修改zoo.cfg配置文件
vi /usr/local/zookeeper-3.7.0/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-3.7.0/data
clientPort=2181
server.1=192.168.96.10:2888:3888
server.2=192.168.96.11:2888:3888
server.3=192.168.96.12:2888:3888
使用scp同步发送到另外2台服务器
scp -r /usr/local/zookeeper-3.7.0 root@192.168.96.11 :/usr/local/
scp -r /usr/local/zookeeper-3.7.0 root@192.168.96.12 :/usr/local/
配置另外2个节点的myid文件
192.168.96.11服务器
echo 2>/usr/local/zookeeper-3.7.0/data/myid
192.168.96.12服务器
Aug. 5, 2026
导读
我公司有一个项目现场那边说zk有漏洞,所以我们就打算部署一套不依赖zookeeper的kafka高版本集群,也就是Kraft模
式。
Apache Kafka3.0.0的发布为kafka彻底去掉Zookeeper铺平了道路,Kafka Raft 支持元数据主题的快照以及自我管理,
而3.1.0版本在2022.1.24发布,对3.0.0版本又修改了。我们先来初步体验一下KRaft的入门。
KRaft简介
Kafka的共识机制KRaft,仍然处于预览机制。未来KRaft将作为Apache Kafka的内置共识机制将取代Zookeeper。该模
式在2.8版本当中就已经发布了体验版本,在3.X系列中KRaft是一个稳定release版本。
KRaft运行模式的kafka集群,不会将元数据存储在zookeeper中,即部署新集群的时候,无需部署zk集群,因为Kafka将
元数据存储在Controller节点的KRaft Quorum中。KRAFT可以带来很多好处,比如可以支持更多的分区,更快速的切换
Controller,也可以避免Controller缓存的元数据和zk存储的数据不一致带来的一系列问题。
KRaft架构
首先来看一下KRaft在系统架构层面和之前的版本有什么区别。KRaft模式提出来去zookeeper后的kafka整体架构入下图
是前后架构图对比:
在当前架构中,一个kafka集群包含多个broker节点个一个ZooKeeper集群。我们在这张图中描绘了一个典型的集群结
构:4个broker节点个3个ZooKeeper节点。kafka集群的Controller(橙色)在被选中后,会从ZooKeeper中加载他的状
态。Controller指向其他Broker节点的箭头表示Controller在通知其他briker发生了变更,如Leaderanddisr和
Updatemetdata请求。
在新的架构中,3个Controller节点代替三个ZooKeeper节点。控制器节点和Broker节点在不同的进程中。Controller节点
中会选择一个成为Leader(橙色)。新架构中,控制器不会想Broker推送更新,而是Broker从这个Controller Leader拉
取元数据的更新信息。
注意:尽管Controller进程在逻辑上与Broker进程是分离的,但他们不需要再物理上分离,即在某些情况下,部分所有
Controller进程和Broker进程可以使同一个进程,即一个broker节点即是Broker也是Controller。另外在同一个节点上可
以运行两个进程,一个是Controller进程,一个是broker进程,这相当于在较小的及群众。Zookeeper进程可以想Kafka
Broker一样部署在相同的节点上。
部署
首先目前官方页面上并没有集群搭建文档。我们下载安装包,查看config/kraft下的README.md文件。可以看到详细说
明。
根据说明,这里我搭建Kraft模式的kafka集群。这里我用的是3.1版本
这里我准备三台机器:
HOSTNAMEIPOS
node2192.168.0.113centos7.9
node3192.168.0.114centos7.9
node4192.168.0.115centos7.9
下载
官网下载:Apache Kafka
或者我提供的安装包:kafka_2.13-3.1.0.tgz
上传服务器并解压
这里我在node2机器上传到自己的目录下/home/guohao
cd /home/guohao
#解压
tar -zxvf kafka_2.13-3.1.0.tgz
cd /home/guohao/kafka_2.13-3.1.0/
配置server.properties
cd config/kraft/
vi server.properties
节点角色
process.roles=broker,controller
#节点ID,和节点所承担的角色想关联
node.id=1
集群地址
controller.quorum.voters=1@192.168.0.113 :9093,2@192.168.0.114:9093,3@192.168.0.115:9093
#本机节点
listeners=PLAINTEXT://192.168.0.113:9092,CONTROLLER://192.168.0.113:9093
这里我修改了日志文件的路径,默认是在/tmp目录下的
log.dirs=/home/guohao/kafka_2.13-3.1.0/kraftlog/kraft-combined-logs
Process.Roles
每个Kafka服务器现在都有一个新的配置项,叫做Process.Roles, 这个参数可以有以下值:
如果Process.Roles = Broker, 服务器在KRaft模式中充当 Broker。
Aug. 5, 2026
ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /brokers/ids
at org.apache.zookeeper.KeeperException.create(KeeperException.java:120)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
at kafka.zookeeper.AsyncResponse.maybeThrow(ZooKeeperClient.scala:566)
at kafka.zk.KafkaZkClient.createRecursive(KafkaZkClient.scala:1729)
at kafka.zk.KafkaZkClient.makeSurePersistentPathExists(KafkaZkClient.scala:1627)
at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1(KafkaZkClient.scala:1619)
at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1$adapted(KafkaZkClient.scala:1619)
at scala.collection.immutable.List.foreach(List.scala:431)
at kafka.zk.KafkaZkClient.createTopLevelPaths(KafkaZkClient.scala:1619)
at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:492)
at kafka.server.KafkaServer.startup(KafkaServer.scala:201)
at kafka.Kafka$.main(Kafka.scala:109)
at kafka.Kafka.main(Kafka.scala)
已解决不能配置
zookeeper.set.acl=true
Aug. 5, 2026
一、概述
Kerberos是为TCP/IP网络系统设计的可信的第三方认证协议,用于身份认证。网络上的Keberos服务
基于DES对称加密算法,但也可以用其他算法替代。因此,Keberos是一个在许多系统中获得广泛应
用的认证协议。Keberos最初是美国麻省理工学院(MIT)为Athena项目开发的。
官网:https://www.kerberos.org/
官方文档:http://web.mit.edu/kerberos/krb5-current/doc/
1)应用场景
Kerberos采用客户端/服务器(CS)结构与DES加密技术,并且能够进行相互认证,即客户端和服务
器端均可对对方进行身份认证,是一种应用对称密钥体制进行密钥管理的系统。可以用于防止窃听、
防止replay攻击、保护数据完整性等场合。
2)功能特性
1.安全性
Kerberos提供双向认证,不仅Server可以对Client 进行认证,Client也能对Server进行认证。Server
对Client认证成功之后,通过返回Client发送的时间戳,向Client提供验证自己身份的手段。
1.可靠性
认证服务是其他服务的基础,服务认证过程有助于提升整个系统的可用性和高可靠性。
1.可扩展性
KDC(秘钥分配中心)是秘钥体系的重要部分,旨在减少密钥体制所固有的交换密钥时所面临的风
险。用户可以根据需要扩展多个KDC。
1.开放性
Kerberos已经成为计算机领域一个被广泛接受的标准,所以使用Kerberos可以轻松实现不同平台之
间的互操作。
二、Kerberos中的核心概念
Kerberos中有以下一些概念需要了解:
KDC:密钥分发巾心,负责管理发放票据,记录授权。
Realm: Kerberos管理领域的标识。
principal:Kerberos 下的用户可以称为 Principal,当每添加一个用户或服务的时候都需要向kdc
添加一条principal, principal的形式为:主名称/实例名@领域名。
主名称:主名称可以是用户名或服务名,表示是用于提供各种网络服务(如hdfs、yam,、hive)
的主体。
实例名:实例名简单理解为主机名。
keytab文件:存储了用户的加密密码。常用这种方式认证。
1)用户principal
用户principal的形式:
Name[/Instance]@REALM
其中Instance是可选的,通常用于更好地限定用户的类型。比如,一个管理员用户通常会有admin
instance,即Name/admin@REALM。
下面是指代用户的一些principal的例子:
pippo@EXAMPLE.COM
admin/admin@EXAMPLE.COM
cnicetoupp/admin@EXAMPLE.COM
2)服务principal
用户principal的形式:
Service/Hostname@REALM
第一部分是service的名字,比如imap, AFS, ftp. 通常’host’这个名字被用于指明对一台机器的
通用的访问(telnent, rsh, ssh)。
第二个component是提供这个服务的机器的全限定域名(FQDN)。这个component跟DNS对应用
服务器的IP地址进行逆向解析后得到的主机名。
下面是指代服务principal的例子:
imap/hadoop-node1@EXAMPLE.COM
host/hadoop-node1@EXAMPLE.COM
afs/hadoop-node1@EXAMPLE.COM
3)Ticket
Ticket分两种:
Ticket Granting Ticket,TGT:这是KDC中的Authentication Server(简称AS)产生的,TGT是
向Ticket Granting Server(TGS)用于表明自己真实身份的东西。
Service Ticket:这是KDC中的Ticket Granting Server(简称TGS)产生的,Service Ticket 是用于
向应用服务器表明自己身份的东西
三、Kerberos架构与工作原理
AS_REQ是在初始化一个用户(kinit)的时候发出的用户认证请求,这个请求是发给KDC中的
Authentication Server (AS);
AS_REP是 AS回复给client的信息,其中包括TGT (用TGS secret key加密过的) and the session key
(用发请求的用户的secret key加密过的);
TGS_REQ是client为了一个service ticket向Ticket Granting Server (TGS)的信息. 其中包括上一条信息
中获得的TGT (用TGS secret key加密过的) ,一个客户端产生的一个authenticator(用session key加
密过的).
TGS_REP是TGS回复给TGS_REQ的信息. 其中包括service ticket(用appservice的secret key加密
过),和一个TGS产生的service sessinon key(之前AS产生的一条session key给加密过的)
AP_REQ是一条客户端发给appserver的访问服务的请求,其中包括service ticket和一个authenticator
(使用TGS产生的service session key 加密过的)
AP_REP是appserver回复给client的一条信息,证明这个appserver确实是客户端希望访问的server。
不过这条信息也不一定总是要回复的。比如当客户端和appserver需要相互认证的时候,客户端向
appserver发出请求,这个时候就不需要回复信息。
Aug. 5, 2026
kinit: Cannot contact any KDC for realm ‘EXAMPLE.COM’ while
getting initial credentials
客户端和KDC之间的网络问题
krb5.conf中的KDC详细信息不正确
Aug. 5, 2026
原来配置:
quorum.auth.enableSasl=true
quorum.auth.learnerRequireSasl=true
quorum.auth.serverRequireSasl=true
quorum.auth.learner.saslLoginContext=QuorumLearner
quorum.auth.server.saslLoginContext=QuorumServer
quorum.auth.kerberos.servicePrincipal=zookeeper/db-126
quorum.cnxn.threads.size=20
查看官方文档:https://cwiki.apache.org/confluence/display/ZOOKEEP
ER/Server-Server+mutual+authentication
支持授权:
如果主体名称采用以下格式,ZooKeeper 服务器将支持授权,并在zoo.cfg文件中的仲裁服务器主体中
servicename/fully.qualified.domain.name@EXAMPLE.COM 配置“ ”通配符,如下所示,_HOST
quorum.auth.kerberos.servicePrincipal= servicename/_HOST
现在,QuorumServer 将对配置的授权主机进行授权检查。此授权主机列表将使用zoo.cfg文件中的集成服务器详细信息
进行准备。在 LE 期间,QuorumLearner 会向 QuorumServer 发送一个认证包。现在,QuorumServer 将检查连接的
QuorumLearner 的主机名是否存在于授权主机中。如果不存在,则连接的对等方无权加入此集合,请求将立即被拒绝。
例如,zoo.cfg包含以下服务器详细信息。现在,只FQDN1, FQDN2, FQDN3允许主机加入 ZooKeeper 集群。所有其他将被
拒绝为未经授权的连接。
动物园.cfg
server.1=FQDN1:port:port
server.2=FQDN2:port:port
server.3=FQDN3:port:port
修改后
quorum.auth.enableSasl=true
quorum.auth.learnerRequireSasl=true
quorum.auth.serverRequireSasl=true
quorum.auth.learner.saslLoginContext=QuorumLearner
quorum.auth.server.saslLoginContext=QuorumServer
quorum.auth.kerberos.servicePrincipal=zookeeper/_HOST
quorum.cnxn.threads.size=20
Aug. 5, 2026
kafka启动报错
问题1
[Controller id=11, targetBrokerId=11] Failed authentication with nj03-ns-passport-201611-c2c-m12-
09.nj03.baidu.com/10.194.202.17 (Authentication failed: Invalid username or password)
(org.apache.kafka.common.network.Selector)
原因: SASL_PLAINTEXT认证时用户密码验证不通过,即 kafka_server_jaas.conf 文件中KafkaServer 模块 Broker与
Broker之间sasl用户密码验证不通过,如下:
username=“kafkacluster1”
password=“kafkaclusterpasswd”
user_kafkacluster=“kafkaclusterpasswd”
复制代码
问题2
ERROR [KafkaApi-11] Error when handling request: clientId=11, correlationId=0,
api=UPDATE_METADATA, version=6, body=
{controller_id=11,controller_epoch=1,broker_epoch=4294970758,topic_states=[],live_brokers=
[{id=11,endpoints=
[{port=8092,host=10.194.202.17,listener=SASL_PLAINTEXT,security_protocol=2,_tagged_fields=
{}}],rack=null,_tagged_fields={}}],_tagged_fields={}} (kafka.server.KafkaApis)
org.apache.kafka.common.errors.ClusterAuthorizationException: Request Request(processor=0,
connectionId=10.194.202.17:8092-10.194.202.17:59100-0,
session=Session(User:kafkacluster,/10.194.202.17), listenerName=ListenerName(SASL_PLAINTEXT),
securityProtocol=SASL_PLAINTEXT, buffer=null) is not authorized
原因: kafka_server_jaas.conf 文件中KafkaServer 模块 Broker与Broker之间sasl用户密码验证正确,但acls 授权没通过。
需要添加超级用户,超级用户不需要acls授权,在server.properties文件中添加kafkacluster用户,如下:
super.users=User:admin;User:kafkacluster
复制代码
kafka 客户端(包括consumer和producer)连接报错
问题1
[2020-04-17 16:17:20,986] WARN [Consumer clientId=consumer_01, groupId=c1] Bootstrap broker
10.194.202.17:8092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
[2020-04-17 16:17:20,989] ERROR Error processing message, terminating consumer process:
(kafka.tools.ConsoleConsumer$)
org.apache.kafka.common.errors.SaslAuthenticationException: Authentication failed: Invalid username
or password
原因:SASL_PLAINTEXT认证时用户密码验证不通过,即 kafka_server_jaas.conf 文件中KafkaServer 模块 client与
Broker之间sasl用户密码验证不通过。检查如下用户名密码:
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required
username=‘consumer’ password=‘consumerpasswd’;
复制代码
问题2
[2020-04-17 16:17:01,166] WARN [Consumer clientId=consumer_01, groupId=c1] Error while fetching
metadata with correlation id 2 : {test.1=TOPIC_AUTHORIZATION_FAILED}
(org.apache.kafka.clients.NetworkClient)
[2020-04-17 16:17:01,172] ERROR [Consumer clientId=consumer_01, groupId=c1] Topic authorization
failed for topics [test.1] (org.apache.kafka.clients.Metadata)
[2020-04-17 16:17:01,174] ERROR Error processing message, terminating consumer process:
(kafka.tools.ConsoleConsumer$)
org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [test.1]
原因:SASL_PLAINTEXT认证时用户密码验证正确,但acls 授权没通过,即此用户没有访问此topic(test.1)的权限,请联
系管理员对用户授权
作者:ponylee
链接:https://juejin.cn/post/7129758240719503374
来源:稀土掘金
Aug. 5, 2026
首先创建Consumer需要的配置信息,最基本的有五个信息:
Kafka集群的地址。
发送的Message中Key的序列化方式。
发送的Message中Value的序列化方式。
指定Consumer Group。
指定拉取Message范围的策略。
Properties properties =newProperties();
properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,“IP:Port”);
properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class.getName());
properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class.getName());
properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG,“consumer_group_1”);
properties.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“latest”);// earliest,
none
然后传入上面实例化好的配置信息,实例化Consumer:
KafkaConsumer<String, String> consumer =newKafkaConsumer<String, String>(properties);
然后通过Consumer的方法订阅Topic:
consumer.subscribe(Arrays.asList(“first_topic”));
最后获取Topic里的Message,将Message信息输出到日志中:
while(true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for(ConsumerRecord<String, String> record : records) {
logger.info(“Key: " + record.key() + “, Value: " + record.value());
logger.info(“Partition: " + record.partition() + “, Offset: " + record.offset());
}
}
Consumer的方法可以设置获取数据的时间间隔,同时回忆一下在之前
Consumer章节的Consumer Poll Options小节中,说过关于Consumer获取Message的四个配置项,都
可以在Properties里进行设置。
启动Java Consumer后,在控制台可以看到如下信息:
[main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka version : 2.0.0
[main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka commitId
: 3402a8361b734732
[main] INFO org.apache.kafka.clients.Metadata - Cluster ID: 4nh_0r5iQ_KsR_Fzf1HTGg
[main] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - [Consumer
clientId=consumer-1, groupId=consumer_group_1] Discovered group coordinator
IP:9092 (id: 2147483647 rack: null)
[main] INFO org.apache.kafka.clients.consumer.internals.ConsumerCoordinator - [Consumer
clientId=consumer-1, groupId=consumer_group_1] Revoking previously assigned partitions []
[main] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - [Consumer
clientId=consumer-1, groupId=consumer_group_1] (Re-)joining group
[main] INFO org.apache.kafka.clients.consumer.internals.AbstractCoordinator - [Consumer
clientId=consumer-1, groupId=consumer_group_1] Successfully joined group with
generation 1
[main] INFO org.apache.kafka.clients.consumer.internals.ConsumerCoordinator - [Consumer
clientId=consumer-1, groupId=consumer_group_1] Setting newly assigned partitions
[first_topic-0, first_topic-1, first_topic-2]
[main] INFO org.apache.kafka.clients.consumer.internals.Fetcher - [Consumer
clientId=consumer-1, groupId=consumer_group_1] Resetting offset for partition
first_topic-0 to offset 23.
[main] INFO org.apache.kafka.clients.consumer.internals.Fetcher - [Consumer
clientId=consumer-1, groupId=consumer_group_1] Resetting offset for partition
first_topic-1 to offset 24.
[main] INFO org.apache.kafka.clients.consumer.internals.Fetcher - [Consumer
clientId=consumer-1, groupId=consumer_group_1] Resetting offset for partition
first_topic-2 to offset 21.
在上面的信息中,可以看到
这句话,说明当前这个Consumer会获取这个Topic中全部Partition中的
Message。
如果我们再启动一个Consumer,这个Consumer和第一个在同一个组里,看看会有什么输出信息:
[main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka version : 2.0.0
[main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka commitId
: 3402a8361b734732
[main] INFO org.apache.kafka.clients.Metadata - Cluster ID: 4nh_0r5iQ_KsR_Fzf1HTGg
Aug. 5, 2026
[2023-04-27 16:35:37,701] INFO [ZooKeeperClient] Connected.
(kafka.zookeeper.ZooKeeperClient)
[2023-04-27 16:35:37,706] ERROR An error: (java.security.PrivilegedActionException:
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid
credentials provided (Mechanism level: Server not found in Kerberos database (7) -
LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member’s received SASL
token. Zookeeper Client will go to AUTH_FAILED state.
(org.apache.zookeeper.client.ZooKeeperSaslClient)
[2023-04-27 16:35:37,707] ERROR SASL authentication with Zookeeper Quorum member failed:
javax.security.sasl.SaslException: An error: (java.security.PrivilegedActionException:
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid
credentials provided (Mechanism level: Server not found in Kerberos database (7) -
LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member’s received SASL
token. Zookeeper Client will go to AUTH_FAILED state. (org.apache.zookeeper.ClientCnxn)
[2023-04-27 16:35:37,707] ERROR [ZooKeeperClient] Auth failed.
(kafka.zookeeper.ZooKeeperClient)
[2023-04-27 16:35:37,739] ERROR Fatal error during KafkaServer startup. Prepare to
shutdown (kafka.server.KafkaServer)
org.apache.zookeeper.KeeperException$AuthFailedException: KeeperErrorCode = AuthFailed
for /consumers
at org.apache.zookeeper.KeeperException.create(KeeperException.java:126)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
at kafka.zookeeper.AsyncResponse.maybeThrow(ZooKeeperClient.scala:499)
at kafka.zk.KafkaZkClient.createRecursive(KafkaZkClient.scala:1449)
at kafka.zk.KafkaZkClient.makeSurePersistentPathExists(KafkaZkClient.scala:1371)
at kafka.zk.KafkaZkClient$$anonfun$createTopLevelPaths$1.apply(KafkaZkClient.scala:1363)
at kafka.zk.KafkaZkClient$$anonfun$createTopLevelPaths$1.apply(KafkaZkClient.scala:1363)
at scala.collection.immutable.List.foreach(List.scala:392)
at kafka.zk.KafkaZkClient.createTopLevelPaths(KafkaZkClient.scala:1363)
at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:373)
at kafka.server.KafkaServer.startup(KafkaServer.scala:202)
at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)
at kafka.Kafka$.main(Kafka.scala:75)
at kafka.Kafka.main(Kafka.scala)
[2023-04-27 16:35:37,740] INFO shutting down (kafka.server.KafkaServer)
[2023-04-27 16:35:37,744] WARN (kafka.utils.CoreUtils$)
java.lang.NullPointerException
at kafka.server.KafkaServer$$anonfun$shutdown$5.apply$mcV$sp(KafkaServer.scala:579)
at kafka.utils.CoreUtils$.swallow(CoreUtils.scala:86)
at kafka.server.KafkaServer.shutdown(KafkaServer.scala:579)
at kafka.server.KafkaServer.startup(KafkaServer.scala:329)
at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)
at kafka.Kafka$.main(Kafka.scala:75)
Aug. 5, 2026
Could not find a ‘KafkaClient’ entry in the JAAS configuratio
n. System property ‘java.security.auth.login.config’ is
System.setProperty(“java.security.auth.login.config”, jaasPath);
pro.put(“sasl.jaas.config”, “com.sun.security.auth.module.Krb5LoginModule required " +
表示如果同时设置了这两个,则启用sasl.jaas.config。所以需要检查是哪个生效了,
Aug. 5, 2026
Error while fetching metadata with correlation id 47 :
{test1=LEADER_NOT_AVAILABLE}
Error while fetching metadata with correlation id :
{LEADER_NOT_AVAILABLE}
表示无法识别kafka hostname
正确处理姿势
1、修改server.properties如下,目的是让kafka监听的到红框两个都要写
vi /opt/kafka/kafka/config/server.properties
同时一定写正确主机名称,切记!!
我的之前写成hostname,正确的是host.name !注意一定要多看配置中的
注释和小心谨慎。否则后期的排除bug真心是个力气活!!!


Aug. 5, 2026
Exception in thread “main” org.apache.kafka.common.errors.TopicAuthorizationException:
Not authorized to access topics: [demo1]
原因是该消费者组没有消费主题的权限,即 ACL 操作,当然换成 admin 是不存在这个问题的
Aug. 5, 2026
问题#
有个需求,需要频繁seek到指定partition的指定offset,然后poll,且只poll一次,目的是为了快速将指定
offset的消息拉取出来。
通常的poll写法是,将poll逻辑放在死循环里,第一次拉不到,第二次继续。如果offset上有消息,就一定
能消费到:
Copy
consumer.subscribe(“topics”);
while(true){
records = consumer.poll(Duration.ofSeconds(1));
// do something with records
}
但我使用的是consumer.assign()方法,而不是subscribe()。因为要灵活指定分区,用subscribe的话,触
发rebalance很麻烦。代码如下:
Copy
public ConsumerRecord<String, String> seekAndPoll(String topic, int partition, long offset) {
TopicPartitiontp=newTopicPartition(topic, partition);
consumer.assign(Collections.singleton(tp));
System.out.println(“assignment:” + consumer.assignment()); // 这里是有分配到分区的
consumer.seek(tp, offset);
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100))
if(records.isEmpty()){
// 大概率拉取不到消息,进入此分支
returnnull;
} else {
return records.iterator().next();
}
}
由于我只poll一次,这就要求必须一次拉到消息。从现象上看,感觉是在seek之后,kafka有些metadata
更新之类的操作未执行完毕,此时poll就拉不到消息。
我在StackOverflow上也搜到了这个问题(java - Kafka Cluster sometimes returns no records during see
k and poll - Stack Overflow),但是没有答案。在解决了这个问题后,我添加了一个答案。
分析#
猜测1 新旧poll方法的区别#
在测试时,发现有时使用旧版本的方法有效,使用新版本的方法
无效。会不会跟这个有关?(调式发现无关,不感兴趣的可跳过这一节)
两个poll方法签名如下:
Copy
@Deprecated
public ConsumerRecords<K, V> poll(finallong timeoutMs) {
return poll(time.timer(timeoutMs), false);
}
Aug. 5, 2026
Kafka连接服务器出现:Connection to node 1
(localhost/127.0.0.1:9092) could not be established.「建议
收藏」
解决问题
修改server.properties的两行默认配置,即可通过外网连接服务器Kafka,问题解决:
允许外部端口连接
listeners=PLAINTEXT://0.0.0.0:9092
外部代理地址
advertised.listeners=PLAINTEXT://自己ip:9092
Aug. 5, 2026
[2022-11-20 21:23:29,448] ERROR SASL authentication failed using login context ‘Client’
with exception: {} (org.apache.zookeeper.client.ZooKeeperSaslClient)
javax.security.sasl.SaslException: Error in authenticating with a Zookeeper Quorum
member: the quorum member’s saslToken is null.
at org.apache.zookeeper.client.ZooKeeperSaslClient.createSaslToken(ZooKeep
[2022-11-20 21:23:29,487] ERROR Fatal error during KafkaServer startup. Prepare to
shutdown (kafka.server.KafkaServer)
org.apache.zookeeper.KeeperException$AuthFailedException: KeeperErrorCode = AuthFailed
for /consumers
at org.apache.zookeeper.KeeperException.create(KeeperException.java:126)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
at kafka.zookeeper.AsyncResponse.maybeThrow(ZooKeeperClient.scala:560)
at kafka.zk.KafkaZkClient.createRecursive(KafkaZkClient.scala:1610)
at kafka.zk.KafkaZkClient.makeSurePersistentPathExists(KafkaZkClient.scala:1532)
at kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1(KafkaZkClient.scala:1524)
at
kafka.zk.KafkaZkClient.$anonfun$createTopLevelPaths$1$adapted(KafkaZkClient.scala:1524)
at scala.collection.immutable.List.foreach(List.scala:392)
at kafka.zk.KafkaZkClient.createTopLevelPaths(KafkaZkClient.scala:1524)
at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:388)
at kafka.server.KafkaServer.startup(KafkaServer.scala:207)
at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)
at kafka.Kafka$.main(Kafka.scala:84)
at kafka.Kafka.main(Kafka.scala)
[2022-11-20 21:23:29,489] INFO shutting down (kafka.server.KafkaServer)
[2022-11-20 21:23:29,491] INFO [ZooKeeperClient Kafka server] Closing.
(kafka.zookeeper.ZooKeeperClient)
[2022-11-20 21:23:29,496] INFO [ZooKeeperClient Kafka server] Closed.
(kafka.zookeeper.ZooKeeperClient)
[2022-11-20 21:23:29,498] INFO shut down completed (kafka.server.KafkaServer)
[2022-11-20 21:23:29,498] ERROR Exiting Kafka. (kafka.server.KafkaServerStartable)
[2022-11-20 21:23:29,505] INFO shutting down (kafka.server.KafkaServer)
有可能是因为 kafka 集群中节点信息与zookeeper中存储的不一致导致的,删除所有节点数据重启
Aug. 5, 2026
git还原到之前某个版本,本地和远程都还原
命令行操作:
第一步: git log 查看之前的commit的id,找到想要还原的版本
第二步: git reset –hard 44bd896bb726be3d3815f1f25d738a9cd402a477 还原到之前的某个版本
第三步: git push -f origin master 强制push到远程
作者:李大瑞
来源:CSDN
原文:https://blog.csdn.net/li295214001/article/details/71194564
版权声明:本文为博主原创文章,转载请附上博文链接!
Aug. 5, 2026
1、默认安装git与idea
2、打开idea的git项目
3、在setting的
4、可以配置github选项但是我没成功,可以不配置此项。
5、打开gitbash 检查有无生成密钥,这两个命令就是检查是否已经存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经
存在,那么你可以跳过步骤6,直接进入步骤7。
命令:
6、创建一个 SSH key ,
命令:
代码参数含义:
-t 指定密钥类型,默认是 rsa ,可以省略。
-C 设置注释文字,比如邮箱。
-f 指定密钥文件存储文件名。
以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,如:
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/you/.ssh/id_rsa): [Press enter]
当然,你也可以不输入文件名,使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个秘钥文件。
接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码,而不是github管理者的密码),
当然,你也可以不输入密码,直接按回车。那么push的时候就不需要输入密码,直接提交到github上了,如:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
接下来,就会显示如下代码提示,如:
Your identification has been saved in /c/Users/you/.ssh/id_rsa.
Aug. 5, 2026
因为没有应用sshpass 的形式操作文件;以后应用的scp 进行文件的操作;可能会提醒
报错:
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
sudo: no tty present and no askpass program specified
Cleaning up project directory and file based variables
00:00
ERROR: Job failed: exit status 1
起因:
因为尝试应用sudo运行命令引起的,然而调用用户没有被受权应用 sudo
解决:
关上 sudoers 文件vim /etc/sudoers ;将以下内容增加到文件底部
gitlab-runner ALL=(ALL) NOPASSWD: ALL
Aug. 5, 2026
我每天使用 Git ,但是很多命令记不住。
一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐
怕要记住60~100个命令。
下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
一、新建代码库
在当前目录新建一个Git代码库
$ git init
新建一个目录,将其初始化为Git代码库
$ git init [project-name]
下载一个项目和它的整个代码历史
$ git clone [url]
二、配置
Git的设置文件为,它可以在用户主目录下(全局配置),也可以在
项目目录下(项目配置)。
显示当前的Git配置
$ git config –list
编辑Git配置文件
$ git config -e [–global]
设置提交代码时的用户信息
$ git config [–global] user.name “[name]”
$ git config [–global] user.email “[email address]”
三、增加/删除文件
添加指定文件到暂存区
$ git add [file1][file2]…
添加指定目录到暂存区,包括子目录
$ git add [dir]
添加当前目录的所有文件到暂存区
$ git add .
Aug. 5, 2026
命令用于切换到某个快照。
命令用于展示某个快照的所有代码变动。
命令查看整个版本历史(命令只显示当前分支的变动,没提交到分支的不显示)
Aug. 5, 2026
一、撤销提交
一种常见的场景是,提交代码以后,你突然意识到这个提交有问题,应该撤
销掉,这时执行下面的命令就可以了。
$ git revert HEAD
上面命令的原理是,在当前提交后面,新增一次提交,抵消掉上一次提交导
致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代
码的风险。
命令只能抵消上一个提交,如果想抵消多个提交,必须在命令行依
次指定这些提交。比如,抵消前两个提交,要像下面这样写。
$ git revert [倒数第一个提交][倒数第二个提交]
命令还有两个参数。
–no-edit:执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息。
–no-commit:只抵消暂存区和工作区的文件变化,不产生新的提交。
二、丢弃提交
如果希望以前的提交在历史中彻底消失,而不是被抵消掉,可以使用
命令,丢弃掉某个提交之后的所有提交。
$ git reset [last good SHA]
的原理是,让最新提交的指针回到以前某个时点,该时点之后的提交
都从历史中消失。
默认情况下,不改变工作区的文件(但会改变暂存区),参数
可以让工作区里面的文件也回到以前的状态。
$ git reset –hard [last good SHA]
执行命令之后,如果想找回那些丢弃掉的提交,可以使用命
令,具体做法参考这里。不过,这种做法有时效性,时间长了可能找不回
来。
三、替换上一次提交
提交以后,发现提交信息写错了,这时可以使用命令的参数,
可以修改上一次的提交信息。
$ git commit –amend -m “Fixes bug #42”
它的原理是产生一个新的提交对象,替换掉上一次提交产生的提交对象。
这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,不仅
可以修改提交信息,还可以整个把上一次提交替换掉。
四、撤销工作区的文件修改
如果工作区的某个文件被改乱了,但还没有提交,可以用命令找
回本次修改之前的文件。
$ git checkout –[filename]
它的原理是先找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢
复上一次提交的版本。
注意,工作区的文件变化一旦被撤销,就无法找回了。
五、从暂存区撤销文件
如果不小心把一个文件添加到暂存区,可以用下面的命令撤销。
$ git rm –cached [filename]
上面的命令不影响已经提交的内容。
六、撤销当前分支的变化
你在当前分支上做了几次提交,突然发现放错了分支,这几个提交本应该放
到另一个分支。
Aug. 5, 2026
删除一些没有 git add 的文件;
git clean 参数
-n 显示将要删除的文件和目录
-f 删除文件,-df 删除文件和目录
git clean -n
git clean -df
git clean -f
# 删除 untracked files
git clean -f
# 连 untracked 的目录也一起删掉
git clean -fd
# 连 gitignore 的untrack 文件/目录也一起删掉(慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd
Aug. 5, 2026
1、在清华源网站下载安装包
Index of /gitlab-ce/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
2、执行安装命令
rpm -ivh gitlab-ce-14.9.2-ce.0.el8.x86_64.rpm
3.修改配置文件
(1)在虚拟机上打开终端,如果你不是root身份那么打开终端后,首先需要输入:su -(ps:su和-之间
是有空格滴),然后回车;输入你虚拟机的登录密码。哦了,此时你已经是root身份了。
(2)在以上窗口命令行中输入 vim /etc/gitlab/gitlab.rb后(ps:gitlab.rb就是各位小伙伴儿需要修改的文
件),如下图
需要配置以下几个位置,来,跟我做:
第1个位置:配置Gitlab的地址,即上文中我说的ip地址(由于我没给ip映射域名,所以就写的事虚拟机的
ip地址)。如下图:
第2个位置:用鼠标拉动命令行的滚动条,当命令行右下角显示2%(大概这个位置)的时候,你会看到
以下内容
按照图中我的修改,各位小伙伴儿相应的修改成自己的就行。其实就需要修改三行内容就行(有红色字
体的3行),并且这3行的每行开头的#一定要删了,否则就算你修改了,也不能生效的。
总之,改这个3行的意思就是说,配置一个发邮件的邮箱(可以理解为管理员邮箱)。也就是说,在以后
使用gitlab的时候,如果有邮件通知,用哪个邮箱来发邮件。从图中的3行可以看到,有两个配邮箱地址
的地址,一个是发邮件的邮箱,一个是回复邮件时回复到哪个邮箱。一般情况下,这两个地方是的邮箱
是一样的,各位小伙伴儿不要太纠结了。
第3个位置:用鼠标拉动命令行的滚动条,当命令行右下角显示24%(大概这个位置)的时候,你会看到
以下内容,按照下面的例子照猫画虎就行。
这个地方的配置和上一步配邮箱地址是息息相关的。由于上一步我配置发邮件的邮箱是网易的126邮
箱,所以这个地方我的配置是这样的(特别提醒:上图中的‘smtp_password’是邮箱的授权码,不是邮箱
的登录密码)。
(2)执行下面命令让配置生效。
gitlab-ctl reconfigure
sudo gitlab-ctl start # 启动所有 gitlab 组件;
sudo gitlab-ctl stop # 停止所有 gitlab 组件;
sudo gitlab-ctl restart # 重启所有 gitlab 组件;
sudo gitlab-ctl status # 查看服务状态;
sudo gitlab-ctl reconfigure # 从新加载配置文件;
sudo vim /etc/gitlab/gitlab.rb # 修改默认的配置文件;
gitlab-rake gitlab:check SANITIZE=true –trace # 检查gitlab;
sudo gitlab-ctl tail # 查看日志;
4. 配置防火墙
(1)开启防火墙
systemctl status firewalld
systemctl start firewalld
systemctl enable firewalld
(2)开放所需服务,如下是开通ssh, http,https服务.
[root@c7201 gitlab]# firewall-cmd –permanent –add-service ssh
success
[root@c7201 gitlab]# firewall-cmd –permanent –add-service http
Aug. 5, 2026
conda create -n rnaseq #创建conda小环境 - -n 用来指定环境的名称
conda create -n database python=3.7.3 #指定环境中需要带的python的版本
conda activate rnaseq # 启动小环境
conda deactivate #退出小环境111
conda env list / conda info –env #查看共有多少个小环境
conda remove -n python –all #删除conda小环境
conda create -n envname python=3.4 scipy=0.15.0 astroib numpy
conda info –env
conda info -e
conda remove -n python39 –all
conda list ##获取当前环境中已安装的包
conda list -n python39 ##获取指定环境中已安装的包
conda list –explicit > requirements.txt
conda create –name newenv –requirements.txt
conda install –name newenv –file requirements.txt
conda install –offline package.tar
Aug. 5, 2026
下载Miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
清华源
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_24.9.2-0-
Linux-x86_64.sh
安装Miniconda
sh Miniconda3-latest-Linux-x86_64.sh
会强制读取协议协议拉到最后等一会就会弹出安装页面根据提示选择安装就好
Conda常用命令
删除缓存(分别表示删除无用的package,删除无用的tar,删除无用的tar和
cache)
conda clean -p
conda clean -t
conda clean –all
镜像源(设置清华源)
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-
forge/
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
镜像源(设置阿里云源)
conda config –add channels https://mirrors.aliyun.com/anaconda/pkgs/free
conda config –add channels https://mirrors.aliyun.com/anaconda/pkgs/main
镜像源(显示目前源)
conda config –show channels
镜像源(删除源)
conda config –remove channels
镜像源(删除所有源)
conda config –remove-key channels
更新conda
conda update conda
查看虚拟环境版本历史
conda list –revisions
恢复到某个版本的虚拟环境
Aug. 5, 2026
检查仓库源
确保仓库包含contrib和non-free部分。Kali默认就有此部分。Debian可能需要自己手动添加,建议检查下为好。
检查是否包括contrib和non-free
grep “contrib non-free” /etc/apt/sources.list
如果没有的话,需要手动添加。源文件在/etc/apt/sources.list
apt edit-sources
或
vim /etc/apt/sources.list
deb http://deb.debian.org/debian/ bookworm main non-free-firmware
改为
deb http://deb.debian.org/debian/ bookworm main non-free-firmware non-free contrib
更新软件包
apt update
检查显卡
#lspci | grep -i vga
root@ecs-70211683:~# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:04.0 SCSI storage controller: Red Hat, Inc. Virtio SCSI
00:05.0 Communication controller: Red Hat, Inc. Virtio console
Aug. 5, 2026
官方文档
本地源码启动 | Dify
一、下载源码
仓库地址:https://github.com/langgenius/dify.git
二、安装所需组件
需要docker环境部署所需组件,分别是 redis postgres weaviate(向量数据库)
#注意除了映射地址之外尽量不要改动,账号密码在项目中已有默认配置,改动的话要做相应的改动
docker run -d –name redis –restart=always -v /data/redis/data:/data -p 6379:6379
redis:6-alpine redis-server –requirepass difyai123456
docker run -it –name postgres –restart always -e POSTGRES_PASSWORD=‘difyai123456’ -e
POSTGRES_DB=‘dify’ -e PGDATA=’/var/lib/postgresql/data/pgdata’ -v
/data/db/data:/var/lib/postgresql/data -p 5432:5432 -d postgres:15-alpine
docker run -it –name weaviate –restart=always -v /data/weaviate:/var/lib/weaviate -e
QUERY_DEFAULTS_LIMIT=25 -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=‘false’ -e
PERSISTENCE_DATA_PATH=’/var/lib/weaviate’ -e DEFAULT_VECTORIZER_MODULE=‘none’ -e
CLUSTER_HOSTNAME=‘node1’ -e AUTHENTICATION_APIKEY_ENABLED=‘true’ -e
AUTHENTICATION_APIKEY_ALLOWED_KEYS=‘WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih’ -e
AUTHENTICATION_APIKEY_USERS='hello@dify.ai ’ -e AUTHORIZATION_ADMINLIST_ENABLED=‘true’ -e
AUTHORIZATION_ADMINLIST_USERS='hello@dify.ai ’ -p 8080:8080 -d
semitechnologies/weaviate:1.19.0
三、配置后端环境
1、进入到项目目录的api下
cd api
2、复制环境变量配置文件
cp .env.example .env
3、生成随机密钥,并替换 .env 中 SECRET_KEY 的值
openssl rand -base64 42
sed -i ’s/SECRET_KEY=.*/SECRET_KEY=<your_value>/’ .env
4、使用conda 创建新的环境
conda create -n dify310 python=3.10
Aug. 5, 2026
C:\Users\User\Desktop>git clone https://github.com/XXXXXXXXXX.git
Cloning into ‘one-piece’…
remote: Counting objects:5463, done.
remote: Compressing objects:100%(3600/3600), done.
remote: Total 5463(delta 1539), reused 5359(delta 1438), pack-reused 0
Receiving objects:100%(5463/5463),5.08 MiB |1.38 MiB/s, done.
Resolving deltas:100%(1539/1539), done.
Checking connectivity… done.
warning: unable to access ‘hackathon/node_modules/noble/node_modules/bluetooth-hci-
socket/node_modules/usb
/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-
yet/node_modules/readable-stream/
node_modules/core-util-is/lib/.gitattributes’: Filename too long
fatal: cannot create directory at ‘hackathon/node_modules/noble/node_modules/bluetooth-
hci-socket/node_mod
ules/usb/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-
yet/node_modules/readable
-stream/node_modules/process-nextick-args’: Filename too long
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with’git status’
and retry the checkout with’git checkout -f HEAD’
git有可以创建4096长度的文件名,然而在windows最多是260,因为git用了旧版本的windows api,为此
踩了个坑。
解决
打开git命令行:
git config –global core.longpaths true
Aug. 5, 2026
git cherry-pick 0128660c08e325d410cb845616af355c0c19c6fe
一、基本用法
命令的作用,就是将指定的提交(commit)应用于其他分支。
$ git cherry-pick 上面命令就会将指定的提交,应用于当前分支。这会在当前分支产
生一个新的提交,当然它们的哈希值会不一样。
举例来说,代码仓库有和两个分支。
a - b - c - d Master
e - f - g Feature
现在将提交应用到分支。
切换到 master 分支
$ git checkout master
Cherry pick 操作
$ git cherry-pick f
上面的操作完成以后,代码库就变成了下面的样子。
a - b - c - d - f Master
e - f - g Feature
从上面可以看到,分支的末尾增加了一个提交。
命令的参数,不一定是提交的哈希值,分支名也是可以的,表
示转移该分支的最新提交。
$ git cherry-pick feature
上面代码表示将分支的最近一次提交,转移到当前分支。
二、转移多个提交
Cherry pick 支持一次转移多个提交。
Aug. 5, 2026
1、在清华源网站下载安装包
Index of /gitlab-runner/yum/el8-x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
2、执行安装命令
#rpm离线安装gitlab runner,需要依赖git,所以请提前安装git
rpm -ivh
3、启动runner
systemctl daemon-reload #重新加载配置
systemctl start gitlab-runner #启动服务
systemctl enable gitlab-runner #设置开机启动
systemctl restart gitlab-runner #重启服务
4、注册runner
runner 分为三种:
Shared Runners:
Group Runners:
Specific Runners:
不同类型的runner是通过取自不同位置的token来指定的,管理员用户从软件设置处取得的为shared
runner,从group的ci/cd取得的token则为group类型,一次类推。下面示例是shared runner。
一台机器可以注册多个runner
gitlab-runner register
root@k8s-node02 ~]# gitlab-runner register
Runtime platform arch=amd64 os=linux pid=6245
revision=ac8e767a version=12.6.0
Running in system-mode.
#输入公司的gitlab公网地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/) :
http://192.168.200.133/
Aug. 5, 2026
验证是否有权限
sudo -u gitlab-runner -H docker info
将gitlab-runner用户添加到docker组
sudo usermod -aG docker gitlab-runne
验证是否生效:
sudo -u gitlab-runner -H docker info

Aug. 5, 2026
如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候,
在发布这个配置文件的时候,会发生代码冲突:
error: Your local changes to the following files would be overwritten by merge:
protected/config/main.PHP
Please, commit your changes or stash them before you can merge.
如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:
git stash
git pull
git stash pop
然后可以使用Git diff -w +文件名来确认代码自动合并的情况.
反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:
git reset –hard
git pull
其中git reset是针对版本,如果想针对文件回退本地修改,使用
[plain]view plaincopy
1.git checkout HEAD file/to/restore
iefreer
Aug. 5, 2026
git一般有很多分支,我们clone到本地的时候一般都是master分支,那么如何切换到其他分支呢?主要命令如
下:
- 查看远程分支
$ git branch -a
我在mxnet根目录下运行以上命令:
~/mxnet$ git branch -a
- master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/nnvm
remotes/origin/piiswrong-patch-1
remotes/origin/v0.9rc1
1
2
3
4
5
6
7
8
可以看到,我们现在在master分支下
- 查看本地分支
~/mxnet$ git branch
- 切换分支
$ git checkout -b v0.9rc1 origin/v0.9rc1
Branch v0.9rc1 set up to track remote branch v0.9rc1 from origin.
Switched to a new branch ‘v0.9rc1’
#已经切换到v0.9rc1分支了
$ git branch
master
- v0.9rc1
#切换回master分支
$ git checkout master
Switched to branch ‘master’
Your branch is up-to-date with ‘origin/master’.
Aug. 5, 2026
更新
阿里云也有cpu版的镜像了
pytorch-wheels安装包下载_开源镜像站-阿里云
简介
PyTorch是一个用于机器学习和深度学习的开源深度学习框架,由Facebook于2016年发布,其主要实现了自动微分功
能,并引入动态计算图使模型建立更加灵活。Pytorch可分为前后端两个部分,前端是与用户直接交互的python API,后
端是框架内部实现的部分,包括Autograd,它是一个自动微分引擎。
网络安装
打开PyTorch官方网站,按照自己所需的方式选择安装方式,获取安装的命令。
安装包下载
以上官方网站的安装方式访问的是外国的地址,网速很慢,很难安装成功,所以可以先下载安装包,然后本地安装。
所需下载的包
一、torch
官方的下载地址:https://download.pytorch.org/whl/torch/
清华源的地址:https://pypi.tuna.tsinghua.edu.cn/simple/torch/(此地址下载的版本不对,无法使用)
按照自己的环境选择自己所需的版本。例如:torch-2.4.1+cu124-cp310-cp310-win_amd64.whl torch版本2.4.1 GPU
的cuda的版本12.4 python版本3.10
二、torchaudio
官方的下载地址:https://download.pytorch.org/whl/torchaudio/
清华源的地址:https://pypi.tuna.tsinghua.edu.cn/simple/torchaudio/
按照自己的环境选择自己所需的版本。例如:torchaudio-2.4.1+cu124-cp310-cp310-win_amd64.whl torchaudio版本
2.4.1 GPU 的cuda的版本12.4 python版本3.10
torch与torchaudio版本对应关系:Torchaudio documentation (pytorch.org)
来源:(PyTorch中torch、torchvision、torchaudio、torchtext版本对应关系_torch2.0.1对应的torchvision-CSDN博客)
三、torchvision
官方的下载地址:https://download.pytorch.org/whl/torchvision/
清华源的地址:https://pypi.tuna.tsinghua.edu.cn/simple/torchaudio/
按照自己的环境选择自己所需的版本。例如:torchvision-0.19.1-cp310-cp310-win_amd64.whl
torch与torchvision版本对应关系:GitHub - pytorch/vision: Datasets, Transforms and Mod
els specific to Computer Vision
pip本地安装
外网地址下载很慢,国内镜像下载很快,下载完了就可以执行pip安装
#先安装 torch,conda环境下先切换到想要的环境下在执行命令
pip install torch-2.4.1+cu124-cp310-cp310-win_amd64.whl
pip install torchaudio-2.4.1+cu124-cp310-cp310-win_amd64.whl
pip install torchvision-0.19.1-cp310-cp310-win_amd64.whl
#安装完后在当前环境下切换到python命令模式下执行以下代码
#当显示True表示GPU 版本 torch安装成功,其他包测试方法同上。
import torch
torch.cuda.is_available()
Aug. 5, 2026
报错如下:
root@9e039aacfc5e:/opt/video-subtitle-generator/py38# python
Python 3.8.19 (default, Sep 5 2024, 00:27:22)
[GCC 12.2.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
import torch
torch.cuda.is_available()
/usr/local/lib/python3.8/site-packages/torch/cuda/init.py:128: UserWarning: CUDA
initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda
functions before calling NumCudaDevices() that might have already set an error? Error
500: named symbol not found (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:108.)
return torch._C._cuda_getDeviceCount() > 0
False
原因:
在容器内运行 CUDA 应用程序时,带有 WSL2 的 NVIDIA 驱动程序 555.85 返回错误 500“找不到命名符号” ·问题 #520
·NVIDIA/nvidia-容器工具包
解决:
安装新版的:nvidia-container-toolkit
仓库安装有很多教程
下面记录手动安装:
下载地址:Releases · NVIDIA/nvidia-container-toolkit
Aug. 5, 2026
今天装完 conda ,第一次启动的时候报错
环境:win11
Invoke-Expression : 所在位置行:1 字符: 1097 + … \Installation\mingw64\bin;C:\Installation\node_js;“C:\Program
Files\J … + ~~~~~~~~~~ 表达式或语句中包含意外的标记“C:\Program”。所在位置行:1 字符: 1172 + … k-
1.8\bin;C:\Program Files\Java\jdk-1.8\jre\bin;”;“C:\Program Files\M … + ~~~~~~~~~~ 表达式或语句中包含意外的标记
“C:\Program”。所在位置行:1 字符: 1219 + … ;”;“C:\Program Files\MySQL\MySQL Server 8.0\bin;”;“C:\Program
Files\J … + ~~~~~~~~~~ 表达式或语句中包含意外的标记“C:\Program”。所在位置
C:\ProgramData\miniconda3\shell\condabin\Conda.psm1:76 字符: 9 + Invoke-Expression -Command
$activateCommand; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ParserError: (:)
[Invoke-Expression], ParseException + FullyQualifiedErrorId :
UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand
1
AI助手
原因:之前配置 java 环境变量的时候,在一行里写了两个路径,用了分号隔开,导致 conda 启动的时候解析环境变量
的时候出错。
like:
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
1
AI助手
分 2 行写就可以了
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
Aug. 5, 2026
使用中文,建议使用IK分词器!
IK提供了两个分词算法:ik_smart 和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分!
下载
下载对应es版本的ik分词器zip(版本一定要对应)
安装
将下载好的zip文件包解压,放入到ik文件夹
#进入es安装目录下的plugins下,创建ik文件夹
cd /elasticsearch-7.12.1/plugins
mkdir ik
#将下载好的zip包放入ik文件夹下,执行解压
unzip elasticsearch-analysis-ik-7.12.1.zip
重启es服务
#切换成有权限的es用户
su es
#杀掉进程,重启ps -ef | grep elastic
kill -9 端口号
./elsaticsearch-7.12.1/bin/elasticsearch -d
验证
http://127.0.0.1:9200/_cat/plugins
Aug. 5, 2026
前言
安装ES之前,请先检查JDK版本,es使用java编写,强依赖java环境。JDK安装过程略。
安装步骤
1.下载地址
下载 Elasticsearch | Elastic
2.解压elasticsearch-7.12.1-windows-x86_64.zip到指定目录:
D:\elasticsearch\elasticsearch-7.12.1
3.进入解压后的elasticsearch目录:
- 新建data目录:
mkdir data
2) 修改config/elasticsearch.yml:
#集群名称
cluster.name: xxx
#节点名称
node.name: node-1
#数据和日志的存储目录
path.data: D:\elasticsearch\elasticsearch-7.12.1\data
path.logs: D:\elasticsearch\elasticsearch-7.12.1\logs
#设置绑定的ip,设置为0.0.0.0以后就可以让任何计算机节点访问到了
network.host: 0.0.0.0
#默认端口
http.port: 9200
#设置在集群中的所有节点名称
cluster.initial_master_nodes: [“node-1”]
3) 修改es占用jvm空间分配(默认2G,正式服根据实际情况配置)
#进入config目录下
#打开jvm.optionsvim jvm.options#设置占用空间(注意m、g小写)
-Xms200m
-Xmx200m
4.用户权限问题(linux)
由于es可以输入且执行脚本,为了系统安全,不允许使用root启动,添加一个新用户:
#添加用户和设置密码adduser espasswd es#授权
/usr/local/elasticsearch-7.2.0
目录下的文件拥有者为 es
chown es /usr/local/elasticsearch-7.2.0/ -R
5.解决会出现的问题
1) 解决 max virtual memory areas vm.max_map_count [65530] is too low
原因:max_map_count这个参数就是允许一个进程在VMAs(虚拟内存区域)拥有最大数量,VMA是
一个连续的虚拟地址空间,当进程创建一个内存映像文件时VMA的地址空间就会增加,当达到
max_map_count了就是返回out of memory errors
// 修改下面的文件里面是一些内核参数vim /etc/sysctl.conf
//在末尾添加以下配置 vm.max_map_count=655360
添加完保存,然后执行
sysctl -p
//-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
Aug. 5, 2026
- 安装 ingest-attachment 插件
首先,确保你已经安装了ElasticSearch。ingest-attachment插件是ElasticSearch的一个官方插件,用于处理和分析二进
制文件(如PDF、Word文档等)中的文本内容。你可以通过以下命令来安装它(以Linux环境为例):
进入ElasticSearch的插件目录
cd /path/to/elasticsearch/plugins
下载并安装ingest-attachment插件
bin/elasticsearch-plugin install ingest-attachment
2. 配置 Pipeline
在ElasticSearch中,Pipeline是一种处理文档的方式,它允许你在索引文档之前对文档进行一系列的处理操作。为了使
用ingest-attachment插件,你需要配置一个Pipeline,指定如何处理附件文件。
PUT _ingest/pipeline/attachment
{
“description”:“Extract attachment information”,
“processors”:[
{
“attachment”:{
“field”:“data”,
“target_field”:“attachment”,
“indexed_chars”:-1,
“ignore_missing”:true
}
},
{
“remove”:{
“field”:“data”
}
}
]
}
在这个Pipeline中,attachment处理器用于解析data字段中的文件内容,并将解析结果存储在attachment字段中。
indexed_chars设置为-1表示不限制索引的字符数。
3. 索引文件
接下来,你可以通过HTTP API将文件发送到ElasticSearch进行索引。这里假设你已经有一个包含文件内容的Base64编
码的字符串,并准备将其发送到ElasticSearch。
curl
-X POST “localhost:9200/my_index/_doc?pipeline=attachment” -H ‘Content-Type:
application/json’ -d’
{
“data”: “”,
“file_name”: “example.pdf”
}
'
注意,这里的data字段包含了文件的Base64编码内容,file_name字段是可选的,用于记录文件名。
4. 执行搜索
一旦文件被索引,你就可以像搜索普通文本一样搜索这些文件了。例如,搜索包含特定关键字的文档:
GET /my_index/_search
{
“query”: {
“match”: {
“attachment.content”: “your search keyword”
}
}
}
5. 注意事项与优化
性能考虑:对于大型文件或高并发的应用场景,建议优化ElasticSearch的资源配置,如增加内存、调整JVM设置
等。
安全性:确保通过安全的方式传输文件数据,如使用HTTPS协议。
存储与备份:考虑文件的存储和备份策略,以防数据丢失。
结论
通过ingest-attachment插件,ElasticSearch能够轻松实现对多种格式文件的全文检索。无论是企业级的文档管理系统,
还是个人用户的知识库建设,这一功能都能极大地提升信息的检索效率和便利性。希望本文能为你实现类似功能提供有
价值的参考和帮助。
Aug. 5, 2026
Ollama调用AMD 780m集显
必要软件下载
AMD-Software-PRO-Edition-25.Q3-Win10-Win11-For-HIP.exe
Release v0.12.7 · likelovewant/ollama-for-amd
Release v0.6.4.2 · likelovewant/ROCmLibs-for-gfx1103-AMD780M-APU · GitHub
版本对应关系OllamaSetup12.7对应rocm.gfx1103.for.hip.6.4.2.7z
安装Ollama for AMD
ollama for AMD (OllamaSetup.exe) 安装和官方安装一样双击下一步到底就行。默认安装路径
在C:\Users%username%\AppData\Local\Programs\Ollama
替换ROCmLibs库
从Github ROCmLibs 下载的包rocm.gfx1103.for.hip.6.4.2.7z
备份替换 rocblas.dll
备份替换library
重启ollama服务,再次测试并观察GPU占用情况




Aug. 5, 2026
一、确保宿主机安装了NVIDIA驱动和NVIDIA Docker Toolkit。
1.1、添加nvidia的仓库
sudo curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey |
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
sudo curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-
container-runtime.list |
sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
1.2、安装nvidia-container-runtime
sudo apt-get install -y nvidia-container-toolkit(新版)
sudo nvidia-ctk runtime configure –runtime=docker
1.3、使用以下命令配置容器运行时nvidia-ctk
该nvidia-ctk命令修改/etc/docker/daemon.json主机上的文件。该文件已更新,以便 Docker 可以使
用 NVIDIA 容器运行时。
sudo nvidia-ctk runtime configure –runtime=docker
#检查 Docker 配置文件,确保已启用对 GPU 的支持
{
“registry-mirrors”: [
“https://xxxx.mirror.aliyuncs.com”
],
“runtimes”: {
“nvidia”: {
“args”: [],
“path”: “nvidia-container-runtime”
}
}
}
1.4、重新启动 Docker 守护进程
sudo systemctl restart docker
1.5 测试
Mar. 20, 2026
openclaw 支持很多通信工具,国内的飞书、企业微信、钉钉等都有插件支持,本文只介绍企业微信集成方法。
需要先安装openclaw,本文在 openclaw + ollama 本地源码安装 基础上进行操作。
Mar. 18, 2026
本文采用源码安装openclaw,并结合ollama本地运行大模型的方式,运行openclaw。本文安装的版本为OpenClaw 2026.3.13。
Aug. 3, 2019
Hugo is an open-source project and lives by the work of its contributors. There are plenty of open issues, and we need your help to make Hugo even more awesome. You don’t need to be a Go guru to contribute to the project’s development.
Jul. 1, 2019
Hugo is a fast and modern static site generator written in Go, and designed to make website creation fun again.