Docker安装+可用镜像收集

由于众所周知的原因,Docker 和 Docker Hub 无法访问,为了解决在运维和部署中的安装和拉取容器问题,避免对业务造成影响,我们需要合理配置使用镜像。

安装

手动安装

官方安装脚本 get.docker.com 可能无法访问,只能手动安装,实际上官方文档中也建议在生产环境中通过手动的方式来安装 Docker。

由于系统在不断更新,这边直接提供 CERNET MirrorZ 的帮助(根据 官方文档 修改而来):

https://help.mirrors.cernet.edu.cn/docker-ce/

需要注意的是,在该帮助提供的命令中,默认的 gpg 密钥下载地址仍为 download.docker.com,这么做可以增加安全性,但如果你无法访问,可以将其替换为 mirrors.cernet.edu.cn/docker-ce

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Uninstall all conflicting packages:
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.cernet.edu.cn/docker-ce/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cernet.edu.cn/docker-ce/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# Install the latest version:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

如果您使用其他类 Debian 系统,如 Kali Linux,请将上面的 $(. /etc/os-release && echo "$VERSION_CODENAME") 替换成 bookworm

注意,官方 Docker CE 与 Debian 仓库里的 docker.io 不同:官方 Docker 用 docker compose 来 compose,compose 作为一个插件;Debian 仓库中的 docker.iodocker-compose 来 compose。

允许非 Root 用户运行

对于桌面使用,为了避免每次执行 docker 都需要在前面加上 sudo,可能需要给普通用户添加 docker 权限(使用 Docker Desktop 安装的无需进行此操作):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看docker用户组
getent group docker
# 确保有输出,如果不存在,则使用以下命令创建docker用户组
#sudo groupadd docker

# 将当前添加到 Docker 用户组(这里的 $USER 为要添加到的用户,默认为环境变量中的当前用户)
sudo usermod -aG docker $USER
# 或者
# sudo gpasswd -a $USER docker

# 更新用户组
newgrp docker

# 重启 Docker 服务
sudo systemctl restart docker

# 验证是否能够使用
docker ps
# 如果不行的话,注销试试

需要注意,这种不是 Rootless 容器,就和你给用户添加到 wheel 组然后用 sudo 命令一样,容器还是跑在 root (0:0) 的 dockerd 上。

第三方脚本

如果是图方便,或者碰到不熟悉的系统,可以使用以下命令安装:

1
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

使用 CERNET MirrorZ 302 优选 Docker-CE 镜像:

1
bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --source mirrors.cernet.edu.cn

面板安装

如 1Panel,安装脚本可以帮你自动安装好 Docker,并配置 Docker Hub 镜像,非常省心。

Docker Desktop

官方最新版安装包,自行想办法下载:

https://docs.docker.com/desktop/release-notes/

福利: 这边我们提供 Docker Desktop 安装包镜像,版本见 Version.txt

https://dl.xrgzs.top/软件/Docker/Desktop

密码:为了避免滥用,访问 url.xrgzs.top/pswd 页面最底下获取

Windows 安装 Docker 有三种后端,分别为 Hyper-VWSL2Windows,推荐使用 WSL2

先安装 WSL2:

1
wsl.exe --install

然后再装 Docker Desktop 即可。

注册表镜像

不定期更新

建议设置多个镜像,优先设置速度快的,拉取失败会自动换下一个

请先测试链接是否能够打开(报 40x 正常),然后再使用

注意事项:

  • 部分镜像的 latest 标签可能较老,请尽量带版本号拉取。
  • 不建议用于生产环境,且生产环境建议固定版本号并备份镜像到本地。
  • 对于使用第三方镜像造成的后果,与本人无关,请尽量选择可信镜像。

搭建

免费公开的薅得多会跑路,能自建更好,此处不提供方法,自行 GitHub / 谷歌 / 必应 / 微信搜一搜。

注意如果搭建在 Cloudflare Worker 有被封号的风险。

设置方法

从面板修改

1Panel、DSM、fnOS 等可从面板修改:

1Panel

DSM

fnOS 的做法是将你设置的镜像 unshift 插入到 registry-mirrors 这个 Array 的首位。

fnOS

其他管理面板大同小异,如果没找到就是不能直接改。

