docker 镜像下载加速(安装 kubernetes 必备)

大佬的文章

https://blog.k8s.li/kubespray-tips.html
https://fuckcloudnative.io/posts/docker-registry-proxy/

·

docker registry 可以通过设置 remoteurl 参数将其作为远端仓库的缓存仓库,这样当你通过这个私有仓库的地址拉取镜像时,regiistry 会先将镜像缓存到本地存储,然后再提供给拉取的客户端。

我们可以选择通过 制作镜像环境变量的方式进行配置,详细的配置参数可参考官方文档。

·

1 前期准备

我在准备阶段白扔了几两银子,还多花了一些时间;这里介绍经过爬坑之后,个人感觉最划算的准备方式,至于我的爬坑经历就不赘述了。

  • 一个个人域名:现在各大公有云厂商基本都可以买到域名,而且有很多便宜的域名。我是在新网买的(130元5年),新网的优点是各种认证、备案通过的比较快;缺点是不提供免费的 SSL 证书。这样的话,就需要在别的地方(比如,阿里云、腾讯云)创建免费证书,然后在新网添加必要的解析。如果觉得麻烦的,可以直接在 “会魔法的服务器” 所在的公有云厂商(比如,阿里云、腾讯云)注册域名。
  • 一个会魔法的服务器:我选择的是腾讯云的轻量应用服务器(中国香港区),虽然资源配置较低,并且流量有限,但是足够个人或中小型企业使用了。具体配置信息见下图:
    在这里插入图片描述

PS: 我在阿里云和新网都注册了一个域名,阿里云的好几天认证都没通过;新网的几个小时就可以使用了。

PS: 我的 SSL 证书使用的是阿里云的免费证书,当然腾讯云也有;免费证书只支持单域名;所以,每个三级域名都需要申请证书。

·

2 制作通用镜像

为了能够支持缓存 docker.io、gcr.io、k8s.gcr.io、quay.io 和 ghcr.io 等常见的公共镜像仓库,我们需要对 registry 的配置文件进行定制。Dockerfile 如下:

FROM registry:2.6
LABEL maintainer="registry-proxy Docker Maintainers https://fuckcloudnative.io"
ENV PROXY_REMOTE_URL="" \DELETE_ENABLED=""
COPY entrypoint.sh /entrypoint.sh

其中,entrypoint.sh 用来将环境变量传入配置文件:

#!/bin/shset -eCONFIG_YML=/etc/docker/registry/config.ymlif [ -n "$PROXY_REMOTE_URL" -a `grep -c "$PROXY_REMOTE_URL" $CONFIG_YML` -eq 0 ]; thenecho "proxy:" >> $CONFIG_YMLecho "  remoteurl: $PROXY_REMOTE_URL" >> $CONFIG_YMLecho "  username: $PROXY_USERNAME" >> $CONFIG_YMLecho "  password: $PROXY_PASSWORD" >> $CONFIG_YMLecho "------ Enabled proxy to remote: $PROXY_REMOTE_URL ------"
elif [ $DELETE_ENABLED = true -a `grep -c "delete:" $CONFIG_YML` -eq 0 ]; thensed -i '/rootdirectory/a\  delete:' $CONFIG_YMLsed -i '/delete/a\    enabled: true' $CONFIG_YMLecho "------ Enabled local storage delete -----"
fised -i "/headers/a\    Access-Control-Allow-Origin: ['*']" $CONFIG_YML
sed -i "/headers/a\    Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']" $CONFIG_YML
sed -i "/headers/a\    Access-Control-Expose-Headers: ['Docker-Content-Digest']" $CONFIG_YMLcase "$1" in*.yaml|*.yml) set -- registry serve "$@" ;;serve|garbage-collect|help|-*) set -- registry "$@" ;;
esacexec "$@"

·

3 运行 registry-proxy,并为其添加认证功能

