Docker安装+可用镜像收集

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

安装

手动安装

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

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

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

需要注意的是,在该帮助提供的命令中,默认的 gpg 密钥下载地址仍为 mirrors.cernet.edu.cn/docker-ce,这么做可以增加安全性,但如果你无法访问,可以将其替换为 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
20
21
22
23
24
# Uninstall all conflicting packages:
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc podman-docker containerd runc | cut -f1)

# Add the repository to Apt sources:
# Add Docker's official GPG key:
sudo apt update
sudo apt 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:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://mirrors.cernet.edu.cn/docker-ce/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

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

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

注意,官方 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 标签可能较老,请尽量带版本号拉取。
  • 不建议用于生产环境,且生产环境建议固定版本号并备份镜像到本地。
  • 对于使用第三方镜像造成的后果,与本人无关,请尽量选择可信镜像。

搭建

免费公开的薅得多会跑路,能自建更好。建议自建。

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

HubProxy

Docker 和 GitHub 加速代理服务器

一个轻量级、高性能的多功能代理服务,提供 Docker 镜像加速、GitHub 文件加速、下载离线镜像、在线搜索 Docker 镜像等功能。

https://github.com/sky22333/hubproxy

设置方法

从面板修改

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
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://docker.1ms.run",
        "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
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-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-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-pull.ygxz.in"

# Google Container Registry
[[registry]]
prefix = "gcr.io"
location = "gcr.nju.edu.cn"
[[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-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-pull.ygxz.in"

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

# Elastic Docker registry
[[registry]]
prefix = "docker.elastic.co"
location = "elastic.m.ixdev.cn"
[[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-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
# 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-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-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-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-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-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-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-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-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