背景
部署 项目 时卡在两个地方:
- Docker 拉取 和code
golang:1.22-alpine(免费镜像源限流)codealpine:3.19 - (Go 官方代理被墙)code
RUN go mod download
免费加速源(如轩辕免费、1ms)经常
code
toomanyrequests核心方案
- 自建 Docker 镜像缓存(官方 registry: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:22. 配置本地使用缓存
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:50003. 加速 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:
-
美国服务器 控制面板(最重要)
登录 https://www.dmit.io → 你的 VPS → Firewall / ACL Rules
添加规则:- Action: Allow
- Protocol: TCP
- Port: 5000
- Source: 填你的国内 IP(可以加多个,或整个段如 123.45.67.0/24)
其他全部拒绝。
-
服务器防火墙也加白名单(双保险)
bashsudo 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 秒搞定),不用关闭。
评论
还没有评论,来做第一个留言的人吧。