[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-dockers-apt-repo-update-ubuntu-cleanly-zh":3,"article-related-dockers-apt-repo-update-ubuntu-cleanly-zh":30,"series-tools-7a129fc2-20dd-451f-b118-ea4eab053d8a":75},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"7a129fc2-20dd-451f-b118-ea4eab053d8a","dockers-apt-repo-update-ubuntu-cleanly-zh","Docker APT 讓 Ubuntu 更新不亂套","\u003Cp data-speakable=\"summary\">用 \u003Ca href=\"\u002Ftag\u002Fdocker\">Docker\u003C\u002Fa> 官方 APT repo，Ubuntu 上的 Engine、Compose、Buildx 可以一起更新，不用再跟版本漂移打架。\u003C\u002Fp>\u003Cp>我在 Ubuntu 機器上管 Docker 很多年了，老實講，最煩的從來不是裝不起來，是「裝得起來但每台都長得不一樣」。這台 Engine 版本新一點，那台 Compose 還卡在舊插件；Buildx 有時候在，有時候不在；然後你照著某篇教學做，下一次更新又冒出一個奇怪的差異。那種感覺很像你以為自己在維護一套\u003Ca href=\"\u002Fnews\u002Fproduct-hunt-best-prompt-engineering-tools-2026-zh\">工具\u003C\u002Fa>，結果其實是在收拾一堆歷史包袱。\u003C\u002Fp>\u003Cp>我後來才慢慢想通：Docker 不該被當成一次性安裝，而是要當成一個完整套件來管。Engine、Compose、Buildx，全部從同一個來源來，Ubuntu 自己的 Docker 套件就別再混進來。這件事很無聊，但無聊通常才是對的，尤其是你不想在半夜追 package drift 的時候。\u003C\u002Fp>\u003Cp>這次拆的方法論，起點是 Matija 的這篇 \u003Ca href=\"https:\u002F\u002Fwww.buildwithmatija.com\u002Fblog\u002Fupdate-docker-to-latest-ubuntu\">Update Docker to Latest Version on Ubuntu\u003C\u002Fa>。他把 Ubuntu 26.04、24.04、22.04 的更新路徑講得很直白，重點也很實際：\u003Ca href=\"https:\u002F\u002Fwww.docker.com\u002F\">Docker\u003C\u002Fa> 官方 APT repo、\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002Fubuntu\u002F\">docker-ce\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fcompose\u002F\">Compose\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuildx\u002F\">Buildx\u003C\u002Fa>，還有怎麼處理版本不一致的問題。\u003C\u002Fp>\u003Ch2>別再讓 Ubuntu 和 Docker 各管各的\u003C\u002Fh2>\u003Cblockquote>Update Docker to the latest version on Ubuntu 26.04, 24.04, or 22.04 using Docker’s official APT repo. Covers docker-ce, Compose, Buildx, and mismatch fixes.\u003C\u002Fblockquote>\u003Cp>翻譯一下就是：不要讓 Ubuntu 的套件庫跟 Docker 自己的套件庫同時想當老大。你如果今天從這邊裝 Engine、明天又從另一邊裝 Compose，短期看起來像是有裝好，長期就是等著出怪事。Engine 先升、插件沒升；Buildx 被換掉；某台機器的 CLI 路徑跟另一台不一樣。這些都不是大爆炸，但很會偷時間。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782516777598-3r4p.png\" alt=\"Docker APT 讓 Ubuntu 更新不亂套\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>我自己就踩過這種坑。兩台 Ubuntu 機器，一台是 distro repo 裝的 Docker，另一台是 Docker CE。表面上都能跑，真要 build image 的時候，行為差超多。不是那種一眼看得出來的錯，而是那種你會開始懷疑自己是不是記錯指令的怪問題。這種事最浪費的不是錯誤本身，是你對環境的信任感。\u003C\u002Fp>\u003Cp>實操寫法很簡單：把 Docker 官方 repo 當唯一來源，Engine、Compose、Buildx 都從那裡來。已經混裝的機器，先清掉再升級，不要指望碰運氣。先看 apt 裡到底裝了什麼，移掉衝突套件，再重新裝回同一條供應鏈。重點不是帥，是一致。\u003C\u002Fp>\u003Cul>\u003Cli>Docker Engine、Compose、Buildx 用同一個套件來源。\u003C\u002Fli>\u003Cli>不要混 Ubuntu repo 和 Docker CE repo。\u003C\u002Fli>\u003Cli>每次更新後都檢查版本，別只看 apt 成功訊息。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>先把 repo 建好，再讓 apt 幫你做髒活\u003C\u002Fh2>\u003Cp>Docker 官方 repo 的好處不是炫技，是它夠穩。你先加 GPG key，再加官方 APT source，更新套件索引，最後一次把需要的套件裝齊。這樣 apt 知道要去哪裡拿更新，不會把你帶去奇怪的依賴地獄。\u003C\u002Fp>\u003Cp>我喜歡這種做法，因為它讓升級變得可預期。新版本出來，apt 看得到；你想鎖版，也能鎖；哪天機器重建，流程還是同一套，不會變成「從某篇部落格複製一段 shell，然後祈禱明年還能用」。我真的做過太多這種事，壽命都不長。\u003C\u002Fp>\u003Cp>翻譯一下就是：repo 是底座，底座錯了，後面全都不用談。你要的是一條穩定的更新路徑，不是每次都重新發明安裝流程。官方文件在這裡最有用：\u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002Fubuntu\u002F\">Docker Ubuntu 安裝文件\u003C\u002Fa>。我不是要重寫它，我只是把它的思路說白一點。\u003C\u002Fp>\u003Cp>實操寫法：照官方文件把 repo 建起來，然後一次裝 Engine 和 plugins。裝完立刻查版本，不要等到出事才回頭看。這種步驟最好放進腳本或 provisioning，別靠手打記憶。\u003C\u002Fp>\u003Cul>\u003Cli>先加 Docker repo，再裝任何 Docker 套件。\u003C\u002Fli>\u003Cli>Engine、Compose、Buildx 一次裝齊。\u003C\u002Fli>\u003Cli>裝完用 docker version、docker compose version、docker buildx version 驗證。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Compose 和 Buildx 不該被當成附屬品\u003C\u002Fh2>\u003Cp>這一段很多人會跳過，然後之後才開始怪 Docker 不穩。Compose 和 Buildx 不是裝飾品，它們就是工作流的一部分。Engine 升了，插件沒跟上，行為差異就會開始冒出來，而且通常不是在最舒服的時候冒出來。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782516780923-u23w.png\" alt=\"Docker APT 讓 Ubuntu 更新不亂套\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>Matija 的文章會把 Compose 和 Buildx 一起講，我覺得這點很對。很多更新教學只講 Docker Engine，好像大家都不用 compose、也不用 multi-platform build。現實剛好相反，大多數人碰得最多的是 compose，Buildx 也是第一次做跨平台 image 或碰到新版 build 功能時才會真的在意。你不把它們一起管，Docker 就會看起來像老半天沒整理過。\u003C\u002Fp>\u003Cp>也就是說，你應該把 Docker 當 bundle，不是單一 package。Engine、Compose plugin、Buildx plugin 要一起檢查。只要其中一個落後，整組體驗就會慢半拍。\u003C\u002Fp>\u003Cp>實操寫法：更新後固定跑三個指令，直接把它變成肌肉記憶。\u003C\u002Fp>\u003Cpre>\u003Ccode>docker version\n\ndocker compose version\n\ndocker buildx version\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>如果其中一個失敗，或版本跟你預期的不一樣，不要當沒看到。那就是警報。先修 package source 或重裝 plugin，再往下做。\u003C\u002Fp>\u003Ch2>版本檢查不是多餘，是便宜保險\u003C\u002Fh2>\u003Cp>我現在已經不太相信「apt 裝成功」這件事本身了。套件管理員很客氣，客氣到有點會騙人。它會跟你說安裝完成，但你之後才發現 CLI plugin 沒裝到、版本不是你要的、或某個 symlink 指到奇怪的地方。所以我每次升級完，都會立刻做版本檢查。\u003C\u002Fp>\u003Cp>這聽起來很麻煩，但你被坑過一次之後就知道，這其實很省錢。快速查版本可以幫你確認 repo 對不對、plugin 有沒有真的落地、Docker 有沒有吃到你以為的那組 binaries。尤其 Ubuntu 上如果你以前手動裝過 Docker，舊檔案很愛陰魂不散。\u003C\u002Fp>\u003Cp>翻譯一下就是：apt 說完工，不代表真的完工。真正完工是你常用的指令都回到正確版本，而且行為正常。這才算數。\u003C\u002Fp>\u003Cp>實操寫法：每次更新 Docker 後，固定檢查 Engine、Compose、Buildx。你如果管多台 Ubuntu 主機，順手比對不同機器的輸出。版本一旦漂掉，你會比使用者先看到。\u003C\u002Fp>\u003Cul>\u003Cli>安裝完立刻跑版本檢查。\u003C\u002Fli>\u003Cli>多台機器就比對輸出，別只看單台。\u003C\u002Fli>\u003Cli>如果指令指到舊 binary，先清掉舊安裝。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Ubuntu 升級時，Docker 不能跟著一起亂掉\u003C\u002Fh2>\u003Cp>我會喜歡這種 repo-based 做法，還有一個原因：它比較扛得住 OS 升級。Ubuntu 22.04、24.04、26.04 本來就不是同一個環境，如果你的 Docker 是從一堆混雜套件拼起來的，OS 一升級，之前那些亂七八糟的選擇就會全部浮出來。很多人這時候會怪新版本 Ubuntu，其實常常是自己前面裝得太隨便。\u003C\u002Fp>\u003Cp>Docker 官方 repo 至少讓路徑清楚一點。你可以在新 Ubuntu 版本上刷新 repo metadata，必要時重裝套件，然後回到一個已知狀態。我不是說升級會變輕鬆，還是要檢查，但它不會再像在垃圾堆裡找鑰匙。\u003C\u002Fp>\u003Cp>也就是說，你的 container workflow 應該能跟著 OS 維護一起活下來。你如果跑的是 local dev machine、CI runner、或小型伺服器，Docker 安裝就該穩到不會因為 Ubuntu 升級而整套重來。\u003C\u002Fp>\u003Cp>實操寫法：升級 Ubuntu 前先記錄 Docker 版本和已裝套件。升級後刷新 repo \u003Ca href=\"\u002Fnews\u002Fspec-kit-guided-ai-workflow-setup-zh\">設定\u003C\u002Fa>、必要時重裝官方套件，再驗證一次指令。若你有 automation，把這些檢查直接寫進 playbook，不要靠記憶。\u003C\u002Fp>\u003Ch2>把更新流程寫成規則，不要寫成手藝\u003C\u002Fh2>\u003Cp>我覺得這篇最有價值的地方，不是 Docker 本身，而是它逼你不要把 setup 當成一次性的手工活。我看過太多系統，之所以難維護，不是因為技術很複雜，是因為只有某個人記得六個月前手動改過什麼。那種系統不是運作中，是在等事故單。\u003C\u002Fp>\u003Cp>Matija 的文章有用，因為它把流程收斂成幾個固定動作：官方 repo、一致套件、版本檢查、必要時處理 mismatch。這就是我想留在任何會重複碰到的機器上的做法。以後再回來看，也要一眼就知道該怎麼走，不要有神秘套件，也不要有「先 curl 再 pipe bash」那種讓人心累的東西。\u003C\u002Fp>\u003Cp>實操寫法：把安裝與更新步驟放進內部文件、shell script，或 provisioning tool。版本檢查命令就放在安裝命令旁邊。團隊裡任何一個人要更新 Docker，都應該不用猜哪個來源才安全。\u003C\u002Fp>\u003Cp>再講白一點，如果你現在那台機器已經很亂，不要想著遮掩。直接整理掉。把壞掉的 Docker install 清乾淨，通常比你之後追 weird behavior 省時間得多。\u003C\u002Fp>\u003Ch2>可抄的模板\u003C\u002Fh2>\u003Cpre>\u003Ccode># Ubuntu 上用 Docker 官方 APT repo 更新 Docker\n# 適用 Ubuntu 22.04 \u002F 24.04 \u002F 26.04\n\nset -euo pipefail\n\n# 1) 移除可能衝突的舊套件\nsudo apt-get remove -y docker docker-engine docker.io containerd runc || true\n\n# 2) 安裝前置套件\nsudo apt-get update\nsudo apt-get install -y ca-certificates curl gnupg\n\n# 3) 加入 Docker 官方 GPG key\nsudo install -m 0755 -d \u002Fetc\u002Fapt\u002Fkeyrings\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fetc\u002Fapt\u002Fkeyrings\u002Fdocker.gpg\nsudo chmod a+r \u002Fetc\u002Fapt\u002Fkeyrings\u002Fdocker.gpg\n\n# 4) 加入 Docker 官方 APT repo\n. \u002Fetc\u002Fos-release\nARCH=$(dpkg --print-architecture)\nCODENAME=${UBUNTU_CODENAME:-$VERSION_CODENAME}\necho \\\n  \"deb [arch=${ARCH} signed-by=\u002Fetc\u002Fapt\u002Fkeyrings\u002Fdocker.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu \\\n  ${CODENAME} stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# 5) 安裝 Engine、Compose、Buildx\nsudo apt-get update\nsudo apt-get install -y \\\n  docker-ce \\\n  docker-ce-cli \\\n  containerd.io \\\n  docker-buildx-plugin \\\n  docker-compose-plugin\n\n# 6) 驗證版本\ndocker version\ndocker compose version\ndocker buildx version\n\n# 7) 可選：讓目前使用者不用 sudo 跑 Docker\nsudo usermod -aG docker \"$USER\"\n\necho \"請登出再登入，群組權限才會生效。\"\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>這段我會直接放進 repo 或內部 runbook。它不花俏，但它做對了幾件事：同一個來源、插件一起裝、版本可以驗證。這才是我想要的 Docker 更新方式。\u003C\u002Fp>\u003Cp>原始靈感來自 Matija 的 \u003Ca href=\"https:\u002F\u002Fwww.buildwithmatija.com\u002Fblog\u002Fupdate-docker-to-latest-ubuntu\">Update Docker to Latest Version on Ubuntu\u003C\u002Fa>；我這篇是把他的做法\u003Ca href=\"\u002Fnews\u002F20-ai-coding-assistants-stripped-down-2026-zh\">拆成可\u003C\u002Fa>執行的版本，裡面有原創整理，也有從原文延伸出的實作模板。\u003C\u002Fp>","用 Docker 官方 APT repo 統一更新 Ubuntu 上的 Engine、Compose、Buildx，避免版本漂移與套件打架。","www.buildwithmatija.com","https:\u002F\u002Fwww.buildwithmatija.com\u002Fblog\u002Fupdate-docker-to-latest-ubuntu",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782516777598-3r4p.png","tools","zh","9dd3283e-5056-4053-b096-a27a441643f0",[17,18,19,20,21],"Docker","Ubuntu","APT repo","Compose","Buildx",[23,24,25],"Docker、Compose、Buildx 要從同一個官方來源更新，別混用 Ubuntu 套件庫。","更新後一定要做版本檢查，避免 apt 成功但工具鏈其實已經漂掉。","把安裝流程寫成可重複的腳本或 runbook，別靠手工記憶。",0,"2026-06-26T23:32:35.230193+00:00","2026-06-26T23:32:35.209+00:00","5136ca27-f5b6-4525-86b0-3103b1f7b8bd",{"tags":31,"relatedLang":34,"relatedPosts":38},[32],{"name":17,"slug":33},"docker",{"id":15,"slug":35,"title":36,"language":37},"dockers-apt-repo-update-ubuntu-cleanly-en","Docker’s APT repo lets you update Ubuntu cleanly","en",[39,45,51,57,63,69],{"id":40,"slug":41,"title":42,"cover_image":43,"image_url":43,"created_at":44,"category":13},"d09affdd-1109-4194-ba42-05c53062a038","gentoo-kernel-config-menuconfig-workflow-zh","Gentoo 核心設定把 menuconfig 變流程","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782523096027-38qx.png","2026-06-27T01:17:51.461891+00:00",{"id":46,"slug":47,"title":48,"cover_image":49,"image_url":49,"created_at":50,"category":13},"c614316e-6910-49e8-83d1-da7e7c2c3e79","spec-kit-guided-ai-workflow-setup-zh","Spec Kit 把設定變成導引流程","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782505105249-9o62.png","2026-06-26T20:17:59.33633+00:00",{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"69cbfbfb-8532-4bd3-814b-559a260cdd4a","litefuse-agent-observability-single-binary-doris-zh","Litefuse 不是 Langfuse 的補丁，而是 Agent 可觀測的正…","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782500574117-ul0z.png","2026-06-26T19:02:21.266856+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"4f42621b-c5ca-42ca-a567-c48e1cb34222","20-ai-coding-assistants-stripped-down-2026-zh","20 個 AI 寫碼助手，拆成可用清單","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782498806913-57hj.png","2026-06-26T18:32:53.614602+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"0ca67afc-db75-48f7-8185-0a539685ce60","open-code-review-turns-ai-reviews-line-accurate-checks-zh","Open Code Review 把 AI 審查變準","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782490706378-ts02.png","2026-06-26T16:17:57.066004+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"2d745abb-9cb8-4d94-b2a6-cb3558904f27","grok-imagine-1-5-turns-prompts-into-720p-video-zh","Grok Imagine 1.5把提示詞變720p短片","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782475410787-cu25.png","2026-06-26T12:03:02.703582+00:00",[76,81,86,91,96,101,106,111,116,121],{"id":77,"slug":78,"title":79,"created_at":80},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":82,"slug":83,"title":84,"created_at":85},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":87,"slug":88,"title":89,"created_at":90},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":92,"slug":93,"title":94,"created_at":95},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":97,"slug":98,"title":99,"created_at":100},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":102,"slug":103,"title":104,"created_at":105},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":107,"slug":108,"title":109,"created_at":110},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":112,"slug":113,"title":114,"created_at":115},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":117,"slug":118,"title":119,"created_at":120},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00",{"id":122,"slug":123,"title":124,"created_at":125},"3ce6e6e2-bac5-463e-9f8d-45caabcc61f7","awesome-ai-for-science-research-tools-map-zh","AI 科研工具清單，開始像地圖了","2026-03-27T01:46:50.521945+00:00"]