docker被墙之后的使用方法

前言

dockerhub 被墙之后,导致docker pull不下来、push不上去,造成了一点麻烦。

最简单方法

可以给docker增加代理,这样不仅能pull也能push。下面的方法只能解决pull。

vim /etc/systemd/system/docker.service.d/http-proxy.conf
# appnd
[Service]
Environment="HTTP_PROXY=proxy.example.com:80"
Environment="HTTPS_PROXY=proxy.example.com:443"

通用方法

依赖赛博佛祖Cloudflare,使用无服务器,自建Docker仓库镜像代理,部署方法详见链接

使用方法

docker pull {workers.dev}/nginx

最终方法

上面的方法只能解决dockerhub的镜像,还有其他的镜像仓库拉取不下来,比如gcr.io、ghcr.io、registry.k8s.io、quay.io、mcr.microsoft.com。

这就需要使用第二个工具了crproxy

部署

部署也是很简单,可以在外面的服务器上部署,也可以在内网服务器上部署,

version: "3"
services:
  crproxy:
    image: ghcr.io/daocloud/crproxy/crproxy:v0.9.1
    container_name: crproxy
    restart: unless-stopped
    ports:
      - 80:8080
      - 443:8080
    command: |
      --acme-cache-dir=/tmp/acme
      --acme-hosts=*
      --default-registry=docker.io
    tmpfs:
      - /tmp/acme

    # 非必须, 如果这台服务器无法畅通的达到你要的镜像仓库可以尝试配置
    environment:
      - https_proxy=http://proxy:8080
      - http_proxy=http://proxy:8080

使用

docker pull 你的域名/hello-world -> docker pull hello-world

也可以添加到 /etc/docker/daemon.json,减少域名

{
  "registry-mirrors": ["https://你的域名"]
}

没有域名的话,也可以直接使用ip地址加端口的方式,没有证书认证的需要在/etc/docker/daemon.json配置

{ "insecure-registries": ["192jj.168.1.87:8844"] }

附加玩法

如果你有一台vps,正好在部署了xtls,可以使用它的fallback,那么可以复用这个vps

{
  "name": "你的域名",
  "dest": 8443, # 上面cproxy监听的端口
  "xver": 0
}

兼容k8s使用

怎么在k8s使用上面提供的镜像代理呢。

我写了一个mutating webhook,会把特定前缀的镜像,改成新的镜像,这样就可以在k8s上拉去被墙的镜像了。

使用方法见readme.md

summary

  1. 没有域名,使用 CF-Workers-docker 部署一个worker,用来下载docker的镜像。

  2. 有域名,使用crproxy 部署一个容器,用来下载所有镜像。

  3. 有在 k8s 下使用的需求,可以使用mutating webhook,部署时自动修改镜像。

reference

© 2025 · Built with Gatsby