为了防止他人使用,可以为 registry 添加认证功能。建议通过环境变量的方式进行配置;因为在用户密码变化的时候,不用重新构建镜像。

3.1 首先,生成用户密码文件:

$ mkdir -pv /opt/auth
$ htpasswd -Bbn admin ****** > /opt/auth/htpasswd 
$ htpasswd -Bbn  panbuhei ****** >> /opt/auth/htpasswd

3.2 然后,部署 registry-proxy。我这里选择使用 docker-compose 来部署,代码如下:

$ mkdir -pv /opt/docker-compose/registry-proxy/
$ cat << "EOF" > /opt/docker-compose/registry-proxy/docker-compose.yml
version: '3'
services:k8s-gcr-registry:image: wupanfeng035/registry-proxy:v1.0container_name: k8s-gcr-registryrestart: alwaysvolumes:- /etc/localtime:/etc/localtime- /var/lib/registry:/var/lib/registry- /opt/auth/htpasswd:/opt/auth/htpasswdports:- 127.0.0.1:5001:5000environment:- PROXY_REMOTE_URL=https://k8s.gcr.io- REGISTRY_AUTH_HTPASSWD_REALM=basic-auth- REGISTRY_AUTH_HTPASSWD_PATH=/opt/auth/htpasswdgcr-registry:image: wupanfeng035/registry-proxy:v1.0container_name: gcr-registryrestart: alwaysvolumes:- /etc/localtime:/etc/localtime- /var/lib/registry:/var/lib/registry- /opt/auth/htpasswd:/opt/auth/htpasswdports:- 127.0.0.1:5002:5000environment:- PROXY_REMOTE_URL=https://gcr.io- REGISTRY_AUTH_HTPASSWD_REALM=basic-auth- REGISTRY_AUTH_HTPASSWD_PATH=/opt/auth/htpasswdhub-registry:image: wupanfeng035/registry-proxy:v1.0container_name: hub-registryrestart: always- /etc/localtime:/etc/localtime- /var/lib/registry:/var/lib/registry- /opt/auth/htpasswd:/opt/auth/htpasswdports:- 127.0.0.1:5003:5000environment:- PROXY_REMOTE_URL=https://registry-1.docker.io### 需要下载 dockerhub 的私有仓库时,请配置用户密码#- PROXY_USERNAME=test001#- PROXY_PASSWORD=********- REGISTRY_AUTH_HTPASSWD_REALM=basic-auth- REGISTRY_AUTH_HTPASSWD_PATH=/opt/auth/htpasswdquay-registry:image: wupanfeng035/registry-proxy:v1.0container_name: quay-registryrestart: alwaysvolumes:- /etc/localtime:/etc/localtime- /var/lib/registry:/var/lib/registry- /opt/auth/htpasswd:/opt/auth/htpasswdports:- 127.0.0.1:5004:5000environment:- PROXY_REMOTE_URL=https://quay.io- REGISTRY_AUTH_HTPASSWD_REALM=basic-auth- REGISTRY_AUTH_HTPASSWD_PATH=/opt/auth/htpasswdghcr-registry:image: wupanfeng035/registry-proxy:v1.0container_name: ghcr-registryrestart: alwaysvolumes:- /etc/localtime:/etc/localtime- /var/lib/registry:/var/lib/registry- /opt/auth/htpasswd:/opt/auth/htpasswdports:- 127.0.0.1:5005:5000environment:- PROXY_REMOTE_URL=https://ghcr.io- REGISTRY_AUTH_HTPASSWD_REALM=basic-auth- REGISTRY_AUTH_HTPASSWD_PATH=/opt/auth/htpasswd
EOF

3.3 部署 registry-proxy

$ cd /opt/docker-compose/registry-proxy/
$ docker-compose up -d 

·

4 发布 registry-proxy

由于需要缓存多个公共仓库,并且都需通过 443 端口发布;但是 443 端口只有一个。所以,需要根据域名来转发请求到不同的 registry-proxy 服务。我这里选择使用简单且熟悉的 nginx 实现,配置文件如下所示:

server {listen       80;listen       443 ssl;server_name  k8s-gcr.panbuhei.online;ssl_certificate /usr/local/nginx/conf/cert/k8s-gcr.panbuhei.online.pem;ssl_certificate_key /usr/local/nginx/conf/cert/k8s-gcr.panbuhei.online.key;ssl_prefer_server_ciphers on;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";ssl_session_cache shared:SSL:10m;ssl_session_timeout 30;if ($request_method !~* GET|HEAD) {return 403;}location / {proxy_pass   http://localhost:5001;}
}server {listen       80;listen       443 ssl;server_name  gcr.panbuhei.online;ssl_certificate /usr/local/nginx/conf/cert/gcr.panbuhei.online.pem;ssl_certificate_key /usr/local/nginx/conf/cert/gcr.panbuhei.online.key;ssl_prefer_server_ciphers on;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";ssl_session_cache shared:SSL:10m;ssl_session_timeout 30;if ($request_method !~* GET|HEAD) {return 403;}location / {proxy_pass   http://localhost:5002;}
}server {listen       80;listen       443 ssl;server_name  hub.panbuhei.online;ssl_certificate /usr/local/nginx/conf/cert/hub.panbuhei.online.pem;ssl_certificate_key /usr/local/nginx/conf/cert/hub.panbuhei.online.key;ssl_prefer_server_ciphers on;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";ssl_session_cache shared:SSL:10m;ssl_session_timeout 30;if ($request_method !~* GET|HEAD) {return 403;}location / {proxy_pass   http://localhost:5003;}
}
server {listen       80;listen       443 ssl;server_name  quay.panbuhei.online;ssl_certificate /usr/local/nginx/conf/cert/quay.panbuhei.online.pem;ssl_certificate_key /usr/local/nginx/conf/cert/quay.panbuhei.online.key;ssl_prefer_server_ciphers on;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";ssl_session_cache shared:SSL:10m;ssl_session_timeout 30;if ($request_method !~* GET|HEAD) {return 403;}location / {proxy_pass   http://localhost:5004;}
}server {listen       80;listen       443 ssl;server_name  ghcr.panbuhei.online;ssl_certificate /usr/local/nginx/conf/cert/ghcr.panbuhei.online.pem;ssl_certificate_key /usr/local/nginx/conf/cert/ghcr.panbuhei.online.key;ssl_prefer_server_ciphers on;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";ssl_session_cache shared:SSL:10m;ssl_session_timeout 30;if ($request_method !~* GET|HEAD) {return 403;}location / {proxy_pass   http://localhost:5005;}
}

·

5 验证

root@ubuntu20:~# docker pull k8s-gcr.panbuhei.online/kube-controller-manager:v1.23.5
Error response from daemon: Head "https://k8s-gcr.panbuhei.online/v2/kube-controller-manager/manifests/v1.23.5": no basic auth credentials### 登陆
root@ubuntu20:~# docker login k8s-gcr.panbuhei.online
Username: panbuhei
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded### 下载
root@ubuntu20:~# docker pull k8s-gcr.panbuhei.online/kube-apiserver:v1.23.5
v1.23.5: Pulling from kube-apiserver
2df365faf0e3: Already exists 
8c99db1114c6: Already exists 
b6a9a43f03b3: Pull complete 
Digest: sha256:ddf5bf7196eb534271f9e5d403f4da19838d5610bb5ca191001bde5f32b5492e
Status: Downloaded newer image for k8s-gcr.panbuhei.online/kube-apiserver:v1.23.5
k8s-gcr.panbuhei.online/kube-apiserver:v1.23.5

·

6 清理 registry-proxy 缓存

