在 Docker 的“镜像沼泽”里爬了一天,我终于看到了 Hello Docker
这不是一篇高深的 Docker 源码分析,而是一个真实的新手闯关实录。如果你也曾在拉取镜像时被
no such host和pull access denied折磨过,这篇文章或许能让你少走一些弯路。
起因:只是想跑个网页而已
今天的任务很简单:用 Docker 跑一个静态网页。我下载了 Docker Desktop,配置了镜像加速器,然后敲下了第一行命令:
bash
docker run hello-world
结果……并没有出现想象中的 Hello from Docker!,而是一行冷冰冰的报错:
text
no such host
那一刻我才意识到,Docker 的世界没有“自动挡”,每一脚油门都可能踩进坑里。
第一次挣扎:镜像加速器换了一轮又一轮
我先是删掉了解析不了的清华源,换上了百度云和中科大。hello-world 成功跑了出来,我沾沾自喜,以为胜利就在眼前。
可当我开始执行 docker init 创建项目,再用 docker compose up -d 启动时,真正的噩梦才刚刚开始:
-
腾讯云 →
no such host -
百度云 →
connection refused -
阿里云 →
pull access denied
是的,国内三大镜像源,在我这儿集体“罢工”了。我又把 registry-mirrors 清空,直连官方仓库——结果因为 IPv6 超时,依然连不上。
我开始怀疑人生:到底是 Docker 的问题,还是我网络的问题?
转折点:原来还要 docker login
在朋友的提醒下,我执行了 docker login。浏览器弹出了一个设备码验证页面,我输入了终端里那串乱码般的 DWXD-WXWM,终于看到了:
text
Login Succeeded
原来,不登录就连公开镜像都拉不下来(因为 Docker Hub 有拉取频率限制)。这个教训,我记下了。
真正的拦路虎:BuildKit 和那个该死的 dockerfile:1
登录之后,我以为问题解决了。结果再次执行 docker compose up -d,终端又卡在了这里:
text
resolve image config for docker.io/docker/dockerfile:1 pull access denied
后来才知道,这是新版构建器 BuildKit 在拉取一个辅助镜像,但我的网络死活下不来。查了一圈,解决方案出奇地简单:
bash
set DOCKER_BUILDKIT=0
强制禁用 BuildKit,用旧版构建器。那一瞬间,php:8.1-apache 的 400 多 MB 镜像开始疯狂滚动 Pull complete……
最终胜利:在浏览器里看到 "Hello Docker"
当终端最终弹出绿色的:
text
✔ Container my-first-app-server-1 Started
我差点在椅子上跳起来。然后我打开浏览器,在地址栏输入 localhost:9000,屏幕上赫然显示着:
text
"Hello Docker"
那一刻,我觉得这一天的所有报错、所有 no such host、所有 pull access denied,都值了。
我学到的 5 件事
-
镜像加速器不是万能的——如果 DNS 解析不了,再快的镜像源也没用。
-
docker login是必选项——即使拉取公开镜像,登录也能避免很多权限问题。 -
BuildKit 虽好,但有时需要“绕行”——如果卡在
docker/dockerfile:1,试试禁用 BuildKit。 -
别把网址敲进终端——
localhost:9000是给浏览器看的,黑窗口不认识它。 -
报错不可怕,可怕的是不看报错——今天的每一个报错都在告诉我下一步该做什么。
结尾
如果你也正在 Docker 的入门路上挣扎,希望今天的经历能让你知道:你不是一个人。那些红色的报错信息,不是你笨,而是 Docker 在用它自己的方式教你一步步理解它。
现在,我要去改 index.html 里的内容了,毕竟 Hello Docker 已经看够了。下次见。
更多推荐



所有评论(0)