1. 前言
云主机因为某些众所周知的原因,一直无法顺畅更新docker相关库,报错如下:
Err:17 https://download.docker.com/linux/ubuntu jammy/stable amd64 docker-ce-cli amd64 5:27.2.0-1~ubuntu.22.04~jammy
Connection timed out [IP: 13.32.50.74 443]
Err:18 https://download.docker.com/linux/ubuntu jammy/stable amd64 docker-ce amd64 5:27.2.0-1~ubuntu.22.04~jammy
Error reading from server - read (5: Input/output error) [IP: 13.32.50.110 443]
Err:19 https://download.docker.com/linux/ubuntu jammy/stable amd64 docker-ce-rootless-extras amd64 5:27.2.0-1~ubuntu.22.04~jammy
Could not handshake: Error in the pull function. [IP: 13.32.50.74 443]
Get:20 https://download.docker.com/linux/ubuntu jammy/stable amd64 docker-compose-plugin amd64 2.29.2-1~ubuntu.22.04~jammy [12.5 MB]
Err:20 https://download.docker.com/linux/ubuntu jammy/stable amd64 docker-compose-plugin amd64 2.29.2-1~ubuntu.22.04~jammy
Error reading from server - read (5: Input/output error) [IP: 13.32.50.48 443]
Fetched 17.7 MB in 52min 38s (5,619 B/s)
E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/containerd.io_1.7.21-1_amd64.deb Could not handshake: Error in the pull function. [IP: 13.32.50.112 443]
E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-buildx-plugin_0.16.2-1%7eubuntu.22.04%7ejammy_amd64.deb Error reading from server - read (5: Input/output error) [IP: 13.32.50.74 443]
E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce-cli_27.2.0-1%7eubuntu.22.04%7ejammy_amd64.deb Connection timed out [IP: 13.32.50.74 443]
E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce_27.2.0-1%7eubuntu.22.04%7ejammy_amd64.deb Error reading from server - read (5: Input/output error) [IP: 13.32.50.110 443]
E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce-rootless-extras_27.2.0-1%7eubuntu.22.04%7ejammy_amd64.deb Could not handshake: Error in the pull function. [IP: 13.32.50.74 443]
E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-compose-plugin_2.29.2-1%7eubuntu.22.04%7ejammy_amd64.deb Error reading from server - read (5: Input/output error) [IP: 13.32.50.48 443]
虽然不影响应用正常运行,但是每次update的时候,看到如下报错信息,实在有些烦心。
因此着手替换工作,将当前Ubuntu实例中的docker镜像切换至阿里云的docker镜像。
2.更新镜像
阿里云docker-ce镜像站推荐操作方式(适用于Ubuntu 14.04/16.04):
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
按照如上方式更新镜像源,执行第二步安装GPG证书时,会输出如下提示:
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
并且此提示,后续执行sudo apt update
会弹出如下提示内容:
W: https://mirrors.aliyun.com/docker-ce/linux/ubuntu/dists/jammy/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
3. 解决证书导入提示
3.1 apt-key弃用原因
apt-key
命令被弃用(deprecated)的原因主要是为了提高安全性和简化密钥管理。以下是一些具体原因:
3.1.1 安全性问题
全局信任:
apt-key
将所有导入的密钥存储在一个全局信任的密钥环中,这意味着任何导入的密钥都可以用于验证所有APT源的包。这种全局信任机制增加了安全风险,因为一个被破坏的密钥可以影响所有的APT源。难以管理:随着时间的推移,密钥环中的密钥数量可能会增加,管理和审计这些密钥变得更加困难。
3.1.2 更细粒度的控制
每个源独立管理:通过将密钥文件存储在
/etc/apt/trusted.gpg.d/
目录中,可以为每个APT源独立管理密钥。这种方式提供了更细粒度的控制,允许你为每个源指定特定的密钥,而不是将所有密钥放在一个全局信任的密钥环中。简化密钥更新:独立管理密钥文件使得更新和删除特定源的密钥变得更加容易,而不需要操作整个密钥环。
3.1.3 现代化和标准化
现代化的密钥管理:弃用
apt-key
是APT项目现代化的一部分,旨在采用更标准和安全的密钥管理方法。与其他工具一致:许多现代包管理工具和系统(如
yum
、dnf
等)已经采用了类似的密钥管理方法,弃用apt-key
使APT与这些工具的行为更加一致。
3.2 导出二进制格式GPG证书
阿里云上下载的证书为ASCII装甲格式证书,下载后存储至/etc/apt/trusted.gpg.d/
无法被正确识别,示例如下(直接看最底下一行提示):
因此,需要对下载的证书进行转换,操作步骤如下所示:
root@VM-4-12-ubuntu:/data# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o docker-ce.gpg
root@VM-4-12-ubuntu:/data# sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker-ce.gpg ./docker-ce.gpg
gpg --dearmor -o
命令用于将ASCII装甲(armored)格式的GPG密钥文件转换为二进制格式,并将输出保存到指定的文件中。这在管理APT密钥时特别有用,因为APT通常需要二进制格式的密钥文件。
gpg:GNU Privacy Guard(GPG)命令行工具,用于加密、解密、签名和验证数据。
--dearmor:将ASCII装甲格式的文件转换为二进制格式。
-o:指定输出文件。
此后执行sudo apt update
,恼人的提示就不会再出现了。
3.3 已有证书格式转换
如果前序已经将证书添加至/etc/apt/trusted.gpg
,如下所示:
可以按照如下方式,将已有的证书导入/etc/apt/trusted.gpg.d/
,首先截取当前证书的短ID:0EBFCD88(证书pub行末尾八位),执行如下命令:
sudo apt-key export 0EBFCD88| sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker-ce.gpg
此后执行sudo apt update
,恼人的提示就不会再出现了。