由于资源有限,所以,需要定期删除缓存到本地磁盘的部分镜像。方法也比较简单,单独再部署一个 registry,共用其他 registry-proxy 的存储,并启用 delete 功能,然后再通过 API 或者 WebUI 进行删除。这里介绍两个 Docker Registry WebUI 工具:

  • docker-registry-web:由 JAVA 编写,镜像比较大,并且耗费内存资源。
  • docker-registry-ui:底层通过轻量级的 nginx 发布。

为什么 docker-registry-web 比较耗费资源,还选择使用它呢? 主要原因是:我想通过 nginx 代理它,这样就可以在系统的 nginx 上对其做一些限制操作,比如配置 TLS、限制访问 IP 等。经过测试发现 docker-registry-ui 只能通过 “ip:port” 的方式访问,不能再通过系统 nginx 代理。所以,最后选择了 docker-registry-web。

·

5.1 docker-registry-web 的 docker-compose 代码示例:

$ mkdir -pv /opt/docker-compose/clean-registry/
$ cat << "EOF" > /opt/docker-compose/clean-registry/docker-compose.yml
version: '3.2'
services:registry-local:image: registry:latestcontainer_name: registry-localrestart: alwaysvolumes:- /etc/localtime:/etc/localtime- /var/lib/registry:/var/lib/registryports:- 127.0.0.1:5000:5000environment:- REGISTRY_DELETE_ENABLED=trueregistry-web:image: hyper/docker-registry-webcontainer_name: registry-weblinks: - registry-localrestart: alwaysvolumes:- /etc/localtime:/etc/localtimeports:- 127.0.0.1:8080:8080deploy:resources:limits:cpus: '1'memory: 1Greservations:memory: 512Menvironment:- JAVA_OPTS=-Xmx1024m -Xms512m -Xss256k- REGISTRY_URL=http://registry-local:5000/v2- REGISTRY_NAME=Panbuhei Registry-proxy- REGISTRY_READONLY=false
EOF

5.2 部署

$ cd /opt/docker-compose/clean-registry/### 由于做了资源限制, 并且没有使用 swarm,所以要加上 --compatibility 参数
$ docker-compose --compatibility up -d

5.3 nginx 发布代码:

