背景

部署 项目 时卡在两个地方:

  • Docker 拉取
    code
    golang:1.22-alpine
    code
    alpine:3.19
    (免费镜像源限流)
  • code
    RUN go mod download
    (Go 官方代理被墙)

免费加速源(如轩辕免费、1ms)经常

code
toomanyrequests
,于是我在美国机器上自建了 Pull-Through Cache,同时给 Go 加了国内代理,一劳永逸。

核心方案

  1. 自建 Docker 镜像缓存(官方 registry:2)
  2. GOPROXY 加速 Go 模块(goproxy.cn)

完整步骤(美国服务器操作)

1. 自建镜像缓存(5 分钟)

bash
mkdir -p /etc/docker/registry
cat > /etc/docker/registry/config.yml << EOF
version: 0.1
storage:
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
proxy:
  remoteurl: https://registry-1.docker.io
EOF

docker run -d \
  --name docker-mirror \
  -p 5000:5000 \
  --restart=always \
  -v /etc/docker/registry/config.yml:/etc/docker/registry/config.yml \
  -v docker-mirror-data:/var/lib/registry \
  registry:2

2. 配置本地使用缓存

bash
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["http://127.0.0.1:5000"],
  "insecure-registries": ["127.0.0.1:5000"]
}
EOF
sudo systemctl restart docker

国内其他机器改成

code
http://domain.com:5000
即可。

3. 加速 Go 模块(关键!)

修改 Dockerfile(builder 阶段):

dockerfile
ENV GOPROXY=https://goproxy.cn,direct \
    GO111MODULE=on
RUN go mod download

然后:

bash
docker-compose build --no-cache

安全配置(必须做!)

  • 美国 前置防火墙:只允许国内固定 IP 访问 5000 端口(白名单)
  • 服务器 ufw
    bash
    sudo ufw allow from 你的国内IP to any port 5000
    sudo ufw reload
  • 不需要时直接关闭公网暴露(见下文)

效果

  • 基础镜像第一次缓存后秒拉
  • go mod download 从 2 分钟 → 10 秒以内
  • 以后
    code
    docker-compose up -d --build
    基本无感

一句话总结:免费源卡死了就自建,美国服务器 + goproxy.cn,国内部署再也不用等了。


你直接把上面整段复制到博客就行(已加 Markdown 格式,适合 Hexo/WordPress/Notion 等)。需要我再改标题、加图或缩短成 500 字版,随时说!


第二个问题解答:美国机器上这个镜像源(5000 端口)怎么白名单或关闭

推荐做法:白名单(最安全,不用关闭)

因为你国内机器要用,就别全关,改成只允许特定 IP

  1. 美国服务器 控制面板(最重要)
    登录 https://www.dmit.io → 你的 VPS → Firewall / ACL Rules
    添加规则:

    • Action: Allow
    • Protocol: TCP
    • Port: 5000
    • Source: 填你的国内 IP(可以加多个,或整个段如 123.45.67.0/24)
      其他全部拒绝。
  2. 服务器防火墙也加白名单(双保险)

    bash
    sudo ufw allow from 你的国内IP to any port 5000
    sudo ufw deny 5000   # 先拒绝所有,再允许白名单
    sudo ufw reload

如果你暂时不需要国内访问,想直接关闭公网

bash
# 停止并删除容器(端口就关了)
docker stop docker-mirror && docker rm docker-mirror

# 改回只本地使用(美国机器自己最快)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["http://127.0.0.1:5000"],
  "insecure-registries": ["127.0.0.1:5000"]
}
EOF
sudo systemctl restart docker

以后想重新开放就再跑一次

code
docker run ...
启动容器 + 开防火墙。

我的建议:先做白名单就够了(DMIT 一条规则 10 秒搞定),不用关闭。

评论

还没有评论,来做第一个留言的人吧。

发表评论

验证码: