跳到主要内容

Docker连接错误解决

阅读需 6 分钟
wqz

[!WARNING]

ERROR: failed to solve: xxx: failed to resolve source metadata for docker.io/library/xxx: failed to authorize: failed to fetch oauth token: Post "https://auth.docker.io/token": dial tcp [2a03:2880:f131:83:face:b00c:0:25de]:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

image-20241108224528063

这个错误通常是由于网络连接问题导致的,尤其是当 Docker 尝试从 Docker Hub 拉取镜像时未能获得授权或请求超时。可能的原因和解决方法如下:

  1. 网络连接问题

    • 该错误的根本原因可能是网络问题,导致 Docker 无法连接到 Docker Hub。可以尝试更换网络环境,例如连接到不同的 Wi-Fi 或尝试有线网络。
    • 使用 VPN 工具(如果网络限制导致访问 Docker Hub 出现问题),尝试通过 VPN 连接后重新执行命令。
  2. 镜像代理设置

    • 配置 Docker 镜像加速器,比如阿里云或其他国内的 Docker 镜像服务提供商。配置方法如下:
      • 打开 Docker Desktop,进入 Settings > Docker Engine

      • 在 JSON 配置中添加镜像加速器配置,例如:

        "registry-mirrors": ["https://registry.docker-cn.com"]

        或者:

         "registry-mirrors": [
        "https://mirror.aliyuncs.com"
        ]
      • 保存并重启 Docker。

      • image-20241108224727376

  3. 清理 Docker 缓存

    • 有时 Docker 的缓存可能导致构建失败。可以通过以下命令清理 Docker 的构建缓存:
      docker builder prune
    • 清理缓存后,重新尝试构建镜像。
  4. 手动拉取镜像

    • 可以尝试手动拉取镜像 xxx

      docker pull xxx

      image-20241108225711554

      [!CAUTION]

      docker pull xxx Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

      这个错误表明 Docker 在连接 Docker Hub 时遇到了超时问题。以下是一些可以帮助解决此问题的方法:

      1. 检查网络连接

      • 确保你有稳定的互联网连接,特别是可以访问国外的网络。
      • 如果网络连接不稳定或受到限制,可以尝试切换到不同的 Wi-Fi、重启路由器,或者尝试使用手机热点。

      2. 测试 Docker Hub 是否可访问

      • 可以在浏览器中打开以下地址,确认是否可以访问 Docker Hub 的 API 接口:

        https://registry-1.docker.io/v2/
      • 如果可以访问,说明网络连接到 Docker Hub 正常。

        image-20241108230129606

        这个错误表示 Docker 客户端在尝试连接到 Docker Hub 时没有正确完成身份验证。可以尝试以下方法来解决此问题:

        1. 登录 Docker Hub

        • 确保你已登录 Docker Hub。可以在命令行中使用以下命令登录:

          docker login
        • 系统会提示你输入 Docker Hub 的用户名和密码。输入正确的凭据后,Docker 客户端将存储你的登录信息,再次执行拉取镜像的操作应该就不会遇到身份验证问题。

        2. 检查 Docker Hub 账号状态

        • 如果你未注册 Docker Hub 账号,可以先在 Docker Hub 注册页面 创建一个免费账号。
        • 确保账号未被禁用或受限,否则可能会影响对镜像的拉取操作。

        3. 重新尝试拉取镜像

        • 登录成功后,再次尝试拉取镜像:

          docker pull xxx

          image-20241108230256370

        4. 检查 Docker 配置文件

        • 如果已登录,但仍然遇到相同错误,可以检查 Docker 的配置文件(一般位于 ~/.docker/config.json),确保其中的 auths 部分包含 docker.ioregistry-1.docker.io 的登录信息。
        • 如果没有,可以尝试删除此文件并重新登录,或者手动添加 Docker Hub 的认证信息。

        5. 更新 Docker Desktop

        • 确保 Docker Desktop 是最新版本。较旧的版本可能会有一些已知的身份验证问题。

      4. 增加 Docker 的超时时间

      • 有时是因为默认的超时时间不够。可以在 Docker CLI 命令中增加超时设置:

        docker --config ~/.docker pull xxx
      • 或者尝试在 Docker 的配置文件中手动增加 default-timeout 的设置(例如,改为 300 秒)。

      5. 重启 Docker 服务

      • 在 Docker Desktop 中点击重启按钮,或者在命令行中通过以下命令重启 Docker 服务:

        sudo systemctl restart docker  # Linux 用户

      6. 手动拉取替代版本或使用本地镜像

      • 尝试拉取其他版本的 Node 镜像,或使用本地的 Node 镜像来完成构建(如果已有其他版本的 Node 镜像)。

      这些方法通常可以有效解决因网络问题导致的 Docker 超时错误。

    • 然后再构建镜像:

      docker build -t hello-docker .

      [!WARNING]

      image-20241108230525319

      这个警告提示是因为在 Dockerfile 中使用了 CMD 指令来启动程序,但是 CMD 的参数没有使用 JSON 格式。JSON 格式在某些场景下可以避免操作系统信号引起的意外行为,尤其是在容器的信号传递和进程控制方面更为可靠。

      解决方法

      CMD 指令从字符串形式改为 JSON 数组形式。具体修改方法如下:

      假设你的 Dockerfile 内容如下:

      FROM node:14-alpine
      COPY index.js /index.js
      CMD node /index.js

      CMD 修改为 JSON 数组格式:

      FROM node:14-alpine
      COPY index.js /index.js
      CMD ["node", "/index.js"]

      为什么使用 JSON 格式

      • JSON 格式 CMD ["node", "/index.js"] 直接执行命令,不依赖 shell,从而避免信号传递问题。
      • 字符串格式 CMD node /index.js 默认通过 shell (/bin/sh -c) 执行,可能会导致在处理信号(如 SIGTERM)时行为不一致。

      这样修改后,Dockerfile 的警告应该会消失,并且在执行时也会更加可靠。

  5. 检查 Docker 服务状态

    • 确保 Docker Desktop 服务正在正常运行,建议尝试重新启动 Docker Desktop。

docker run -d \ --name cflow \ --publish 5230:5230 \ --volume C:\Users\wang\Desktop\cflow-blog\memos:/var/opt/memos \ cflow:latest \ --mode prod

分享这篇文章
Loading Comments...