server {listen       80;server_name  clean.panbuhei.online;location / {return 301 https://$host$request_uri;}}server {listen       443 ssl;server_name  clean.panbuhei.online;ssl_certificate /usr/local/nginx/conf/cert/clean.panbuhei.online.pem;ssl_certificate_key /usr/local/nginx/conf/cert/clean.panbuhei.online.key;ssl_prefer_server_ciphers on;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";ssl_session_cache shared:SSL:10m;ssl_session_timeout 30;if ($request_method !~* GET|HEAD) {return 403;}location / {proxy_pass   http://localhost:8080;}
}

5.4 访问验证
在这里插入图片描述

·

这里可能会有疑问:为什么,当我删除图像的所有标签时,图像仍然在 UI 中?因为这是 docker registry 的限制,垃圾收集器(garbage-collect)不会删除空 images。如果要删除空 images,则需要删除 registry 中的文件夹。(见 garbage-collect)

下是为一个删除空 images 的脚本代码:

#!/bin/sh
# remove_nullImageDir.sh
REGISTRY="127.0.0.1:5000"
REGISTRY_NAME=registry-local
repositories=$(curl -s http://${REGISTRY}/v2/_catalog | grep -o '"[^"]*"' | tr -d '"')# docker exec $REGISTRY_NAME registry garbage-collect /etc/docker/registry/config.ymlfor i in $repositories; do[ "$i" = "repositories" ] && continuecurl -s http://${REGISTRY}/v2/${i}/tags/list | egrep '"tags":null|NAME_UNKNOWN';if [ $? -eq 0 ]; thendocker exec -it $REGISTRY_NAME rm -rf /var/lib/registry/docker/registry/v2/repositories/$iecho "delete empty repository $i"fi
done

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380782.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

《面试1v1》ElasticSearch倒排索引

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

Docker启动一个Centos镜像

搜索可用的centos的docker镜像 docker search <image>&#xff1a;在docker index中搜索imagedocker search centos 下载centos镜像&#xff08;拉取镜像&#xff09; docker pull centos:latest查看镜像docker images&#xff1a;列出imagesdocker images -a&#xff…

博途1200间的S7通讯

目录 S7通信 1.新建项目&#xff0c;硬件组态&#xff1b; 2.建立数据&#xff0c;取消优化。 3.PUT/GET指令 S7通信 仅西门子支持&#xff0c;西门子PLC间最常用、最简单的通信协议。通信时&#xff0c;需要在客户端侧调用PUT/GET指令。PUT指令用于将数据写入到伙伴CPU&#…

西门子PLC1200博途V16程序画面例程,具体项目工艺为制药厂生物发酵系统

西门子PLC1200博途V16程序画面例程&#xff0c;具体项目工艺为制药厂生物发酵系统&#xff0c;程序内有报警&#xff0c;模拟量标定处理&#xff0c;温度PID&#xff0c;称重仪表USS通讯和基本的各种数字量控制&#xff0c;硬件组成包含称重仪表通讯及和ET200SP模块通讯组态。 …

基于TIA博途平台西门子1200/1500PLC定时器时间格式转换运用编程

前景介绍&#xff1a; 平常我们编写程序的时候用到最多的指令也许就是定时器指令了&#xff0c;有时候我们需要通过人机界面修改定时器的设定时间。但是许多人机界面不支持西门子S5 TIME时间格式。怎么办呢&#xff1f;我们可以通过西门子库文件系统程序将整数转换为S5 TIME格…

发那科机器人协同作业程序,博途西门子1200搭配-威纶通触摸屏

发那科机器人协同作业程序&#xff0c;博途西门子1200搭配-威纶通触摸屏&#xff0c;真实项目&#xff0c;程序已经调试完毕&#xff0c;稳定运行。 程序特点&#xff1a; 1.含有机器人电脑可读源程序&#xff0c; 2.plc程序采用博途scl与梯形图混合编程&#xff0c;中文注解&…

「项目案例」使用西门子博途 SCL高级语言编写

此项目用博途 SCL高级语言编写如何开启运行时间最少的几台设备 需求&#xff1a; 如果客户共有8台水泵&#xff0c;4用4备&#xff0c;但每次启动设备时累计运行时需要最运行时间最短的4台运行。 解析&#xff1a; 如果使用梯形图来写的话&#xff0c;此程序会非常复杂&#xf…

西门子1500博途医药系统程序案例

西门子1500博途医药系统程序案例。 标准化编程 具体为医药制品&#xff0c;及空调恒温恒湿&#xff0c;PID控制博图程序&#xff0c;带昆仑流程图&#xff0c;西门子1500PLC和昆仑通态触摸屏上位软件&#xff0c;博图版本V16及以上。 适合研究学习标准程序设计。 ID:811668227…

TIA portal西门子博途安装时一直提示重启怎么办?

TIA portal西门子博途安装时一直提示重启怎么办? 在安装西门子的某些软件的时候,经常提示要重启,而且重启之后依然提示重启,让人比较烦恼,这个问题是由以下原因引起的: 一般系统文件无法删除时,比如其他程序正在占用等等,系统会把这些文件保存在注册表该减值下面,以便…

西门子1500PLC博途程序实例,大型程序fanuc机器人汽车焊装自动生产线程序,程序硬件结构包括1台西门子1500PLC程序,2台触摸屏TP1500程序

西门子1500PLC博途程序实例&#xff0c;大型程序fanuc机器人汽车焊装自动生产线程序&#xff0c;程序硬件结构包括1台西门子1500PLC程序&#xff0c;2台触摸屏TP1500程序 9个智能远程终端ET200SP Profinet连接 15个Festo智能模块Profinet通讯 10台Fanuc发那科机器人Profinet通讯…

TIA西门子博途软件中如何让程序段自动显示注释?

TIA西门子博途软件中如何让程序段自动显示注释&#xff1f; 1.打开TIA博途软件–项目视图&#xff0c;点击菜单栏中的“选项”–“设置” 2.进入到设置界面后&#xff0c;点击“PLC编程”–“常规”&#xff0c;勾选“显示程序段注释”&#xff08;with network comments&…

网络安全--awk总结

目录 一、谈谈我对awk的理解 二、常用命令总结 三、awk变量 四、举例说明 一、谈谈我对awk的理解 awk是一种用于文本处理和数据提取的命令行工具&#xff0c;它通过模式匹配和操作来处理输入数据并生成输出。 二、常用命令总结 -F fs&#xff1a;fs指定输入分隔符&#xf…

西门子PLc程序,博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制,模拟量转

西门子PLc程序&#xff0c;博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制&#xff0c;模拟量转换&#xff0c;温度转换&#xff0c;压力Pid控制&#xff0c;西门子KTP700 HMi 含电路图&#xff0c;G120变频器报文 ID:8615671795001402工控老玩童

工作:MODBUS通讯协议知识

工作&#xff1a;MODBUS通讯协议知识 一、Modbus三种通讯分类 Modbus TCP/IP 使用网口通讯&#xff0c;更多是用于快速网络设备&#xff0c;如机器人&#xff0c;上位机视觉。 Modbus RTU 使用RS232或者RS485/RS422接口&#xff0c;通讯方式是串口通讯&#xff0c;是直接传输…

Win10安装GPU支持的最新版本的tensorflow

我在安装好cuda和cudnn后&#xff0c;使用pip install tensorflow安装的tensorflow都提示不能找到GPU&#xff0c; 为此怀疑默认暗转的tensorflow是不带GPU支持的。 在tensorflow官网提供了多个版本的GPU支持的windows的安装包 https://www.tensorflow.org/install/pip?hlz…

Findbugs错误总结

本篇是从别人那找到的&#xff0c;为了让我回头查看findbugs错误怎么解决而保存的 有很多问题其实挺隐晦的&#xff0c;比如第三条。还有人会使用来判断常量字符串和String类型是否相等&#xff0c;这个就是基础不牢的缘故了。 记得把findbugs尽量清零哦。 1. NP_NUL…

Win10与Ubantu双系统安装

用来window多年&#xff0c;今日被迫要学习下linux系统了&#xff0c;所以开始进行Ubantu的双系统之旅了 1.win10安装&#xff08;一般人请忽略&#xff09; 1&#xff09;系统U盘制作&#xff08;参照微信公众号“软件安装管家”&#xff09;&#xff1a;http://mp.weixin.q…

直播安全体系、播放安全、推流安全以及内容安全方案分享

今天的内容包括直播安全体系、播放安全、推流安全以及内容安全四个部分。 首先&#xff0c;我们简单介绍一下直播场景中的安全风险、危害&#xff0c;以及我们应该从哪些方面来保障我们的直播安全。 直播的主要流程是主播通过推流URL&#xff0c;将流推到云服务等云端平台上&am…

Linux计算机名自动变为bogon,修改计算机名

Linux计算机名自动变为bogon&#xff0c;修改计算机名 问题&#xff1a;这次机房停电&#xff0c;部分VM计算机名自动变为bogon&#xff0c;判断故障&#xff1a;因开启VM的时候&#xff0c;网卡需要获取DNS&#xff0c;但是DNS服务器还没有起来&#xff0c;故自动在resolv.con…

波动速读入门训练(含黄卡、曼陀螺使用方法)提供卡片

波动速读入门训练&#xff08;含黄卡、曼陀螺使用方法&#xff09;提供卡片 入门训练是进行波动速读的基础 在波动速读之前要进行入门训练&#xff0c;入门训练包括这样几项&#xff1a; 1、视觉训练&#xff1b; 2、ESP&#xff08;超感觉能力&#xff09;训练&#xff1b; 3…