解決 Ubuntu 上 Docker 安裝與網絡問題:從禁用 IPv6 到配置代理

解決 Ubuntu 上 Docker 安裝與網絡問題的實踐筆記

在 Ubuntu(Noble 版本)上安裝 Docker 時,我遇到了兩個常見的網絡問題:apt-get update 失敗和無法拉取 Docker 鏡像。通過逐步排查和配置,最終成功運行 docker run hello-world。這篇筆記整理了我的解決過程,重點講解了禁用 IPv6為 Docker 守護進程配置代理的原理與操作,幫助讀者理解并復現。


問題背景

我按照 Docker 官方文檔的 Install using the apt repository 方法,在 Ubuntu 上安裝 Docker。使用的命令如下:

# 更新軟件源并安裝依賴
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings# 添加 Docker GPG 密鑰
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc# 添加 Docker 軟件源
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update# 安裝 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安裝過程順利,但運行測試命令時遇到問題:

sudo docker run hello-world

報錯如下:

Unable to find image 'hello-world:latest' locally
docker: 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)

此外,最初運行 sudo apt-get update 時也遇到錯誤,提示無法連接 Docker 倉庫。


問題 1:apt-get update 失敗

現象

運行 sudo apt-get update 時,出現以下錯誤:

錯誤:1 https://download.docker.com/linux/ubuntu noble InReleaseCould not handshake: Error in the pull function. [IP: 2600:9000:2804:5800:3:db06:4200:93a1 443]
W: 無法下載 https://download.docker.com/linux/ubuntu/dists/noble/InRelease

原因分析

錯誤信息中的 IP 地址(2600:9000:...)是一個 IPv6 地址,表明系統嘗試通過 IPv6 連接 Docker 倉庫,但失敗了。可能的原因包括:

  • 網絡對 IPv6 支持不穩定:某些網絡環境(如國內部分運營商)對 IPv6 的支持不完善,導致連接超時或失敗。
  • Docker 倉庫的 IPv6 配置問題:服務器可能優先返回 IPv6 地址,但實際連接不可靠。

解決方案:禁用 IPv6

為了強制系統使用 IPv4,我臨時禁用了 IPv6:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

然后再次運行:

sudo apt-get update

這次更新成功,沒有報錯。

為什么禁用 IPv6?

  • IPv6 vs IPv4:IPv6 是下一代互聯網協議,但許多網絡和服務器對 IPv6 的支持仍不完善。如果系統優先嘗試 IPv6 連接,而目標服務器的 IPv6 不可靠,就會導致超時或連接失敗。
  • 命令解析
    • sysctl -w net.ipv6.conf.all.disable_ipv6=1:禁用所有網絡接口的 IPv6。
    • sysctl -w net.ipv6.conf.default.disable_ipv6=1:為新創建的網絡接口禁用 IPv6。
    • 這些命令通過修改內核參數(/proc/sys/net/ipv6/conf/...)臨時禁用 IPv6,重啟后會失效。
  • 適用場景:如果你的網絡環境不支持 IPv6,或者目標服務器的 IPv6 連接不穩定,禁用 IPv6 是快速有效的解決方法。

注意事項

  • 臨時性:上述命令僅在當前會話有效。如果需要永久禁用 IPv6,需編輯 /etc/sysctl.conf
    sudo nano /etc/sysctl.conf
    
    添加:
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
    
    保存后應用:
    sudo sysctl -p
    
  • 風險:禁用 IPv6 可能影響依賴 IPv6 的服務,建議在確認網絡環境后使用。

問題 2:無法拉取 hello-world 鏡像

現象

安裝 Docker 后,運行 sudo docker run hello-world 報錯:

