Docker 镜像代理拉取实践:Skopeo、Crane 与 Docker Daemon 三种方案

一、skopeo镜像转存
skopeo 不依赖docker deamon的镜像搬运工具
安装 skopeo
- ubuntu
1
2
3sudo apt update
sudo apt install -y skopeo
skopeo --version - centos
1
2
3sudo dnf install -y skopeo
sudo yum install -y epel-release
sudo yum install -y skopeo - arch linux
1
sudo pacman -S skopeo
- ubuntu
借助代理安装,假设代理地址为: 192.168.23.177:8889
1
2切工作目录下带docker-compose.yaml or ocker-compose.yml
skopeo.image.download.sh 192.168.23.177:8889代理如何配置(此处暂略)
- 在宿主机或者外网部署singbox保证能访问google
- 配置一个反向代理 /opt/homebrew/bin/sing-box run
认证
- 先 export 代理 export HTTPS_PROXY=代理 export HTTP_PROXY=代理
- dockerhub: skopeo login –username “用户名” –password “密码” docker.io
- register hub: skopeo login –username “用户名” –password “密码” 私有仓库地址
- 不登陆指定账号方式: skopeo copy –src-creds “用户名:密码” docker://docker.io/austsxk/test:latest docker-archive:/tmp/test.tar
二、crane镜像转存
crane 是google开发的轻量容器镜像工具,不依赖docker daemon,实现镜像拉取
安装crane
去官网下载对应的环境 此处不多bibi
Download:- amd64: https://files.austsxk.com/2026-08-20/000002_go-containerregistry_Linux_x86_64.tar.gz
- arm64: https://files.austsxk.com/2026-08-20/000003_go-containerregistry_Linux_arm64.tar.gz
- Install*:
- wget https://files.austsxk.com/2026-08-20/000002_go-containerregistry_Linux_x86_64.tar.gz -O /tmp/go-containerregistry.tar.gz
- sudo tar -zxvf /tmp/go-containerregistry.tar.gz -C /usr/local/bin/ crane
- crane version
下载compose依赖镜像
crane.image.download.sh 192.168.23.177:8889
认证
- dockerhub: crane auth login docker.io –username “用户名” –password “密码”
- 私有仓库: crane auth login registry.example.com –username “用户名” –password “密码”
三、docker daemon配置代理
- 配置代理使用linux systemd
1
2
3
4
5
6
7
8
9
10
11
12
13
14sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/proxy.conf <<'EOF'
[Service]
Environment="HTTP_PROXY=http://192.168.23.177:8889"
Environment="HTTPS_PROXY=http://192.168.23.177:8889"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
配置检查
systemctl show docker --property=Environment
拉镜像
docker compose -f docker-compose.yaml pull
附录脚本
- skopeo.image.download.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35!/usr/bin/env bash
set -euo pipefail
proxy_ip="${1:-http://192.168.23.177:8889}"
export HTTP_PROXY="$proxy_ip"
export HTTPS_PROXY="$proxy_ip"
docker compose config --images |
awk '!seen[$0]++' |
while read -r image; do
file=$(echo "$image" | tr '/:' '__')
archive="/tmp/${file}.tar"
echo "checking image: $image"
if docker image inspect "$image" >/dev/null 2>&1; then
echo "image already exists, skip: $image"
continue
fi
rm -rf ${archive} || true
echo "downloading image: $image"
skopeo copy "docker://$image" "docker-archive:${archive}:${image}"
docker load -i "$archive"
if ! docker image inspect "$image" >/dev/null 2>&1; then
echo "ERROR: image tag not found after load: $image" >&2
echo "Please recreate archive with the repository tag." >&2
exit 1
fi
echo "loaded: $image"
done
- crane.image.download.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17!/usr/bin/env bash
set -euo pipefail
proxy_ip="${1:-http://192.168.23.177:8889}"
export HTTP_PROXY="$proxy_ip"
export HTTPS_PROXY="$proxy_ip"
docker compose config --images |
awk '!seen[$0]++' |
while read -r image; do
file=$(echo "$image" |tr '/:' '__')
rm -rf "/tmp/${file}.tar" || true
echo "pulling $image ..."
GODEBUG=http2client=0 crane pull "$image" "/tmp/${file}.tar"
docker load -i "/tmp/${file}.tar"
rm -f "/tmp/${file}.tar"
done - 实操流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40工作区目录
以部署nsq消息队列为例
.
├── crane.image.download.sh
├── docker-compose.yaml
└── skopeo.image.download.sh
直接安装 报错 此处略过
export环境变量
export HTTP_PROXY=http://192.168.23.177:8889
export HTTPS_PROXY=http://192.168.23.177:8889
使用skopeo方式
austsxk@master:~/services/nsq$ ./skopeo.image.download.sh
checking image: nsqio/nsq:v1.3.0
downloading image: nsqio/nsq:v1.3.0
Getting image source signatures
Copying blob 661ff4d9561e done
Copying blob 5b5b92c83f42 done
Copying blob 4f4fb700ef54 done
Copying blob 2a394a2df2c8 done
Copying blob aea96977eb49 done
Copying config 728389d1c6 done
Writing manifest to image destination
Storing signatures
5af4f8f59b76: Loading layer 7.667MB/7.667MB
7158568d6d56: Loading layer 3.072kB/3.072kB
5f70bf18a086: Loading layer 1.024kB/1.024kB
a547a69c4ff0: Loading layer 54.25MB/54.25MB
de81357bd4ce: Loading layer 10.75kB/10.75kB
Loaded image: nsqio/nsq:v1.3.0
loaded: nsqio/nsq:v1.3.0
启动服务
austsxk@master:~/services/nsq$ docker-compose up -d
Creating network "nsq_nsq" with driver "bridge"
Creating nsqlookupd ... done
Creating nsqd ... done
Creating nsqadmin ... done
特别说明,本文档中http://192.168.23.177:8889是本地测试的内网地址,需替换你本地真实可访问的代理地址
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Erebus's Blog!
评论

