Ubuntu 22.04 Docker 安装实战:从 Command not found 到 context deadline exceeded 的全过程排查

🚀 Ubuntu 22.04 Docker 安装实战:从 Command not foundcontext deadline exceeded 的全过程排查

嘿,各位渴望驰骋在云原生大海的伙伴们!👋

Docker 无疑是现代软件开发和部署的“集装箱”,能极大地简化我们的工作。然而,在将这艘巨轮驶入我们自己的港口(服务器)时,有时会遇到一些意想不到的暗流和礁石。

今天,我想和大家分享一次我在全新的 Ubuntu 22.04 LTS (Long Term Support, 长期支持版) 服务器上安装 Docker 的完整经历。这趟旅程并非一帆风顺,我们遭遇了 Command 'curl' not found 的小尴尬,并在安装成功后,又面临了 context deadline exceeded 这个更深层次的网络“拦路虎”。

让我们一起复盘这次探险,看看是如何一步步诊断问题,并最终让 Docker 成功扬帆起航的!

第一站:准备工作 - 遭遇第一个“拦路虎”

我的目标是在一台新配置的 Ubuntu 22.04 服务器上,按照 Docker 官方文档的指引,安装 Docker Engine。

1. 更新软件包列表
一切都始于一个好习惯:

sudo apt-get update

这个过程很顺利,系统成功地从镜像源获取了最新的软件包信息。

2. 添加 Docker 的 GPG 密钥
官方文档的下一步是下载并添加 Docker 的 GPG (GNU Privacy Guard) 密钥,以验证软件包的真实性。我信心满满地敲下了命令:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

然而,终端却给了我一个意外的回应:

Command 'curl' not found, but can be installed with:
sudo apt install curl

案情分析:原来我这台最小化安装的 Ubuntu 22.04 服务器,默认并没有安装 curl 这个常用的网络工具!curl 是执行网络请求和文件下载的利器,是这一步操作必不可少的“扳手”。

解决方案:听从系统的友好建议,先安装 curl

sudo apt install curl

安装成功后,我再次执行添加 GPG 密钥的命令,这次一切顺利!

第二站:乘风破浪 - Docker 的顺利安装

解决了 curl 的问题后,接下来的安装过程就如官方文档所描述的一样,一气呵成。

1. 设置 Docker 的软件源:

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2. 安装 Docker Engine:

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

看着终端上滚动的一系列下载和安装日志,我知道 Docker 这艘巨轮正在稳稳地驶入我的港口。

第三站:首航测试 - 撞上“网络冰山”

安装成功后,激动人心的时刻到了!我执行了 Docker 的“Hello World”命令,来验证安装是否成功:

sudo docker run hello-world

然而,等待我的不是亲切的“Hello from Docker!”,而是冰冷的错误信息:

Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded

案情再次变得复杂!我们来解剖这个错误:

  • Unable to find image 'hello-world:latest' locally: 这部分是正常的。它告诉我们,本地没有 hello-world 镜像,Docker 需要去网上下载。
  • Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded: 这才是真正的“冰山”!
    • daemon: 指的是 Docker 的后台服务 dockerd
    • Get "https://registry-1.docker.io/v2/": Docker 守护进程尝试去访问 Docker Hub 的官方镜像仓库地址。
    • context deadline exceeded: 这是一个非常典型的网络超时错误。它意味着 Docker 发出了连接请求,但在规定的时间内没有收到任何有效的回应。

初步诊断: Docker 服务本身是好的,但它无法连接到外网的 Docker Hub

为了验证 Docker 服务本身的状态,我执行了:

systemctl status docker

返回结果显示 Active: active (running),这证实了 Docker 守护进程是正常运行的。

最终结论:问题不在于 Docker 安装,而在于服务器的网络环境!很可能是防火墙网络策略阻止了 Docker 守护进程向外发起连接。

破案关键:网络排查

这种情况通常由以下原因导致:

  1. 服务器防火墙 (UFW/firewalld): 服务器自身的防火墙可能禁止了出站(Egress)的网络连接。
  2. 公司网络/局域网防火墙 🧱: 你所在的局域网,其路由器或硬件防火墙可能限制了内部服务器访问外部特定网站(如 Docker Hub)。
  3. DNS (Domain Name System, 域名系统) 解析问题: 服务器可能无法将 registry-1.docker.io 这个域名正确解析成 IP 地址。
  4. 网络代理问题: 如果服务器需要通过代理才能上网,而 Docker 没有被正确配置代理。

总结与反思

这次 Docker 的安装之旅,虽然一波三折,但却是一次宝贵的实战演练:

  1. 最小化安装的“惊喜”: 永远不要想当然地认为服务器上已经安装了 curl 这样的基础工具。
  2. 分步验证的重要性: sudo docker run hello-world 不仅仅是验证 Docker 是否安装,更是对 Docker 网络连通性的一次大考。
  3. 理解错误信息: command not foundcontext deadline exceeded 是两种完全不同性质的错误,前者是“缺少工具”,后者是“道路不通”,精准定位是解决问题的第一步。
  4. 从应用问题到网络问题: 当一个应用程序(如 Docker)无法连接到其云端服务时,要学会将排查思路从应用本身,扩展到服务器的网络环境、防火墙和 DNS 配置。

最终,通过配置防火墙或解决 DNS 问题,hello-world 成功运行。虽然过程曲折,但每一次排查,都让我们对系统和网络的理解更深一层。

Happy Dockering! 🐳✨

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值