🚀 Ubuntu 22.04 Docker 安装实战:从 Command not found 到 context 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 守护进程向外发起连接。
破案关键:网络排查
这种情况通常由以下原因导致:
- 服务器防火墙 (UFW/firewalld): 服务器自身的防火墙可能禁止了出站(Egress)的网络连接。
- 公司网络/局域网防火墙 🧱: 你所在的局域网,其路由器或硬件防火墙可能限制了内部服务器访问外部特定网站(如 Docker Hub)。
- DNS (Domain Name System, 域名系统) 解析问题: 服务器可能无法将
registry-1.docker.io这个域名正确解析成 IP 地址。 - 网络代理问题: 如果服务器需要通过代理才能上网,而 Docker 没有被正确配置代理。
总结与反思
这次 Docker 的安装之旅,虽然一波三折,但却是一次宝贵的实战演练:
- 最小化安装的“惊喜”: 永远不要想当然地认为服务器上已经安装了
curl这样的基础工具。 - 分步验证的重要性:
sudo docker run hello-world不仅仅是验证 Docker 是否安装,更是对 Docker 网络连通性的一次大考。 - 理解错误信息:
command not found和context deadline exceeded是两种完全不同性质的错误,前者是“缺少工具”,后者是“道路不通”,精准定位是解决问题的第一步。 - 从应用问题到网络问题: 当一个应用程序(如 Docker)无法连接到其云端服务时,要学会将排查思路从应用本身,扩展到服务器的网络环境、防火墙和 DNS 配置。
最终,通过配置防火墙或解决 DNS 问题,hello-world 成功运行。虽然过程曲折,但每一次排查,都让我们对系统和网络的理解更深一层。
Happy Dockering! 🐳✨

155

被折叠的 条评论
为什么被折叠?



