Docker BUG排查

问题描述:

在刚安装完docker,执行sudo docker pull hello-world 来测试 docker 是否安装成功时,报错:

复制代码
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Retrying in 1 second 
docker: error pulling image configuration: download failed after attempts=6: dial tcp [2a03:2880:f130:83:face:b00c:0:25de]:443: i/o timeout.
See 'docker run --help'.

原因及解决方案:

Docker 守护进程作为一个后台服务运行,它并不会读取或继承用户的 shell 环境变量(除非在启动时特别指定)。为了确保 Docker 在拉取镜像或进行其他网络通讯时能够通过代理服务器,必须在 Docker 的服务配置中设置这些代理变量。

如果你的代理服务器运行在本地机器上,并且使用的端口是 7890,你需要在 Docker 的配置文件中设置这些代理参数以确保 Docker 通过这个本地代理端口进行网络通信。以下是具体的配置文件内容:

创建或编辑 /etc/systemd/system/docker.service.d/http-proxy.conf 文件:

首先,你需要确保有一个目录来存放 Docker 的服务配置。如果这个目录还不存在,你可以使用以下命令创建它:

复制代码
sudo mkdir -p /etc/systemd/system/docker.service.d

接着,使用文本编辑器创建或编辑 http-proxy.conf 文件:

复制代码
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

在打开的编辑器中,输入以下内容:

复制代码
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"

这里配置了 HTTP 和 HTTPS 代理都指向 127.0.0.1 的 7890 端口。NO_PROXY 环境变量指定了不需要通过代理访问的地址列表,通常包括本地地址和内部网络地址等。

保存并关闭编辑器:

如果你使用的是 nano 编辑器,可以通过按 Ctrl+O 保存文件,然后按 Ctrl+X 退出编辑器。

如果用的是vim,则按esc键,然后输入:wq保存退出。

重新加载系统守护进程并重启 Docker 服务:

为了让这些更改生效,你需要重新加载系统守护进程并重启 Docker 服务:

复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker

这样,Docker 服务在启动和运行时就会使用本地的 7890 端口的代理服务器进行网络通信。可以通过尝试拉取一个 Docker 镜像来测试代理配置是否生效:

复制代码
sudo docker run hello-world

如果这个命令能够成功执行,并且能够从 Docker Hub 拉取镜像,那么就说明你的代理配置是正确的。如果遇到连接问题,需要检查本地代理服务器是否正常运行在指定端口上。

成功运行的输出:

复制代码
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete 
Digest: sha256:266b191e926f65542fa8daaec01a192c4d292bff79426f47300a046e1bc576fd
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
相关推荐
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun3 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21
春天花会开1314 天前
Supabase 自部署 Edge Functions 超时从 60s 延长到 360s 完整复盘
运维·云原生
ysu_03144 天前
【2026】K8s GPU调度空占怎么解?Kueue与Volcano Gang配置
云原生·kubernetes·gpu算力·volcano·ai基础设施·kueue·gang scheduling
天天喝旺仔5 天前
分布式服务容错实战:用 Sentinel 实现限流、熔断与降级
分布式·微服务·云原生·sentinel
逐流人5 天前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
运维开发王义杰6 天前
跨项目直连数据库:是架构反模式,还是现实的工程妥协?
云原生