Unable to find image 'hello-world:latest' locally
docker: 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(registry-1.docker.io)拉取鏡像,原因是連接超時。進一步排查發現:

  • 我使用了代理(http://127.0.0.1:7897),通過以下命令驗證:
    curl -v https://registry-1.docker.io/v2/
    
    輸出顯示 curl 通過代理成功連接(返回 401 Unauthorized,正常現象,因為需要認證)。
  • 但是,Docker 守護進程(dockerd)并未使用代理,導致無法訪問 Docker Hub。

為什么需要為 Docker 守護進程配置代理?

  • Docker 架構:Docker 采用客戶端-服務器架構。運行 docker run 時,客戶端(docker 命令)與守護進程(dockerd)通信,守護進程負責拉取鏡像和運行容器。
  • 環境變量隔離:用戶的代理環境變量(HTTP_PROXYHTTPS_PROXY)只對客戶端命令生效,守護進程默認不繼承這些設置。
  • 網絡限制:在國內,Docker Hub 的訪問可能因網絡限制而失敗,代理或鏡像加速器是常見解決方案。

解決方案:為 Docker 守護進程配置代理

我通過以下步驟為 Docker 守護進程配置了代理:

  1. 創建代理配置文件

    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
    

    添加以下內容:

    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:7897"
    Environment="HTTPS_PROXY=http://127.0.0.1:7897"
    Environment="NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,172.29.0.0/16,::1"
    
    • 解析
      • HTTP_PROXYHTTPS_PROXY:指定代理地址(127.0.0.1:7897 是本地代理服務地址)。
      • NO_PROXY:定義不需要代理的地址范圍(如本地地址和常見內網 IP 段),避免本地通信走代理。
      • 文件路徑 /etc/systemd/system/docker.service.d/:Systemd 允許為服務添加自定義配置,http-proxy.conf 會覆蓋 Docker 的默認服務設置。
  2. 重新加載并重啟 Docker

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    • daemon-reload:通知 Systemd 重新加載配置文件。
    • restart docker:重啟 Docker 服務以應用新配置。
  3. 驗證服務狀態

    sudo systemctl status docker
    

    確認服務狀態為 active (running)

  4. 測試拉取鏡像

    sudo docker run hello-world
    

    這次命令成功運行,輸出:

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

理解代理配置

  • 為什么單獨配置守護進程?
    Docker 守護進程是一個獨立運行的后臺服務(通過 Systemd 管理),它不讀取用戶的 shell 環境變量(如 export HTTPS_PROXY)。因此,必須通過 Systemd 配置文件顯式設置代理。

  • NO_PROXY 的作用
    NO_PROXY 防止本地通信(如守護進程與客戶端之間的通信)被代理攔截。例如,localhost127.0.0.1 是 Docker 客戶端與守護進程通信的常用地址,192.168.0.0/16 等內網地址常用于容器網絡。

  • 適用場景
    如果你的網絡環境需要代理訪問外部資源(如國內訪問 Docker Hub),或者企業網絡有代理要求,必須為守護進程配置代理。


最終結果

通過禁用 IPv6 和為 Docker 守護進程配置代理,我成功解決了網絡問題,docker run hello-world 正常運行。輸出表明 Docker 客戶端、守護進程和 Docker Hub 的通信都正常。


經驗總結與建議

  1. 禁用 IPv6 的場景

    • 當遇到類似 Could not handshake 的錯誤,且 IP 地址是 IPv6 時,禁用 IPv6 是快速排查方法。
    • 注意檢查網絡環境,確認是否需要長期禁用 IPv6。
  2. 代理配置的通用性

    • 如果使用代理,確保客戶端和守護進程都配置正確。
    • NO_PROXY 需根據網絡環境調整,包含所有本地和內網地址。
  3. 國內用戶優化

    • 考慮配置鏡像加速器(如阿里云、騰訊云)以提高拉取速度:
      sudo nano /etc/docker/daemon.json
      
      添加:
      {"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
      }
      
      重啟 Docker:
      sudo systemctl restart docker
      
  4. 權限優化

    • 為避免每次使用 sudo,將用戶添加到 docker 組:
      sudo usermod -aG docker $USER
      
      注銷后重新登錄即可。
  5. 進一步學習

    • 嘗試運行復雜容器:docker run -it ubuntu bash
    • 探索 Docker Hub 和官方文檔:https://docs.docker.com/get-started/。

結語

這次安裝 Docker 的過程讓我深入理解了網絡配置對 Docker 的影響。禁用 IPv6 解決了軟件源更新的問題,而為守護進程配置代理確保了鏡像拉取的成功。希望這篇筆記能幫助你在遇到類似問題時快速定位和解決,同時對 Docker 的網絡機制有更深的認識!


這篇博客簡潔明了,涵蓋了問題的現象、原因、解決方案以及背后的原理,適合初學者和有一定經驗的用戶參考。如果你有其他需求(例如添加圖片、代碼高亮,或調整語氣),請告訴我!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75528.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

指針的進階2

六、函數指針數組 字符指針數組 - 存放字符指針的數組 char* arr[10] 整型指針數組 - 存放整型指針的數組 int* arr[10] 函數指針數組 - 存放函數指針的數組 void my_strlen() {} int main() {//指針數組char* ch[5];int arr[10] {0};//pa是是數組指針int (*pa)[10] &…

速盾:高防CDN節點對收錄有影響嗎?

引言 搜索引擎收錄是網站運營中至關重要的環節,它直接影響著網站的曝光度和流量。近年來,隨著網絡安全威脅的增加,許多企業開始采用高防CDN(內容分發網絡)來保護其網站免受DDoS攻擊和其他形式的網絡攻擊。然而&#x…

2025藍橋杯省賽C/C++研究生組游記

前言 至少半年沒寫算法題了,手生了不少,由于python寫太多導致行末老是忘記打分號,printf老是忘記寫f,for和if的括號也老是忘寫,差點連&&和||都忘記了。 題目都是回憶版本,可能有不準確的地方。 …

Quill富文本編輯器支持自定義字體(包括新舊兩個版本,支持Windings 2字體)

文章目錄 1 新版(Quill2 以上版本)2 舊版(Quill1版本) 1 新版(Quill2 以上版本) 注意:新版設置 style"font-family: Wingdings 2" 這種帶空格的字體樣式會被過濾掉,故需特…

dbt:新一代數據轉換工具

dbt(Data Build Tool)一款專為數據分析和工程師設計的開源工具,專注于 ETL/ELT 流程的數據轉換(Transform)環節,幫助用戶以高效、可維護的方式將原始數據轉換為適合分析的數據模型。 用戶只需要編寫查詢&am…

【家政平臺開發(39)】解鎖家政平臺測試秘籍:計劃與策略全解析

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質量,…

Java中的Map vs Python字典:核心對比與使用指南

一、核心概念 1. 基本定義 Python字典(dict) :動態類型鍵值對集合,語法簡潔,支持快速查找。Java Map:接口,常用實現類如 HashMap、LinkedHashMap,需聲明鍵值類型(泛型&…

C語言基礎之數組

1. 一維數組的創建和初始化 數組的創建 數組是一組相同類型元素的集合。 數組的創建方式: type_t arr_name [const_n]; //type_t 是指數組的元素類型 //const_n是一個常量表達式,用來指定數組的大小 數組創建的實例: //代碼1int arr1[10]; …

虛幻引擎5-Unreal Engine筆記之“將MyStudent變量設置為一個BP_Student的實例”這句話如何理解?

虛幻引擎5-Unreal Engine筆記之“將MyStudent變量設置為一個BP_Student的實例”這句話如何理解? code review! 文章目錄 虛幻引擎5-Unreal Engine筆記之“將MyStudent變量設置為一個BP_Student的實例”這句話如何理解?理解這句話的關鍵點1.類&#xff08…

提示詞 (Prompt)

引言 在生成式 AI 應用中,Prompt(提示)是與大型語言模型(LLM)交互的核心輸入格式。Prompt 的設計不僅決定了模型理解任務的準確度,還直接影響生成結果的風格、長度、結構與可控性。隨著模型能力和應用場景…

十二、C++速通秘籍—靜態庫,動態庫

上一章節: 十一、C速通秘籍—多線程-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147055932?spm1001.2014.3001.5502 本章節代碼: cpp2/library CuiQingCheng/cppstudy - 碼云 - 開源中國https://gitee.com/cuiqingcheng/cppst…

什么是繼承?js中有哪兒些繼承?

1、什么是繼承? 繼承是面向對象軟件技術中的一個概念。 2、js中有哪兒些繼承? js中的繼承有ES6的類class的繼承、原型鏈繼承、構造函數繼承、組合繼承、寄生組合繼承。 2.1 ES6中類的繼承 class Parent {constructor() {this.age 18;} }class Chil…

Linux進程通信入門:匿名管道的原理、實現與應用場景

Linux系列 文章目錄 Linux系列前言一、進程通信的目的二、進程通信的原理2.1 進程通信是什么2.2 匿名管道通訊的原理 三、進程通訊的使用總結 前言 Linux進程間同通訊(IPC)是多個進程之間交換數據和協調行為的重要機制,是我們學習Linux操作系…

探秘Transformer系列之(26)--- KV Cache優化 之 PD分離or合并

探秘Transformer系列之(26)— KV Cache優化 之 PD分離or合并 文章目錄 探秘Transformer系列之(26)--- KV Cache優化 之 PD分離or合并0x00 概述0x01 背景知識1.1 自回歸&迭代1.2 KV Cache 0x02 靜態批處理2.1 調度策略2.2 問題…

十大PDF解析工具在不同文檔類別中的比較研究

PDF解析對于包括文檔分類、信息提取和檢索在內的多種自然語言處理任務至關重要,尤其是RAG的背景下。盡管存在各種PDF解析工具,但它們在不同文檔類型中的有效性仍缺乏充分研究,尤其是超出學術文檔范疇。通過使用DocLayNet數據集,比…

HarmonyOS-ArkUI 裝飾器V2 @ObservedV2與@Trace裝飾器

參考文檔: 文檔中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-new-observedv2-and-trace-V14#trace%E8%A3%85%E9%A5%B0%E5%AF%B9%E8%B1%A1%E6%95%B0%E7%BB%84由于V2的裝飾器比V1的裝飾器更加易用,盡管學習的過程中用到的都是V1的裝飾器,但…

GPT - GPT(Generative Pre-trained Transformer)模型框架

本節代碼主要為實現了一個簡化版的 GPT(Generative Pre-trained Transformer)模型。GPT 是一種基于 Transformer 架構的語言生成模型,主要用于生成自然語言文本。 1. 模型結構 初始化部分 class GPT(nn.Module):def __init__(self, vocab…

基于FPGA的六層電梯智能控制系統 矩陣鍵盤-數碼管 上板仿真均驗證通過

基于FPGA的六層電梯智能控制系統 前言一、整體方案二、軟件設計總結 前言 本設計基于FPGA實現了一個完整的六層電梯智能控制系統,旨在解決傳統電梯控制系統在別墅環境中存在的個性化控制不足、響應速度慢等問題。系統采用Verilog HDL語言編程,基于Cyclo…

車載通信系統中基于ISO26262的功能安全與抗輻照協同設計研究

摘要:隨著智能網聯汽車的快速發展,車載通信系統正面臨著功能安全與抗輻照設計的雙重挑戰。在高可靠性要求的車載應用場景下,如何實現功能安全標準與抗輻照技術的協同優化,構建滿足ISO26262安全完整性等級要求的可靠通信架構&#…

Node.js種cluster模塊詳解

Node.js 中 cluster 模塊全部 API 詳解 1. 模塊屬性 const cluster require(cluster);// 1. isMaster // 判斷當前進程是否為主進程 console.log(是否為主進程:, cluster.isMaster);// 2. isWorker // 判斷當前進程是否為工作進程 console.log(是否為工作進程:, cluster.isW…