ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu/Kali安装Docker CE实战:从零到容器运行的完整避坑指南

Ubuntu/Kali安装Docker CE实战:从零到容器运行的完整避坑指南 先扯句实在话我自己在 Ubuntu、Kali 上把 Docker 装来装去没有二十次也有十几次最深的感受是——安装本身不难难的是那些“只贴命令不讲为什么”的教程把新手带进沟里。很多人一上来就apt install docker.io结果装的是发行版自带的老版本还有人在 Kali 上折腾半天下载拉不动包最后连 Docker 服务都起不来。这个项目题目其实点得很准“天下苦 Docker 安装久矣”这句话说的是真痛点。作为新手你真正需要的是“一份能照着敲完就能跑起来的安装手册”再加上“踩坑时知道去哪排查”的耐心。这篇博文就是干这个的。我会分别讲清Ubuntu和Kali上安装最新 Docker CE 的完整流程不搞脚本一键安装那种黑盒操作每一步都拆开说清楚为什么这么做。顺便把我这些年遇到过的典型报错和排查思路整理成速查表让你装完不只是会敲命令还知道出了问题怎么定位。无论是准备搭开发环境的 Ubuntu 玩家还是想跑靶场、做渗透测试的 Kali 用户这套内容都适用。跟着往下走你会在二十分钟内拥有一个能正常拉镜像、跑容器、开机自启的 Docker 环境。1. 装之前必须搞懂的几件事1.1 别上来就装 Docker Desktop90% 的新手坑都在这里先说一个最常见的误区不少同学在 Windows 或者 mac 上用过 Docker Desktop到了 Linux 下也顺手去搜“Docker Desktop 安装”。Docker Desktop 确实有 Linux 版本但它本质上是给你提供图形化管理界面和一整套虚拟化方案在 Linux 服务器上完全没有必要用这个。而且 Docker Desktop 对虚拟化技术有硬性要求一旦你是跑在 VMware 或 VirtualBox 里的虚拟机经常会在启动时看到virtualization support not detected这种报错最后卡在“Failed to start because ...”那一坨英文里进都进不去。在 Kali、Ubuntu 这类 Linux 发行版上我们应该装的是Docker Engine也就是通常说的Docker CECommunity Edition。它是纯命令行工具没有花哨界面但稳定、干净、资源占用小。你日常用的docker命令、docker run、docker compose全都是基于这个引擎运行的。对于新手来说放弃 Docker Desktop 反而是最省心的选择因为少了一层“虚拟化检测”的坑。1.2 Docker CE 其实是一组软件不只是docker这一个命令很多教程让你装完docker-ce就跑但现代 Docker 官方仓库里至少包含这几个核心组件docker-ceDocker 守护进程和 CLI 主程序containerd.io负责容器生命周期的核心运行时Docker 底层靠它docker-buildx-pluginBuildKit 构建扩展现在的镜像构建能力几乎都靠它docker-compose-pluginDocker Compose v2 插件帮你一键编排多个容器。我为什么单独强调这件事因为如果你只是搜到一篇老教程装了docker.io这种系统自带的老包它把上面这些组件混成一团版本落后很多新特性根本没暴露给你。等你以后想用docker compose就会莫名多出很多依赖问题。所以既然都决定从零安装了就直接走官方仓库装全新的一套。1.3 为什么很多教程越看越乱因为他们把“安装”和“配置”混在一起讲一开始我也很烦那些动辄十步、二十步的安装教程后来发现问题的根源在于官方仓库安装其实永远是固定的三步——添加 GPG 密钥、添加 APT 源、安装软件包。剩下的什么换镜像源、配 daemon.json、设置用户组全部是“安装后的优化配置”根本不是安装流程的一部分。新手最容易被带沟里的就是把优化配置穿插在安装命令之间一旦某一步出错你就分不清到底是安装问题还是配置问题。我这篇的做法是先完成纯安装直到docker run hello-world跑通然后再做镜像加速、开机启动、用户组这些事。这样一旦出错了排查范围一下就缩小了。2. Ubuntu 安装 Docker CE官方仓库三步走2.1 第一步把系统里可能存在的旧版本 Docker 全部请出去如果你这台 Ubuntu 是刚装的干净系统这一步可以跳过但我强烈建议你依然执行一遍。因为现在很多 VPS 服务商、虚拟机镜像为了“省事”默认已经预装了一个 Docker 相关包。如果你不清理干净后面从官方仓库添加新版本时经常会出现Package docker-ce is not available或者依赖版本冲突的奇怪现象。在 Ubuntu 上执行下面这行命令把可能残留的旧包全部移除掉sudo apt remove docker docker-engine docker.io containerd runc你会发现有些包名根本不存在没关系apt会忽略不存在的包名并继续执行不会报错中断。这一步的原理是清理 APT 能追踪到的旧 Docker 组件避免它们和官方 Docker CE 的新包抢倚赖关系。如果你曾经用过 Docker 的 Debian 仓库还应该把它的列表文件也删掉以免多个来源同时提供docker-ce造成冲突。2.2 第二步添加 Docker 官方 GPG 密钥和 APT 仓库这是整个安装的核心也是新手最容易出错的地方。先安装几个基础工具这些工具用来向 Docker 官方服务器拉取密钥并写入系统sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release然后创建密钥目录下载 GPG 密钥转换成 APT 能识别的格式sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg为什么要搞这么复杂因为 APT 在添加新仓库时需要验证仓库里的软件包确实由 Docker 官方签名。上面命令就是把官方公钥保存下来后续apt update就会拿这个密钥去校验元数据。如果你跳过密钥环节后面的apt update通常会提示The repository does not have a Release file或NO_PUBKEY直接把你卡死。接下来添加真正的仓库地址我们使用 Ubuntu 版本代号作为源路径echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null这里有几个细节值得展开dpkg --print-architecture会自动输出当前 CPU 架构比如amd64或arm64不用手动填避免你填错。lsb_release -cs会输出 Ubuntu 版本代号比如 22.04 是jammy24.04 是noble。这个命令只有你之前装了lsb-release才能正常使用这就是上面先安装它的原因。stable表示使用稳定版频道不用担心它是“带 bug 的测试版”。2.3 第三步安装 Docker CE 并跑通第一个容器仓库加好之后更新索引并安装那四个组件sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这条命令会把 Docker 守护进程、命令行工具、容器运行时和插件全部装上。装完后验证一下到底装没装好sudo systemctl status docker正常情况下会输出active (running)同时显示 Docker 进程当前的 PID。如果没有显示 running也可能是因为刚装完服务还没被自动拉起手动执行一次sudo systemctl start docker然后验证命令行版本docker --version看到Docker version xx.x.x, build xxxxx说明主程序已经 OK。最后跑一下官方测试镜像sudo docker run hello-world这条命令会先从 Docker Hub 拉取一个不到 10KB 的小镜像然后在这个容器里输出一段欢迎信息。如果看到了Hello from Docker!恭喜你基础安装已经大功告成。如果卡在这里不动大概率是网络问题后面第四节我会讲解决方案。3. Kali 安装 Docker CE其实走的是 Debian 路线3.1 Kali 和 Ubuntu 不一样但官方仓库安装逻辑几乎一样Kali Linux 虽然以安全测试闻名但它本质上是基于 Debian testing 的发行版。所以你绝对不能去套用 Ubuntu 的仓库地址——https://download.docker.com/linux/ubuntu这个源只认 Ubuntu 的版本代号Kali 的/etc/os-release根本没有这个字段硬加进去apt update会直接吐血。正确思路是Kali 兼容 Debian 的 APT 仓库我们需要把 Docker 官方 Debian 源加进去并指定一个和你 Kali 实际依赖系统匹配的 Debian 版本代号。最常见的选择是bookworm也就是 Debian 12 的代号目前 Kali 的很多包版本也都兼容它。如果你遇到依赖问题也可以试试更老也更稳的bullseye。不要加kali-rolling这种自定义仓库名称原因很简单Docker 官方根本没有针对 Kali 发布过独立仓库。另外要特别提醒Kali 官方源里默认就带了一个docker.io包。如果你曾经安装过请先清理干净sudo apt remove docker docker-engine docker.io containerd runc不清掉的话官方 Docker CE 和系统自带的 Docker 包会产生文件冲突apt install docker-ce经常会说出conflicting packages这种让人想砸键盘的提示。3.2 从添加密钥到完成安装六条命令搞定 Kali先安装前置依赖确保有curl和gpg这些工具sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release创建密钥目录并导入 Docker 官方 Debian 的 GPG 公钥sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg这里和 Ubuntu 唯一的区别就是 URL 路径里的ubuntu变成了debian其余原理完全一样。接下来添加仓库地址echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null在 Kali 上执行这一步前我建议你先检查一下自己系统里有没有残留的 Kali 官方 Docker 源或第三方 Docker 源ls -la /etc/apt/sources.list.d/如果有别的docker.list先把它们删掉或注释掉否则你搞不清到底哪个源在提供服务。然后同样的安装动作sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin装完后启动并确认sudo systemctl enable --now docker sudo systemctl status docker如果在 Kali 上启动 Docker 时遇到Job for docker.service failed别急着重装先看一段日志sudo journalctl -u docker.service --no-pager -n 30我见过几次 Kali 上启动失败原因不是 Docker 本身而是 iptables 模块没加载或 containerd 启动超时。遇到这种情况别慌先重启一次系统再跑sudo systemctl start docker很多 Kali 虚拟机里内核模块加载不完整的问题重启后就会消失。3.3 为什么我建议你配置 Docker 的用户组权限Kali 的安全定位决定了它的很多操作都是以 root 权限运行的但如果你用的是普通用户比如新版本默认用户kali每次执行docker命令都要加sudo时间长了真的很烦人。而且sudo docker还有个隐患生成的容器默认拥有 root 权限如果你在写脚本或者做自动化操作不小心就容易跑高权限容器这在渗透测试场景里风险不小。解决方法是把当前用户加入docker用户组sudo usermod -aG docker $USER newgrp dockernewgrp docker的作用是让当前终端立即生效省去重新登录的麻烦。之后你可以直接敲docker version试一下不用再加sudo。但这里有个重要的安全说明把用户加入docker组本质上等于给了这个用户 root 权限因为 Docker 可以通过挂载宿主目录的方式访问系统任意文件。如果你这台 Kali 只是自己日常做测试那没问题如果这是一台多人共用的机器我建议你还是老老实实加sudo不要图省事。4. 装完之后先别急着跑项目镜像加速、开机启动和第一跑4.1 国内网络环境下镜像加速几乎是必需品很多人安装 Docker 成功后第一次docker pull mysql:8.0就卡在Pulling from library/mysql那里下载速度以字节计算最后等十几分钟还是超时。这不是 Docker 的问题而是默认拉取镜像的 Docker Hub 服务器在本地网络环境下连接不稳定。解决办法是给 Docker 配置镜像加速器。配置文件路径是/etc/docker/daemon.json这个文件默认并不存在需要你手动创建。在 Ubuntu 和 Kali 上操作完全一致sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json EOF { registry-mirrors: [https://your-mirror-address] } EOF然后重启 Docker 让配置生效sudo systemctl daemon-reload sudo systemctl restart docker注意your-mirror-address需要替换成你自己申请的加速器地址通常云服务商的控制台里能免费申请到一个带个人信息的专属地址不要照抄别人的地址。你可能会在网上搜到很多公共镜像仓库地址我就不在这里罗列了一方面这些地址又容易失效另一方面也不鼓励大家盲目信任第三方源。配置好之后你可以验证一下重新执行一次docker run hello-world正常情况下镜像拉取会轻松很多。如果你没有申请专属加速器也可以试试直接拉取镜像时选用 Docker 官方在中国区提供的镜像仓库域名但这个经常变化最稳妥的办法还是配置自己的加速器地址。加速器只影响拉取镜像的速度不影响你日常容器运行。4.2 配置开机自启省得每次重启手动启动服务如果你不希望每次重启系统都要手动执行sudo systemctl start docker那就需要把服务设置为开机启动sudo systemctl enable docker这个命令会创建一个服务的符号链接让 systemd 在系统启动时自动拉起 Docker。已经启动过一次的镜像配置也可以组合使用enable --nowsudo systemctl enable --now docker在 Kali 和 Ubuntu 上这几乎是通用命令不需要额外设置。如果你用的是 WSL 或者一些精简容器环境systemd 可能没有正常工作这种情况我就不展开说了因为和本文主题偏离太远。4.3 docker run hello-world 卡住先用状态命令定位第一次运行 hello-world 时最常见的“卡住”是等了很久没有输出。这里教大家一个万能排查口诀先看docker ps -a再看docker logs。先打开另一个终端docker ps -a如果看到hello-world容器状态是Created或者Exited (0) ...说明镜像已经拉下来并执行过了只是输出可能被缓冲了回到原来的终端按一下回车或者用docker logs 容器ID查看输出。docker logs $(docker ps -aq | head -n 1)如果docker ps -a里什么也没有说明镜像还没拉下来卡在 pull 阶段。先执行docker pull hello-world单独观察进度如果是网络原因回到 4.1 节配置镜像加速。还有一种情况是守护进程没起来这时执行sudo systemctl status docker看到报错再对症下药。这里给大家一个高级技巧如果你怀疑是 DNS 问题可以在容器启动时指定 DNSdocker run --dns 8.8.8.8 hello-world不过这个一般用不上这里只是让你知道网络问题的排查路径是“加速器 - DNS - 防火墙规则”不要一上来就重装系统。5. 新手常见问题与排查实录5.1 Failed to connect to the Docker API at npipe ... 或 /var/run/docker.sock 权限不足这几乎是 Windows 用户和 Linux 新手都会撞上的一类报错。Linux 下最常见的版本是permission denied trying to connect to the Docker daemon socket at unix:///var/run/docker.sock这个报错的含义是你当前用户没有访问 Docker 守护进程 socket 的权限。第一步先确认服务是否在运行sudo systemctl status docker如果服务没运行启动它。如果你之前能跑sudo docker但普通用户不行那就是权限配置问题按 3.3 里的方法把用户加入docker组即可。加入之后如果还是不行可能是当前 shell 的权限缓存还没刷新执行newgrp docker或者注销重新登录。还有一类对应 Windows/WSL 的报错failed to connect to the docker api at npipe:////./pipe/dockerDesktopLinuxEngine这个属于 Docker Desktop 的 Linux 引擎没启动或版本不对和 CE 安装无关。如果你真的是在 Kali/Ubuntu 上直接装 Docker CE永远不会碰到npipe这种东西碰到它说明你装错东西了。5.2 虚拟机里报 virtualization support not detected其实不是 Docker CE 的问题很多同学喜欢先在 VMware 里安装 Ubuntu/Kali然后在虚拟机里再装 Docker。这时候如果看到virtualization support not detected极大概率是运行了 Docker Desktop 的安装包或 Linux 桌面版脚本而 Docker CE 本身根本不依赖 CPU 虚拟化扩展。Docker CE 在 Linux 上使用的是底层内核的 namespace、cgroups 等机制它本来就是 Linux 内核原生支持的不需要硬件虚拟化。只有 Docker Desktop 在非 Linux 平台上跑才需要借助轻量级虚拟机此时宿主机必须开启 VT-x/AMD-V 嵌套虚拟化。所以解决办法很简单如果你在虚拟机里装 Docker请回顾自己安装的是docker-ce还是docker-desktop。前者不需要任何特殊设置后者才需要在虚拟机设置里开启“虚拟化 Intel VT-x/EPT”或“AMD-V/RVI/V”并且要保证宿主机 BIOS 也开启了虚拟化。如果你已经装好 Docker CE 却还是担心虚拟化问题用这个命令检查内核是否支持docker info --format {{.Driver}}输出overlay2就是正常的容器存储驱动和硬件虚拟化没有关系。5.3 apt 依赖错误官方 Docker 源和 Kali 自带源“打架”怎么办Kali 用户最容易遇到的一个大坑是装了 Docker 官方 Debian 源之后运行sudo apt update会报一类类似这样的错误The repository http://http.kali.org/kali kali-rolling Release does not have a Release file.这个错误其实和 Docker 无关而是因为 Kali 的sources.list本身需要维护。更常见的是当你安装 Docker CE 时APT 疯狂提示依赖版本冲突比如The following packages have unmet dependencies: docker-ce : Depends: containerd ( 1.4.0) but it is not going to be installed遇到这种情况我的建议是不要硬着头皮去apt install -f先看看到底是哪个包被 hold 了。执行apt-cache policy docker-ce看清楚当前 Docker CE 候选版本和你系统可用的 containerd 版本是否匹配。如果候选版本只有一个且依赖不满足优先把 Kali 源更新到最新官方源再卸载旧的docker.io和containerdsudo apt update sudo apt remove -y containerd sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin我自己的经验是Kali 上安装 Docker CE 失败八成是因为之前装过系统自带包或者装过乱七八糟的第三方 PPA。彻底清理这些残留再走一遍本文 3.2 节的步骤基本都能解决。5.4 容器网络不通 Docker 网络模式的排查思路如果你已经可以跑容器但发现容器里无法访问外网或者无法和宿主机通信这属于网络层问题。先别慌按下面的顺序自查先查看当前 Docker 的网络列表docker network ls默认情况下至少有bridge、host、none这三个网络。我们大多数容器默认使用的是bridge网络模式它通过 NAT 方式转发流量。如果容器内ping 8.8.8.8不通先检查宿主机是否能通外网ping -c 4 8.8.8.8如果宿主机本身通而容器内不通大概率是 iptables 规则被清掉或者 Docker 的网络规则没有被正常写入。执行sudo systemctl restart docker这种重启一般能重建规则。如果还不行可以检查下是否有firewalld或ufw干扰了 Docker 的网桥流量。Ubuntu 预装ufw需要允许 Docker 的默认网桥sudo ufw allow dockerKali 默认不开ufw但如果你自己开过也要记得放行。最后可以用一个临时容器测试 DNS 解析docker run --rm --dns 8.8.8.8 alpine nslookup baidu.com如果 DNS 不通再加--dns指定 DNS或者考虑在/etc/docker/daemon.json中写入dns: [8.8.8.8, 8.8.4.4]然后重启 Docker。6. 安装完成之后你还可以这样玩Docker 装好之后你手上相当于有了一台可以随意开箱即用的迷你虚拟机群。我自己最常用的几个玩法包括用容器跑 DVWA 靶场做安全测试用容器快速拉起 Redis 主从集群以及用 MySQL 8.0 容器做本地开发。这些场景都是典型的“Docker 让我少走十年弯路”的例子尤其对于 Kali 用户来说以前装靶场还要逐个配置 PHP、Apache、MySQL现在一条docker compose up全搞定。不过在这里要提醒一句不要在还在学习安装阶段的同时就着急去网上复制大段docker-compose.yml最好先把本文提到的命令亲手敲一遍理解docker和docker compose之间的依赖关系。你真正常遇到的问题往往不是“某个容器跑不起来”而是“基础服务就不稳”。基础打牢了后面玩什么都轻松。我个人在重复安装和踩坑之后最深刻的心得是Docker 的官方文档虽然枯燥但绝对是最权威的答案来源。你说网上教程多不多多但很多都是半年前甚至两年前的命令早就过时了。遇到问题第一反应应该是去查man docker或官方 docs而不是马上复制网上的脚本。把本文的步骤理解透你会发现自己已经甩开那些只知道复制粘贴的“假老手”一大截了。
返回列表