这不是一篇高深的 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 件事

  1. 镜像加速器不是万能的——如果 DNS 解析不了,再快的镜像源也没用。

  2. docker login 是必选项——即使拉取公开镜像,登录也能避免很多权限问题。

  3. BuildKit 虽好,但有时需要“绕行”——如果卡在 docker/dockerfile:1,试试禁用 BuildKit。

  4. 别把网址敲进终端——localhost:9000 是给浏览器看的,黑窗口不认识它。

  5. 报错不可怕,可怕的是不看报错——今天的每一个报错都在告诉我下一步该做什么。

结尾

如果你也正在 Docker 的入门路上挣扎,希望今天的经历能让你知道:你不是一个人。那些红色的报错信息,不是你笨,而是 Docker 在用它自己的方式教你一步步理解它。

现在,我要去改 index.html 里的内容了,毕竟 Hello Docker 已经看够了。下次见。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