直接改配置文件

iStoreOS(OpenWrt)的 docker 配置文件可能在到 /etc/config/dockerd,并且格式与上方不相同,请自行修改!

部分 docker 配置文件可能还包含其他内容,如工作路径等,需要自行修改,请勿直接替换!

如果未安装管理面板,或管理面板改不了,可以执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://docker.1ms.run",
        "https://docker.1panel.live",
        "https://docker.m.ixdev.cn",
        "https://docker.mirrorify.net",
        "https://docker-pull.ygxz.in"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Podman

Podman 和 Docker 的区别:

对比项 Podman Docker
架构 无守护进程,直接与容器运行时(如 runc)交互 客户端-服务端架构,依赖后台守护进程 dockerd
Root 权限 默认支持 Rootless 模式(普通用户可直接运行容器) 传统模式需 Root 权限,后续支持 Rootless(需配置)
安全性 更高(无守护进程 + Rootless 默认),减少攻击面 守护进程以 Root 运行,存在潜在风险(Rootless 需手动启用)
镜像管理 完全兼容 Docker 镜像,支持 Docker Hub/私有仓库 原生支持 Docker 镜像,生态成熟
CLI 兼容性 命令与 Docker CLI 高度兼容(如 podman rundocker run CLI 为行业标准,Podman 反向兼容其语法
Systemd 集成 原生支持生成 Systemd 单元文件(podman generate systemd 需第三方工具或手动配置 Systemd 服务
镜像构建 支持 Dockerfile 及 podman build,集成 Buildah(更灵活的构建) 使用 docker build,依赖 Dockerfile
容器编排 依赖 Podman Compose 或 Kubernetes(无内置 Swarm) 内置 Docker Swarm,成熟但逐渐被 Kubernetes 取代
资源消耗 无后台进程,空闲时资源占用更低 守护进程常驻,占用一定内存/CPU
网络模型 使用 CNI(容器网络接口),与 Kubernetes 兼容 自有网络模型(如 bridgehost 等)
存储 Rootless 模式下,数据存储在用户目录(如 ~/.local/share/containers 默认使用 /var/lib/docker(需 Root 权限)
Pod 支持 原生支持 Pod(多容器组,类似 Kubernetes Pod) 需通过 Docker Compose 模拟多容器组
日志管理 依赖 Systemd Journal 或第三方工具 内置多种日志驱动(如 json-filesyslog
Windows/macOS 通过虚拟机或 WSL2 支持,体验有限 提供 Docker Desktop,原生支持良好
生态系统 社区增长中,红帽(Red Hat)主导,适合 RHEL/CentOS 环境 成熟,广泛支持,第三方工具丰富

文档:https://podman.io/docs/installation#registriesconf

由于支持 rootless 模式,会涉及到两种配置文件路径:

  • 全局配置文件:/etc/containers/registries.conf

  • 用户配置文件:~/.config/containers/registries.conf

Podman 比 Docker 更智能,可以对镜像的前缀进行自动替换:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
sudo cp -f /etc/containers/registries.conf /etc/containers/registries.conf.bak
sudo tee /etc/containers/registries.conf <<EOF
unqualified-search-registries = [ "docker.io" ]

# Docker Hub
[[registry]]
prefix = "docker.io"
location = "docker.m.ixdev.cn"
[[registry.mirror]]
location = "docker.1ms.run"
[[registry.mirror]]
location = "docker.1panel.live"
[[registry.mirror]]
location = "docker.mirrorify.net"
[[registry.mirror]]
location = "docker-pull.ygxz.in"

# GitHub Container Registry
[[registry]]
prefix = "ghcr.io"
location = "ghcr.m.ixdev.cn"
[[registry.mirror]]
location = "ghcr.nju.edu.cn"
[[registry.mirror]]
location = "ghcr.mirrorify.net"
[[registry.mirror]]
location = "ghcr-pull.ygxz.in"

# GitLab Container Registry
[[registry]]
prefix = "registry.gitlab.com"
location = "glcr.nju.edu.cn"

# Red Hat Quay Registry
[[registry]]
prefix = "quay.io"
location = "quay.m.ixdev.cn"
[[registry.mirror]]
location = "quay.nju.edu.cn"
[[registry.mirror]]
location = "quay.mirrorify.net"
[[registry.mirror]]
location = "quay-pull.ygxz.in"

# Google Container Registry
[[registry]]
prefix = "gcr.io"
location = "gcr.nju.edu.cn"
[[registry.mirror]]
location = "gcr.mirrorify.net"
[[registry.mirror]]
location = "gcr-pull.ygxz.in"

# Kubernetes Container Registry (Google)
[[registry]]
prefix = "k8s.gcr.io"
location = "gcr.nju.edu.cn/google-containers"
[[registry.mirror]]
location = "k8s-gcr.mirrorify.net"
[[registry.mirror]]
location = "k8s-gcr-pull.ygxz.in"

# Kubernetes Container Registry
[[registry]]
prefix = "registry.k8s.io"
location = "k8s.m.ixdev.cn"
[[registry.mirror]]
location = "k8s.nju.edu.cn"
[[registry.mirror]]
location = "k8s.mirrorify.net"
[[registry.mirror]]
location = "k8s-pull.ygxz.in"

# Microsoft Container Registry
# [[registry]]
# prefix = "mcr.microsoft.com"
# location = "mcr.microsoft.com"
# [[registry.mirror]]
# location = "mcr.mirrorify.net"
# [[registry.mirror]]
# location = "mcr-pull.ygxz.in"

# Elastic Docker registry
[[registry]]
prefix = "docker.elastic.co"
location = "elastic.m.ixdev.cn"
[[registry.mirror]]
location = "elastic.mirrorify.net"
[[registry.mirror]]
location = "elastic-pull.ygxz.in"

# NVIDIA GPU Cloud Container Registry
[[registry]]
prefix = "nvcr.io"
location = "nvcr.m.ixdev.cn"
[[registry.mirror]]
location = "nvcr.nju.edu.cn"
[[registry.mirror]]
location = "nvcr.mirrorify.net"
[[registry.mirror]]
location = "nvcr-pull.ygxz.in"
EOF

Containerd

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# Docker Hub
sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo tee /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://docker.io"

[host."https://docker.m.ixdev.cn"]
  capabilities = ["pull", "resolve"]

[host."https://docker.1ms.run"]
  capabilities = ["pull", "resolve"]

[host."https://docker.1panel.live"]
  capabilities = ["pull", "resolve"]

[host."https://docker.mirrorify.net"]
  capabilities = ["pull", "resolve"]

[host."https://docker-pull.ygxz.in"]
  capabilities = ["pull", "resolve"]
EOF

# GitHub Container Registry
sudo mkdir -p /etc/containerd/certs.d/ghcr.io
sudo tee /etc/containerd/certs.d/ghcr.io/hosts.toml <<EOF
server = "https://ghcr.io"

[host."https://ghcr.m.ixdev.cn"]
  capabilities = ["pull", "resolve"]

[host."https://ghcr.nju.edu.cn"]
  capabilities = ["pull", "resolve"]

[host."https://ghcr.mirrorify.net"]
  capabilities = ["pull", "resolve"]

[host."https://ghcr-pull.ygxz.in"]
  capabilities = ["pull", "resolve"]
EOF

# GitLab Container Registry
sudo mkdir -p /etc/containerd/certs.d/registry.gitlab.com
sudo tee /etc/containerd/certs.d/registry.gitlab.com/hosts.toml <<EOF
server = "https://registry.gitlab.com"

[host."https://glcr.nju.edu.cn"]
  capabilities = ["pull", "resolve"]
EOF

# Red Hat Quay Registry
sudo mkdir -p /etc/containerd/certs.d/quay.io
sudo tee /etc/containerd/certs.d/quay.io/hosts.toml <<EOF
server = "https://quay.io"

[host."https://quay.m.ixdev.cn"]
  capabilities = ["pull", "resolve"]

[host."https://quay.nju.edu.cn"]
  capabilities = ["pull", "resolve"]

[host."https://quay.mirrorify.net"]
  capabilities = ["pull", "resolve"]

[host."https://quay-pull.ygxz.in"]
  capabilities = ["pull", "resolve"]
EOF

# Google Container Registry
sudo mkdir -p /etc/containerd/certs.d/gcr.io
sudo tee /etc/containerd/certs.d/gcr.io/hosts.toml <<EOF
server = "https://gcr.io"

[host."https://gcr.nju.edu.cn"]
  capabilities = ["pull", "resolve"]

[host."https://gcr.mirrorify.net"]
  capabilities = ["pull", "resolve"]

[host."https://gcr-pull.ygxz.in"]
  capabilities = ["pull", "resolve"]
EOF

# Kubernetes Container Registry (Google) - 旧版
sudo mkdir -p /etc/containerd/certs.d/k8s.gcr.io
sudo tee /etc/containerd/certs.d/k8s.gcr.io/hosts.toml <<EOF
server = "https://k8s.gcr.io"

[host."https://gcr.nju.edu.cn/google-containers"]
  capabilities = ["pull", "resolve"]

[host."https://k8s-gcr.mirrorify.net"]
  capabilities = ["pull", "resolve"]

[host."https://k8s-gcr-pull.ygxz.in"]
  capabilities = ["pull", "resolve"]
EOF

# Kubernetes Container Registry - 新版
sudo mkdir -p /etc/containerd/certs.d/registry.k8s.io
sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml <<EOF
server = "https://registry.k8s.io"

[host."https://k8s.m.ixdev.cn"]
  capabilities = ["pull", "resolve"]

[host."https://k8s.nju.edu.cn"]
  capabilities = ["pull", "resolve"]

[host."https://k8s.mirrorify.net"]
  capabilities = ["pull", "resolve"]

[host."https://k8s-pull.ygxz.in"]
  capabilities = ["pull", "resolve"]
EOF

# Elastic Docker Registry
sudo mkdir -p /etc/containerd/certs.d/docker.elastic.co
sudo tee /etc/containerd/certs.d/docker.elastic.co/hosts.toml <<EOF
server = "https://docker.elastic.co"

[host."https://elastic.m.ixdev.cn"]
  capabilities = ["pull", "resolve"]

[host."https://elastic.mirrorify.net"]
  capabilities = ["pull", "resolve"]

[host."https://elastic-pull.ygxz.in"]
  capabilities = ["pull", "resolve"]
EOF

# NVIDIA GPU Cloud Container Registry
sudo mkdir -p /etc/containerd/certs.d/nvcr.io
sudo tee /etc/containerd/certs.d/nvcr.io/hosts.toml <<EOF
server = "https://nvcr.io"

[host."https://nvcr.m.ixdev.cn"]
  capabilities = ["pull", "resolve"]

[host."https://nvcr.nju.edu.cn"]
  capabilities = ["pull", "resolve"]

[host."https://nvcr.mirrorify.net"]
  capabilities = ["pull", "resolve"]

[host."https://nvcr-pull.ygxz.in"]
  capabilities = ["pull", "resolve"]
EOF

编辑 /etc/containerd/config.toml,确保 containerd 启用了 hosts 配置:

1
2
[plugins."io.containerd.grpc.v1.cri".registry]
  config_path = "/etc/containerd/certs.d"

然后重启 containerd:

1
sudo systemctl restart containerd

(可选)CF 优选 IP

CF Workers 默认分配的部分线路可能较差,导致单线程拉取镜像较慢(不能只看延迟),需要自行优选

不会优选可以直接 ping download.yunzhongzhuan.com,选择一个 IP 添加到 Hosts 中:

1
2
3
4
5
cat >> /etc/hosts << EOT
# Best IP for CF Workers Docker hub mirror
172.67.64.150 docker.1panel.live
172.67.64.150 hub.rat.dev
EOT

旁路由劫持

如果懒得配置镜像,且有旁路网关能够科学上网,可以通过主路由 DNS 劫持 + 静态路由 的方式实现免镜像加速,下层设备无需更改网关

关键参数:

1
2
3
4
5
domain:docker.io 54.236.113.205

domain:hub.docker.com 54.236.113.205

production.cloudflare.docker.com 104.16.97.215

KSpeeder

多镜像并发下载,动态负载均衡,断点续传支持,Docker 镜像代理服务

Docker 镜像加速专家 KSpeeder:https://kspeeder.istoreos.com/

介绍:https://www.bilibili.com/video/BV1LeZhYPEcD