自建拉取registry.k8s.io、k8s.gcr.io、gcr.io、quay.io、ghcr.io 容器镜像的服务
文档说明:只记录关键地方; 2022-10-27
缘由:
折腾使用了各种各样的拉取镜像的办法,虽然实现了目的,但是耗费了大量的时间,同时随着时间的推移,很多办法逐渐失效了。因此决定自己实现
目的:
我只想方便快捷的拉取容器镜像
试验环境: linux debian 11 docker
目标:
实现能拉取 registry.k8s.io、 k8s.gcr.io、 gcr.io、 quay.io、 ghcr.io 容器镜像的服务
准备工具:
一个域名和域名的SSL证书
容器运行环境 ; ( 使用免安装的nginx 、socat 不需要容器运行环境)
免安装的 nginx 运行时(已包含http_proxy_connect_module 模块)
免安装的 socat 运行时
curl -L https://gitee.com/jingjingxyk/quickstart-nginx-php-fpm/raw/main/setup-nginx-runtime.sh | bash curl -L https://github.com/jingjingxyk/build-static-socat/blob/main/setup-socat-runtime.sh?raw=true | bash -s --
使用 docker-compose 启动 nginx 服务端
version: "3" services: nginx-proxy: image: docker.io/jingjingxyk/nginx:alpine-1.21.1-connect-proxy-20221028T0546Z ports: - "8017:8017/tcp" container_name: nginx restart: always volumes: - ./default.conf:/usr/local/nginx/etc/conf.d/default.conf - ./tls:/tls # 域名证书,域名证书创建参考: https://www.cnblogs.com/jingjingxyk/p/16830714.html
配置nginx 的 default.conf 文件
HTTP2需要开启SSL支持
# CONNECT HOST 允许通过代理的域名 map $host $allow_proxy_domain_flag { gcr.io 1; k8s.gcr.io 1; registry.k8s.io 1; registry-1.docker.io 1; # us-east4-docker.pkg.dev 1; ~^([\w|-]+?)-docker\.pkg\.dev$ 1; ghcr.io 1; pkg-containers.githubusercontent.com 1; quay.io 1; # cdn02.quay.io ~^([\w|-]+?)\.quay\.io$ 1; } server { listen 8017 ssl http2 ; server_name http-proxy.xiaoshuogeng.com; charset utf-8; ssl_certificate /tls/wildcard.xiaoshuogeng.com.fullchain.pem; ssl_certificate_key /tls/wildcard.xiaoshuogeng.com.key.pem; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; # about 40000 sessions ssl_session_tickets off; ssl_protocols TLSv1.3; ssl_prefer_server_ciphers off; # dns resolver used by forward proxying resolver 1.0.0.1 1.0.0.2 1.0.0.3 1.1.1.1 ipv6=off; # 判断请求方法是否 connect if ( $request_method != "CONNECT" ) { return 405 '{"status":"405","result":"请求方法不允许","message":"405"}'; } # 判断域名是否允许通过 if ( $allow_proxy_domain_flag != 1 ) { return 403 '{"status":"403","result":"域名不允许通过","message":"403"}'; } proxy_connect; proxy_connect_allow all; proxy_connect_connect_timeout 600s; proxy_connect_read_timeout 75s; proxy_connect_send_timeout 75s; }
阻止服务被滥用的办法: nginx IP地址白名单机制
在nginx的 default.conf 文件中添加如下配置
IP 白名单机制
下面介绍2种方法
# 方法一: # 允许通过的白名单 map $remote_addr $allow_client_ip_flag { default 0; '42.83.144.13' 1; } # 白名单以外的IP地址处理逻辑 if ( $allow_client_ip_flag != 1) { return 403 '{"status":"403","result":"ip is refused","message":"403"}'; }
# 方法二: allow 192.168.1.0/24; allow 10.0.0.0/8; allow 172.16.0.0/12; allow 42.83.144.13; deny all;
本地使用 nginx 提供的代理服务方式一:
支持TLSv1.3的 socat 客户端
如果用不了,很大原因是:你的 socat 版本低,不支持相关参数
那么请选择使用方式二
socat -d -d TCP4-LISTEN:8016,reuseaddr,fork ssl:http-proxy.xiaoshuogeng.com:8017,verify=1,snihost=http-proxy.xiaoshuogeng.com,commonname=http-proxy.xiaoshuogeng.com,openssl-min-proto-version=TLS1.3,openssl-max-proto-version=TLS1.3
本地使用 nginx 提供的代理服务方式二:
version: "3" services: socat-http-proxy-8016: image: registry.cn-beijing.aliyuncs.com/jingjingxyk-public/app:socat-alpine-20221018T1839Z restart: always container_name: socat-http-proxy-8016 ports: - "8016:8016" command: - /bin/sh - -c - | socat -d -d TCP4-LISTEN:8016,reuseaddr,fork ssl:http-proxy.xiaoshuogeng.com:8017,verify=1,snihost=http-proxy.xiaoshuogeng.com,commonname=http-proxy.xiaoshuogeng.com,openssl-min-proto-version=TLS1.3,openssl-max-proto-version=TLS1.3
docker-compose 启动、关闭、查看日志的命令
# 启动 docker-compose -f docker-compose.yaml up -d # 关闭 docker-compose -f docker-compose.yaml down --remove-orphans # 查看日志 docker-compose -f docker-compose.yaml logs -f
容器配置使用代理服务
vi /lib/systemd/system/docker.service [Service] Environment="HTTP_PROXY=http://127.0.0.1:8016" Environment="HTTPS_PROXY=http://127.0.0.1:8016" Environment="NO_PROXY=0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16,localhost,.aliyuncs.com,docker.xiaoshuogeng.com:5000" # 新增上面三行 Type=notify ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
systemclt daemon-reload systemctl restart docker
现在可以拉取容器测试了
拉取k8s容器镜像也可以了
# 查看镜像 https://quay.io/search docker pull quay.io/calico/node:release-v3.24-amd64 docker pull quay.io/coreos/etcd:v3.5.5 # 查看镜像 https://hub.docker.com/search?image_filter=official&q= docker pull docker.io/postgres:latest # 查看镜像: https://console.cloud.google.com/gcr/images/google-containers/GLOBAL # k8s查看必要的镜像 kubeadm config images list kubeadm config images list --kubernetes-version=`kubelet --version | awk -F ' ' '{print $2}'` k8s.gcr.io/kube-apiserver:v1.24.7 k8s.gcr.io/kube-controller-manager:v1.24.7 k8s.gcr.io/kube-scheduler:v1.24.7 k8s.gcr.io/kube-proxy:v1.24.7 k8s.gcr.io/pause:3.7 k8s.gcr.io/etcd:3.5.3-0 k8s.gcr.io/coredns/coredns:v1.8.6 kubeadm config images pull registry.k8s.io/kube-apiserver:v1.25.3 registry.k8s.io/kube-controller-manager:v1.25.3 registry.k8s.io/kube-scheduler:v1.25.3 registry.k8s.io/kube-proxy:v1.25.3 registry.k8s.io/pause:3.8 registry.k8s.io/etcd:3.5.4-0 registry.k8s.io/coredns/coredns:v1.9.3 kubeadm config images pull ## ghcr.io docker pull ghcr.io/github/super-linter:latest docker pull ghcr.io/puppeteer/puppeteer:latest
额外相关项: window 下使用socat
当然也可以使用虚拟机 比如virtualbox
- 安装msys2
- msys2环境下安装依赖 pacman -S gcc make openssl-devel
- 下载socat最新源码包(
http://www.dest-unreach.org/socat/download/socat-1.7.4.4.tar.gz
) - 编译 socat
- tar -zxvf socat-1.7.4.4.tar.gz
- cd socat-1.7.4.4
- ./configure
- make
- make install
- 就可以使用socat了
参考文档
- nginx 使用http_proxy_connect_module模块配置代理服务
- nginx TLSv1.3配置
- MySSL相关术语
- 使用acme.sh自助签发Let's Encrypt 的SSL证书
- 构建能让socat支持TLSv.13特性的容器环境
- docker容器设置代理
- 自建容器镜像加速和缓存服务
- 自建docker hub 容器缓存加速器,只加速官方镜像版的 nginx 的配置
- kubernetes kubeadm 初始化准备
- linux 快速安装docker
- Nginx与安全有关的几个配置
- Nginx的几个常用配置和技巧
- 保留的 IP 地址
- 判断某个IP是公共IP还是保留IP
- IPV4的保留地址汇总
- 拷贝容器镜像内的文件到容器外
- socat
- msys2
- MSYS2 镜像
- MSYS2 镜像
- 虚拟机有哪些?PVE qemu kvm VirtualBox Harvester
容器镜像仓库
- quay.io container
- docker.io
- k8s.gc.io google-containers
- hub docker official-images
- Docker Official Images
- Docker Official Images
实践文档
曾经带我入门的教程
- 烂泥:docker.io、gcr.io、quay.io镜像加速(20200413更新)
- Google Container Registry(gcr.io) 中国可用镜像(长期维护)
- google gcr.io、k8s.gcr.io 国内镜像
- Docker 镜像加速
- Docker 镜像加速教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库