[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-dockers-apt-repo-update-ubuntu-cleanly-en":3,"article-related-dockers-apt-repo-update-ubuntu-cleanly-en":30,"series-tools-9dd3283e-5056-4053-b096-a27a441643f0":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},"9dd3283e-5056-4053-b096-a27a441643f0","dockers-apt-repo-update-ubuntu-cleanly-en","Docker’s APT repo lets you update Ubuntu cleanly","\u003Cp data-speakable=\"summary\">\u003Ca href=\"\u002Ftag\u002Fdocker\">Docker\u003C\u002Fa>’s official APT repo keeps Ubuntu installs current without version drift.\u003C\u002Fp>\u003Cp>I’ve been keeping Docker on Ubuntu machines alive for years, and the update story has always been weirdly annoying. The daemon is on one version, Compose is on another, Buildx is missing, and then some tutorial tells you to install a package from a random repo like that’s normal. It works until it doesn’t. Then you end up with mismatched CLI plugins, stale packages, and one of those “why is this box different from every other box?” moments that eats an hour for no reason.\u003C\u002Fp>\u003Cp>What finally made sense for me was treating Docker like a real software stack instead of a one-off install. Use Docker’s official APT repository, install the engine and plugins from the same source, and stop mixing Ubuntu’s packages with Docker’s packages. That’s the whole trick. It’s boring, but boring is what I want when I’m updating production-ish machines.\u003C\u002Fp>\u003Cp>The source that kicked this off for me is Matija’s post, \u003Ca href=\"https:\u002F\u002Fwww.buildwithmatija.com\u002Fblog\u002Fupdate-docker-to-latest-ubuntu\">Update Docker to Latest Version on Ubuntu\u003C\u002Fa> on Build with Matija. It’s a straightforward walkthrough for Ubuntu 26.04, 24.04, and 22.04, and it specifically calls out docker-ce, Compose, Buildx, and the mismatch problems that show up when those pieces drift.\u003C\u002Fp>\u003Ch2>Stop mixing Ubuntu’s Docker packages with Docker’s own packages\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>What this actually means is: don’t let Ubuntu and Docker both try to “own” your container tooling. If you install Docker from one source and Compose from another, you’re asking for weirdness later. Maybe the engine updates but the plugin doesn’t. Maybe Buildx disappears after a package refresh. Maybe a teammate follows a different guide and ends up on a slightly different set of binaries. That’s how small inconsistencies turn into debugging sessions.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782516776887-ep7d.png\" alt=\"Docker’s APT repo lets you update Ubuntu cleanly\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>I ran into this on a couple of Ubuntu boxes where one machine had Docker from the distro repo and another had Docker CE from Docker’s repo. Same OS, same app, totally different behavior when it came time to build images. Not dramatic failures. Just enough friction to make me distrust the machine. That’s usually the real problem with package drift: it doesn’t explode, it just quietly wastes your time.\u003C\u002Fp>\u003Cp>How to apply it: pick Docker’s official repository as the single source of truth for the engine and plugins. If you already have mixed installs, clean them up before upgrading. Check what’s installed with apt, remove the conflicting packages, then reinstall from one repo. The point is consistency, not heroics.\u003C\u002Fp>\u003Cul>\u003Cli>Use one package source for Docker Engine, Compose, and Buildx.\u003C\u002Fli>\u003Cli>Don’t mix Ubuntu repo packages with Docker CE packages.\u003C\u002Fli>\u003Cli>Verify the installed versions after every upgrade.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Install the repo once, then let apt do the boring part\u003C\u002Fh2>\u003Cp>Docker’s repo setup is not glamorous, but it’s the \u003Ca href=\"\u002Fnews\u002Fheadroom-token-compression-mcp-tool-en\">right kind\u003C\u002Fa> of boring. You add Docker’s GPG key, register the official APT source, refresh package metadata, and then install the packages you actually need. That’s the clean path because it gives apt a stable place to pull updates from without dragging in random dependencies from elsewhere.\u003C\u002Fp>\u003Cp>What I like about this approach is that it makes upgrades predictable. If a newer Docker release lands, apt can see it. If you need to pin a version, you can do that too. If a server is rebuilt later, the install steps are repeatable instead of “copy this shell snippet from a blog and hope it still works next year.” I’ve done enough of those to know they age badly.\u003C\u002Fp>\u003Cp>The official Docker docs are still the best reference for the repository setup itself, especially the install docs at \u003Ca href=\"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002Fubuntu\u002F\">docs.docker.com\u002Fengine\u002Finstall\u002Fubuntu\u002F\u003C\u002Fa>. I’m not reinventing that here. I’m just saying the repo pattern is the foundation. Everything else depends on that being correct.\u003C\u002Fp>\u003Cp>How to apply it: use the official docs to configure the repo, then install the engine and plugins in one pass. After that, run a version check so you know exactly what landed on the box. I also like to keep the install commands in a script or config management file instead of typing them by hand every time.\u003C\u002Fp>\u003Cul>\u003Cli>Add Docker’s repo before installing anything.\u003C\u002Fli>\u003Cli>Install docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, and docker-compose-plugin together.\u003C\u002Fli>\u003Cli>Confirm the install with docker version and docker compose version.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Keep Compose and Buildx on the same release train\u003C\u002Fh2>\u003Cp>This is the part people skip, then later wonder why Docker feels flaky. Compose and Buildx are not decorative extras. They’re part of the workflow. If the engine updates but the plugins lag behind, you get behavior differences that are hard to spot until you’re in the middle of a build or compose run.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782516777484-3r60.png\" alt=\"Docker’s APT repo lets you update Ubuntu cleanly\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>Matija’s post calls out Compose and Buildx explicitly, which is the right move. I’ve seen a lot of update guides that only talk about Docker Engine, as if nobody ever uses compose or multi-platform builds. In real life, that’s backwards. Most of us touch Compose more often than the raw daemon. And Buildx matters the first time you need a cross-platform image or a build feature that isn’t in the old CLI path.\u003C\u002Fp>\u003Cp>What this actually means is that you should think of Docker as a bundle, not a single package. The engine, Compose plugin, and Buildx plugin need to be checked together. If one is stale, your whole setup feels older than it should.\u003C\u002Fp>\u003Cp>How to apply it: after updating, run three commands and make them part of your muscle memory.\u003C\u002Fp>\u003Cpre>\u003Ccode>docker version\n\ndocker compose version\n\ndocker buildx version\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>If one of those fails or reports something unexpected, don’t ignore it. That’s your warning light. Fix the package source or reinstall the missing plugin before you move on.\u003C\u002Fp>\u003Ch2>Use version checks to catch mismatch problems early\u003C\u002Fh2>\u003Cp>I’ve learned not to trust a successful apt install on its own. Package managers are polite liars. They’ll tell you the install completed, and then you discover later that the CLI plugin isn’t present, or the version is not the one you expected, or a symlink points somewhere odd. So I always verify the versions right after an upgrade.\u003C\u002Fp>\u003Cp>That sounds tedious until you’ve been burned by it once. Then it becomes cheap insurance. A quick version check tells you whether the repo is correct, whether the plugin packages landed, and whether Docker is actually using the binaries you think it is. On Ubuntu, that matters even more if you’ve ever manually installed Docker before. Old binaries love to linger.\u003C\u002Fp>\u003Cp>What this actually means is that the update process is not finished when apt says it is. It’s finished when the toolchain reports the right versions and the commands you use every day still behave normally.\u003C\u002Fp>\u003Cp>How to apply it: after every Docker update, check the engine, Compose, and Buildx versions. If you manage multiple Ubuntu versions, compare them across machines. When the versions drift, you’ll catch it before it becomes a support problem.\u003C\u002Fp>\u003Cul>\u003Cli>Run version checks immediately after installation.\u003C\u002Fli>\u003Cli>Compare output across servers if you manage more than one box.\u003C\u002Fli>\u003Cli>Remove old Docker binaries if commands resolve to the wrong path.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Upgrade Ubuntu without breaking your container workflow\u003C\u002Fh2>\u003Cp>One reason I like this repo-based approach is that it survives OS upgrades better than ad hoc installs. Ubuntu 22.04, 24.04, and 26.04 are not the same environment, and if your Docker install was built from a random mix of packages, the OS upgrade can expose every messy choice you made earlier. That’s when people start blaming the new Ubuntu release, when the real issue is package drift.\u003C\u002Fp>\u003Cp>Docker’s repo gives you a cleaner story across releases. You can refresh the repo metadata for the new Ubuntu version, reinstall the packages if needed, and get back to a known state. I’m not saying upgrades become magical. They still need checks. But they stop being a scavenger hunt.\u003C\u002Fp>\u003Cp>What this actually means is that your container workflow should survive OS maintenance. If you’re running local dev machines, CI runners, or small servers, the Docker install should be predictable enough that an Ubuntu upgrade doesn’t force a complete rework.\u003C\u002Fp>\u003Cp>How to apply it: before upgrading Ubuntu, record your Docker versions and package list. After the OS upgrade, refresh the repository config if needed, reinstall the Docker packages from the official source, and verify the commands again. If you use automation, bake those checks into the playbook so you don’t rely on memory.\u003C\u002Fp>\u003Ch2>Make the update repeatable, not artisanal\u003C\u002Fh2>\u003Cp>The biggest lesson here is not about Docker itself. It’s about refusing to treat setup steps like one-time craft work. I’ve done enough server maintenance to know the most annoying systems are the ones that only work because one person remembers a weird manual tweak from six months ago. That’s not maintainable. That’s a future incident report waiting to happen.\u003C\u002Fp>\u003Cp>Matija’s article is useful because it pushes toward a repeatable pattern: official repo, consistent packages, version checks, and mismatch fixes when needed. That’s the sort of setup I want on anything I’m going to touch twice. If I have to revisit it later, I want the path to be obvious. No mystery packages. No “just run this curl pipe bash thing” nonsense.\u003C\u002Fp>\u003Cp>How to apply it: document the install and update steps in your internal notes, shell script, or provisioning tool. Then keep the verification commands right next to the install commands. If somebody else on your team has to update Docker, they should be able to do it without guessing which package source is safe.\u003C\u002Fp>\u003Cp>One more practical thing: if you already have a messy install, don’t try to paper over it. Clean it up. The time you spend untangling a bad Docker install is usually less than the time you’ll spend debugging the weird behavior it causes later.\u003C\u002Fp>\u003Ch2>The template you can copy\u003C\u002Fh2>\u003Cpre>\u003Ccode># Update Docker on Ubuntu using Docker's official APT repo\n# Works for Ubuntu 22.04, 24.04, and 26.04\n\nset -euo pipefail\n\n# 1) Remove conflicting old packages if present\nsudo apt-get remove -y docker docker-engine docker.io containerd runc || true\n\n# 2) Install prerequisites\nsudo apt-get update\nsudo apt-get install -y ca-certificates curl gnupg\n\n# 3) Add Docker's official 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) Add the official Docker APT repository\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) Install Docker Engine, Compose, and 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) Verify versions\ndocker version\n\ndocker compose version\n\ndocker buildx version\n\n# 7) Optional: run Docker without sudo\nsudo usermod -aG docker \"$USER\"\n\necho \"Log out and back in for group changes to take effect.\"\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>This is the version I’d keep in a repo or internal runbook. It’s not fancy, and that’s the point. It installs Docker from one source, keeps the plugins aligned, and gives you a quick way to verify that everything actually worked.\u003C\u002Fp>\u003Cp>If you want the original walkthrough that inspired this breakdown, read Matija’s post at \u003Ca href=\"https:\u002F\u002Fwww.buildwithmatija.com\u002Fblog\u002Fupdate-docker-to-latest-ubuntu\">https:\u002F\u002Fwww.buildwithmatija.com\u002Fblog\u002Fupdate-docker-to-latest-ubuntu\u003C\u002Fa>. My version is a practical decomposition of that idea, not a replacement for the source.\u003C\u002Fp>","A practical Docker update path for Ubuntu that keeps Engine, Compose, and Buildx in sync.","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-1782516776887-ep7d.png","tools","en","7a129fc2-20dd-451f-b118-ea4eab053d8a",[17,18,19,20,21],"Docker","Ubuntu","APT repo","Compose","Buildx",[23,24,25],"Use Docker’s official APT repo as the single source of truth.","Install Engine, Compose, and Buildx together to avoid version drift.","Verify versions after every update so mismatch problems show up early.",0,"2026-06-26T23:32:35.701464+00:00","2026-06-26T23:32:35.695+00:00","4d4cbab5-9bf7-4659-8d0c-a90686cb3943",{"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-zh","Docker APT 讓 Ubuntu 更新不亂套","zh",[39,45,51,57,63,69],{"id":40,"slug":41,"title":42,"cover_image":43,"image_url":43,"created_at":44,"category":13},"79194d55-f22c-465f-90b8-8050b2c278fb","gentoo-kernel-config-menuconfig-workflow-en","Gentoo kernel config turns menuconfig into a workflow","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782523097255-cir6.png","2026-06-27T01:17:52.032704+00:00",{"id":46,"slug":47,"title":48,"cover_image":49,"image_url":49,"created_at":50,"category":13},"332d7a17-50b0-4815-9f3f-1fe0178a4bcf","spec-kit-guided-ai-workflow-setup-en","Spec Kit turns setup into a guided AI workflow","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782505100912-x7gh.png","2026-06-26T20:17:59.881989+00:00",{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"197c6d03-0fe4-4970-98d6-be057c0e1fcb","litefuse-agent-observability-single-binary-doris-en","Litefuse 不是 Langfuse 的补丁，而是 Agent 可观测的正确方向","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782500573788-2zj7.png","2026-06-26T19:02:21.8574+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"eee7db48-f6af-46e6-b602-73813d0c8b30","20-ai-coding-assistants-stripped-down-2026-en","20 AI coding assistants, stripped down for 2026","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782498804011-262x.png","2026-06-26T18:32:54.079908+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"d4b06c3c-43b1-4638-b02f-78b79585218a","open-code-review-turns-ai-reviews-line-accurate-checks-en","Open Code Review turns AI reviews into line-accurate checks","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782490707271-5kws.png","2026-06-26T16:17:57.715243+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"9bd27b93-b6f8-448d-af75-22ba07d8c1c3","grok-imagine-1-5-turns-prompts-into-720p-video-en","Grok Imagine 1.5 turns prompts into 720p video","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1782475418949-cvva.png","2026-06-26T12:03:03.32881+00:00",[76,81,86,91,96,101,106,111,116,121],{"id":77,"slug":78,"title":79,"created_at":80},"8008f1a9-7a00-4bad-88c9-3eedc9c6b4b1","surepath-ai-mcp-policy-controls-en","SurePath AI's New MCP Policy Controls Enhance AI Security","2026-03-26T01:26:52.222015+00:00",{"id":82,"slug":83,"title":84,"created_at":85},"27e39a8f-b65d-4f7b-a875-859e2b210156","mcp-standard-ai-tools-2026-en","MCP Standard in 2026: Integrating AI Tools","2026-03-26T01:27:43.127519+00:00",{"id":87,"slug":88,"title":89,"created_at":90},"165f9a19-c92d-46ba-b3f0-7125f662921d","rag-2026-transforming-enterprise-ai-en","How RAG in 2026 is Transforming Enterprise AI","2026-03-26T01:28:11.485236+00:00",{"id":92,"slug":93,"title":94,"created_at":95},"6a2a8e6e-b956-49d8-be12-cc47bdc132b2","mastering-ai-prompts-2026-guide-en","Mastering AI Prompts: A 2026 Guide for Developers","2026-03-26T01:29:07.835148+00:00",{"id":97,"slug":98,"title":99,"created_at":100},"3ab2c67e-4664-4c67-a013-687a2f605814","garry-tan-open-sources-claude-code-toolkit-en","Garry Tan Open-Sources a Claude Code Toolkit","2026-03-26T08:26:20.245934+00:00",{"id":102,"slug":103,"title":104,"created_at":105},"66a7cbf8-7e76-41d4-9bbf-eaca9761bf69","github-ai-projects-to-watch-in-2026-en","20 GitHub AI Projects to Watch in 2026","2026-03-26T08:28:09.752027+00:00",{"id":107,"slug":108,"title":109,"created_at":110},"9f332fda-eace-448a-a292-2283951eee71","practical-github-guide-learning-ml-2026-en","A Practical GitHub Guide to Learning ML in 2026","2026-03-27T01:16:50.125678+00:00",{"id":112,"slug":113,"title":114,"created_at":115},"1b1f637d-0f4d-42bd-974b-07b53829144d","aiml-2026-student-ai-ml-lab-repo-review-en","AIML-2026 Is a Bare-Bones Student Lab Repo","2026-03-27T01:21:51.661231+00:00",{"id":117,"slug":118,"title":119,"created_at":120},"6d1bf3f6-e191-4d30-b55b-8a0722fa6afe","ai-trending-github-repos-and-research-feeds-en","AI Trending Tracks Repos and Research Feeds","2026-03-27T01:31:35.709532+00:00",{"id":122,"slug":123,"title":124,"created_at":125},"010539a1-4c3a-4bd3-937a-26616422ee0d","awesome-ai-for-science-research-tools-map-en","Awesome AI for Science Is Becoming a Real Research Map","2026-03-27T01:46:50.89513+00:00"]