Docker安装失败根因解析:从内核模块到权限配置的全链路排查
1. 项目概述:为什么“docker 安装(2)”这个标题值得单独写一篇深度实操笔记
“docker 安装(2)”——乍看只是个编号,但背后藏着大量新手和中级开发者的真实困境。我带过几十个从零起步的开发团队,几乎每一批人都会卡在“安装”这一步,不是卡在 Windows 的虚拟化报错,就是困在 Ubuntu 的权限配置里,再或者被国内镜像源的配置绕晕。很多人搜“docker安装”,点开前五篇教程,照着操作到第3步就失败了,然后反复重装、重启、查日志,最后在社区发帖问:“Starting the docker engine... docker engine is the underlying technology that...” 这句日志反复刷屏,却没人告诉你它到底在等什么。这不是操作问题,是认知断层:大家默认“安装=下载+运行”,但 Docker 的本质是操作系统级的运行时环境,它不依赖某个图形界面,而是深度绑定内核模块、cgroup、namespace 和硬件虚拟化能力。所以“安装”二字,实际包含四个不可跳过的逻辑层:环境准入校验 → 系统依赖注入 → 守护进程初始化 → 用户权限接管。本篇标题里的“(2)”,正是针对那些已经看过基础教程、仍反复失败的实践者——我们不讲“什么是容器”,不堆概念,只拆解你执行sudo apt install docker.io或双击 Docker Desktop 安装包后,系统后台真实发生的每一步动作、每个关键判断点、每个隐藏的失败诱因。比如,为什么virtualization support not detected不是 BIOS 设置没开,而是 Linux 内核启动参数漏了intel_iommu=on?为什么sudo systemctl status docker显示 active (exited),但docker run hello-world却报permission denied?这些细节,官方文档不会写,菜鸟教程不敢碰,但它们恰恰是决定你能否在 15 分钟内让第一个容器跑起来的核心。本文覆盖 Windows(WSL2 与原生 Hyper-V 双路径)、Ubuntu/Debian(apt 与 script 安装对比)、CentOS/RHEL(dnf 与 rpm 差异)、macOS(Apple Silicon 与 Intel 芯片指令集适配),所有命令均经 2024 年最新稳定版验证,所有报错均附带journalctl -u docker -n 100 --no-pager实测日志片段。如果你的目标是“装完就能用”,而不是“装完就截图发朋友圈”,那这篇就是为你写的。
2. 安装底层逻辑拆解:Docker 引擎不是软件,而是操作系统的一层“皮肤”
2.1 Docker Engine 的真实身份:一个用户态守护进程 + 内核驱动组合体
很多人以为 Docker 就是个类似 Chrome 的桌面应用,双击安装包就完事。这是最大的误解。Docker Engine 实际由两部分组成:dockerd(守护进程)和containerd(容器运行时),而 containerd 又依赖runc(OCI 运行时规范实现)。这三者的关系,就像汽车的发动机、变速箱和火花塞——缺一不可,且必须严格匹配。dockerd是总控大脑,负责接收docker CLI发来的指令(如docker run);containerd是执行中台,把高层指令翻译成具体操作;runc是最终落地的肌肉,直接调用 Linux 内核的clone()、unshare()、mount()等系统调用,创建真正的隔离环境。因此,“安装 Docker”本质上是在你的操作系统上部署一套可被内核信任的、具备特权的用户态服务链。这意味着它必须满足三个硬性前提:
第一,内核版本 ≥ 3.10(CentOS 7 默认 3.10.0-1160,够用;但 Ubuntu 18.04 默认 4.15,更稳);
第二,内核模块已加载:overlay(或overlay2)作为默认存储驱动,br_netfilter(用于网络桥接),ip_tables(iptables 规则支持);
第三,硬件虚拟化开启:x86_64 架构下需 Intel VT-x 或 AMD-V,ARM64 下需 ARM Virtualization Extensions。
提示:
lsmod | grep -E "(overlay|br_netfilter|ip_tables)"是验证内核模块是否就位的黄金命令。如果输出为空,说明即使你装好了dockerd,它启动时也会因找不到overlay驱动而静默失败,日志里只显示failed to start daemon: driver not supported,根本不会提示“请加载模块”。
2.2 为什么 Docker Desktop 在 Windows/macOS 上必须走“虚拟机”路线?
Windows 和 macOS 原生不支持 Linux 容器运行时。Docker Desktop 的本质,是在宿主系统上启动一个轻量级 Linux 虚拟机(Windows 用 Hyper-V 或 WSL2,macOS 用 HyperKit),然后在这个 VM 里完整部署dockerd+containerd+runc。所以当你看到 Docker Desktop 启动条卡在 “Starting the docker engine...”,它真正在做的,是:
- 检查宿主机 BIOS 中的虚拟化开关(Intel VT-x / AMD-V)是否启用;
- 在 Windows 上,确认 WSL2 内核是否已更新至 5.10.102.1 或更高(旧版 WSL2 内核不支持
cgroup v2,导致dockerd启动失败); - 在 macOS 上,验证 Apple Silicon 芯片的 Rosetta 2 是否已为 Docker Desktop 授权(M1/M2 芯片运行 x86_64 镜像时必需);
- 为该 VM 分配内存、CPU、磁盘空间,并挂载
/var/lib/docker目录到宿主机。
注意:Docker Desktop 的“Failed to start because virtualisation support wasn’t detected” 报错,90% 的情况不是 BIOS 没开,而是 Windows 的“Windows Hypervisor Platform”(WHPX)服务未启用。在 PowerShell 中执行
bcdedit /set hypervisorlaunchtype auto并重启,比反复进 BIOS 更有效。很多教程跳过这步,直接让你重装系统,纯属误导。
2.3 社区版 vs 企业版:阿里云服务器预装的“docker”到底是什么?
搜索热词里有“阿里云服务器docker 社区版是自带docker环境吗”,这个问题直击云厂商的交付逻辑。阿里云 ECS、腾讯云 CVM 等主流云服务器,在创建实例时选择“Docker CE”镜像,确实会预装 Docker。但请注意:这个“预装”仅指dockerd二进制文件和 systemd 服务已注册,并不等于环境就绪。我实测过 12 款不同地域的阿里云 Ubuntu 22.04 镜像,发现 3 种典型状态:
- 状态 A(约 40%):
dockerd已启动,docker info可返回信息,但docker run hello-world失败,报错dial unix /var/run/docker.sock: connect: permission denied—— 根本原因是ubuntu用户未加入docker用户组; - 状态 B(约 35%):
systemctl status docker显示inactive (dead),需要手动sudo systemctl enable --now docker; - 状态 C(约 25%):
dockerd启动失败,日志显示failed to start daemon: error initializing graphdriver: driver not supported—— 因为该镜像使用了devicemapper存储驱动,而阿里云的云盘不支持其 loop-lvm 模式,必须手动切换为overlay2。
所以,“预装”不等于“即用”,它只是省去了下载二进制的步骤,核心的权限、驱动、网络配置,仍需你亲手完成。这也是为什么本文标题强调“(2)”——第一篇讲“怎么装”,第二篇必须讲“装完之后,系统到底在想什么”。
3. 全平台实操指南:从裸机到生产环境的 7 种安装路径详解
3.1 Ubuntu/Debian:apt 安装法(推荐给生产服务器)
这是最稳妥、最符合 Linux 发行版哲学的安装方式。它通过官方仓库签名验证,确保二进制文件未被篡改,且能随系统安全更新自动升级。但必须避开两个经典陷阱:GPG 密钥过期和APT 源未刷新。
第一步:卸载旧版残留(强制执行)
sudo apt-get remove docker docker-engine docker.io containerd runc sudo rm -rf /var/lib/docker /var/lib/containerd实操心得:很多“安装失败”源于旧版
docker-ce与新docker.io冲突。docker.io是 Debian/Ubuntu 官方维护的包,docker-ce是 Docker Inc. 官方包,二者不能共存。apt-get remove必须加-y参数并清空/var/lib/docker,否则新dockerd启动时会读取旧数据导致 panic。
第二步:安装依赖与添加 GPG 密钥
sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg关键细节:
gpg --dearmor是将 ASCII-armored 密钥转为二进制格式,这是 Ubuntu 22.04+ 的强制要求。旧教程用apt-key add已被废弃,会导致apt update报NO_PUBKEY错误。
第三步:添加稳定版源并安装
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin参数解析:
$(dpkg --print-architecture)动态获取amd64或arm64,避免手动写死;$(lsb_release -cs)获取jammy(22.04)或noble(24.04),确保源地址精准。docker-buildx-plugin和docker-compose-plugin是 2023 年后 Docker 官方推荐的插件化架构,取代了独立的docker-compose二进制。
第四步:启动并验证
sudo systemctl enable docker sudo systemctl start docker sudo usermod -aG docker $USER # 退出当前终端,重新登录,执行: docker run --rm hello-world注意事项:
usermod -aG docker $USER后必须完全退出终端再重进,因为 Linux 的用户组权限在登录时加载,newgrp docker仅对当前 shell 有效,子进程(如 VS Code 终端)仍无权限。
3.2 Ubuntu/Debian:curl script 安装法(适合快速验证环境)
当 apt 源因网络问题无法访问时,Docker 官方提供一键脚本:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh这个脚本本质是自动化执行了 apt 安装的全部步骤,但它有一个致命风险:脚本本身未签名,且从公网下载,存在中间人劫持可能。我在某次渗透测试中复现过:攻击者污染 DNS,将get.docker.com解析到恶意服务器,脚本下载后执行的是挖矿程序而非dockerd。因此,此方法仅限于本地虚拟机或可信内网,绝对禁止在生产服务器上使用。若必须用,务必先校验脚本 SHA256:
curl -fsSL https://get.docker.com -o get-docker.sh sha256sum get-docker.sh | grep "e1e2f3..." # 官方公布的哈希值需提前从 docs.docker.com 查得3.3 CentOS/RHEL:dnf 安装法(企业级服务器首选)
RHEL 8+ 和 CentOS Stream 使用dnf替代yum,但存储驱动配置更复杂。默认overlay2在某些云盘上性能不佳,需手动优化。
安装命令:
sudo dnf -y install dnf-plugins-core sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin关键配置:
编辑/etc/docker/daemon.json,强制指定存储驱动和日志策略:
{ "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "log-driver": "journald", "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 65536, "Soft": 65536 } } }原理解释:
overlay2.override_kernel_check=true是绕过内核版本检查的“安全阀”,因为某些 RHEL 补丁内核(如 4.18.0-305)虽版本号低,但已 backport overlay2 支持;journald日志驱动比默认json-file更节省磁盘,且与systemd日志系统无缝集成,journalctl -u docker可直接查看结构化日志。
3.4 Windows:WSL2 + Ubuntu 子系统安装(2024 年最稳路径)
放弃 Docker Desktop 原生 Hyper-V 方案,改用 WSL2,是解决 90% Windows 安装失败的终极方案。原因:WSL2 是微软官方维护的轻量级 Linux 内核,对cgroup v2、overlay2支持完美,且无需 BIOS 虚拟化开关(WSL2 使用自己的虚拟化层)。
步骤:
- 在 PowerShell(管理员)中启用 WSL:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart - 重启电脑,下载并安装 WSL2 Linux 内核更新包 ;
- 将 WSL2 设为默认:
wsl --set-default-version 2; - 从 Microsoft Store 安装 Ubuntu 22.04;
- 在 Ubuntu 中执行 3.1 节的 apt 安装流程。
实操心得:WSL2 的
/var/lib/docker默认位于 Windows 磁盘(如C:\Users\XXX\AppData\Local\Packages\...),I/O 性能较差。执行wsl --shutdown后,用 PowerShell 运行:wsl --export Ubuntu-22.04 ubuntu.tar wsl --unregister Ubuntu-22.04 mkdir D:\wsl\docker wsl --import Ubuntu-22.04 D:\wsl\docker ubuntu.tar --version 2将 WSL2 实例迁移到 SSD 盘,
docker build速度提升 3 倍以上。
3.5 Windows:Docker Desktop 原生安装(仅当必须用 GUI)
如果项目强制要求 Docker Desktop 的 Kubernetes 集成或 GUI 镜像管理,必须按以下顺序操作:
- BIOS 中开启 Intel VT-x / AMD-V;
- Windows 功能中启用 “Windows Subsystem for Linux” 和 “Virtual Machine Platform”;
- PowerShell 执行:
bcdedit /set hypervisorlaunchtype auto; - 重启后,安装 Docker Desktop;
- 首次启动时,勾选 “Use the WSL 2 based engine”;
- 进入 Settings → Resources → WSL Integration,启用当前发行版。
常见问题:安装后图标灰色,右键无菜单。这是因为 Docker Desktop 服务(
com.docker.service)未启动。在任务管理器 → 服务 → 找到com.docker.service→ 右键启动。若失败,查看C:\Program Files\Docker\Docker\resources\com.docker.backend.exe是否被杀毒软件拦截。
3.6 macOS:Apple Silicon(M1/M2/M3)芯片专用安装
Apple Silicon 的 Docker Desktop 安装包已原生支持 ARM64,但必须注意两点:
- Rosetta 2 授权:打开“访达” → 右键 Docker Desktop.app → “显示简介” → 勾选 “使用 Rosetta 打开”。这是为了兼容部分 x86_64 构建工具链;
- 资源限制调整:M1 芯片内存带宽高,但默认分配 2GB RAM 给 Docker VM 远远不够。进入 Settings → Resources → Memory,调至 4GB 以上;
- 镜像加速:Apple Silicon 镜像(如
redis:alpine)必须带arm64v8/前缀,否则拉取失败。在~/.docker/config.json中添加:{ "experimental": "enabled", "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
3.7 生产环境加固:安装后的 5 项必做安全配置
装完 Docker 不代表安全。默认配置存在严重风险:
- 禁用 insecure-registries:
/etc/docker/daemon.json中删除所有"insecure-registries"字段,强制 HTTPS; - 限制容器能力:在
daemon.json中添加:
禁用"default-runtime": "runc", "runtimes": { "runc": { "path": "runc" } }, "default-ulimits": { "core": { "Hard": 0, "Soft": 0 } }core dump,防止敏感内存泄露; - 启用内容信任(Notary):
export DOCKER_CONTENT_TRUST=1,所有docker pull自动校验镜像签名; - 审计日志:
sudo dockerd --log-driver=syslog --log-opt syslog-address=udp://127.0.0.1:514,将日志转发至集中审计系统; - SELinux 强制模式:RHEL/CentOS 上执行
sudo setenforce 1,并在daemon.json中添加"selinux-enabled": true。
4. 镜像源与网络配置:国内加速不是简单换 URL
4.1 镜像源失效的真相:不是 URL 错,而是协议与证书不匹配
搜索热词中高频出现“docker镜像源”、“国内docker 镜像仓库”,但很多人配置后依然慢如蜗牛。根本原因在于:国内镜像站已全面启用 HTTPS + 证书校验,而旧版 Docker 客户端(< 20.10)不支持自定义 CA 证书。例如,中科大镜像源https://docker.mirrors.ustc.edu.cn返回的证书由GlobalSign Root CA签发,但某些嵌入式设备或老旧 Ubuntu 的 CA 证书库缺失该根证书,导致docker pull卡死在Get https://docker.mirrors.ustc.edu.cn/v2/。
解决方案分三步:
- 更新 CA 证书:
sudo apt-get install -y ca-certificates && sudo update-ca-certificates; - 配置镜像源:编辑
/etc/docker/daemon.json:{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] } - 重启 Docker:
sudo systemctl restart docker。
验证命令:
curl -I https://docker.mirrors.ustc.edu.cn/v2/应返回HTTP/2 200,而非HTTP/1.1 301(重定向错误)。
4.2 高级网络配置:解决容器无法访问外网的 3 类场景
容器ping www.baidu.com失败,90% 的情况与宿主机网络无关,而是 Docker 的iptables规则被其他软件(如 firewalld、ufw)覆盖。
场景一:Ubuntu 启用 ufw 后容器失联
ufw 默认拒绝FORWARD链,而 Docker 的docker0网桥流量必须经过此链。修复:
sudo ufw default allow routed sudo ufw reload场景二:CentOS firewalld 启用后容器 DNS 失效
firewalld 的publiczone 默认丢弃docker0接口的流量。修复:
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0 sudo firewall-cmd --reload场景三:自定义 bridge 网络与宿主机同网段冲突
执行docker network create --subnet=192.168.1.0/24 mynet后,宿主机192.168.1.x网段访问异常。这是因为 Docker 的iptablesSNAT 规则将所有192.168.1.0/24流量伪装为docker0IP。解决方案:
docker network create --subnet=172.20.0.0/16 --gateway=172.20.0.1 mynet使用172.16.0.0/12私有网段,彻底规避冲突。
4.3 镜像构建加速:php 使用 docker 打包镜像的 3 个关键技巧
热词中“php使用docker打包镜像”是高频需求。但docker build一次耗时 10 分钟,其中 8 分钟在apt update && apt install。优化核心是:利用 Docker Build Cache 和多阶段构建。
技巧一:基础镜像选择
不用php:8.2-apache,改用php:8.2-cli-slim,体积从 480MB 降至 120MB,docker pull时间减少 75%。
技巧二:多阶段构建
# 构建阶段 FROM php:8.2-cli-slim AS builder RUN apt-get update && apt-get install -y unzip && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY composer.json composer.lock ./ RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \ php composer-setup.php && mv composer.phar /usr/local/bin/composer RUN composer install --no-dev --optimize-autoloader # 运行阶段 FROM php:8.2-cli-slim COPY --from=builder /app/vendor /app/vendor COPY . /app CMD ["php", "index.php"]--from=builder只复制vendor目录,不携带apt、composer等构建工具,镜像纯净度提升 90%。
技巧三:.dockerignore 文件
在项目根目录创建.dockerignore:
.git .gitignore README.md tests/ node_modules/ composer.lock避免COPY . .时上传无用文件,docker build上下文体积减少 60%,缓存命中率大幅提升。
5. 故障排查实战:从日志到修复的完整闭环
5.1 “Starting the docker engine...” 卡住的 5 种根因与修复
这是 Docker 安装失败的头号报错。journalctl -u docker -n 100 --no-pager日志是唯一真相来源。以下是 5 种高频场景及对应修复:
| 日志关键词 | 根本原因 | 修复命令 |
|---|---|---|
failed to start daemon: error initializing graphdriver: driver not supported | 存储驱动不兼容(如devicemapper在云盘上) | `sudo mkdir -p /etc/docker && echo '{"storage-driver": "overlay2"}' |
failed to start daemon: error initializing graphdriver: failed to get overlay mount options: invalid argument | 内核不支持overlay2(如 CentOS 7.6 旧内核) | sudo yum update kernel && sudo reboot |
failed to start daemon: error initializing graphdriver: failed to get overlay mount options: no such file or directory | /var/lib/docker目录被删除,但dockerd仍尝试加载旧元数据 | sudo rm -rf /var/lib/docker && sudo systemctl start docker |
Error starting daemon: Devices cgroup isn't mounted | cgroup v1 未挂载(常见于 Ubuntu 22.04+ 默认 cgroup v2) | 编辑/etc/default/grub,在GRUB_CMDLINE_LINUX行末尾添加systemd.unified_cgroup_hierarchy=0,然后sudo update-grub && sudo reboot |
failed to start daemon: error initializing graphdriver: failed to get overlay mount options: invalid argument | /var/lib/docker所在文件系统不支持d_type=true(如 ext3、XFS 未启用 ftype=1) | sudo mkfs.xfs -f -n ftype=1 /dev/sdb1(重建 XFS 分区)或改用ext4 |
实操心得:每次修改
daemon.json后,务必执行sudo dockerd --config-test验证语法正确性,避免因 JSON 格式错误导致systemctl start docker静默失败。
5.2 “Permission denied while trying to connect to the Docker daemon socket” 的 3 层排查
这个报错表面是权限问题,实则是用户组、socket 文件、SELinux 三层防护的综合结果。
第一层:用户组未加入
groups $USER | grep docker # 若无输出,则执行: sudo usermod -aG docker $USER # 然后完全退出终端重进第二层:socket 文件权限异常
ls -l /var/run/docker.sock # 正常应为:srw-rw---- 1 root docker 0 ... # 若为 srw------- 1 root root,则执行: sudo chown root:docker /var/run/docker.sock sudo chmod 660 /var/run/docker.sock第三层:SELinux 限制(RHEL/CentOS)
sudo setsebool -P container_manage_cgroup on sudo restorecon -Rv /var/run/docker.sock注意:
setsebool -P的-P参数表示永久生效,否则重启后恢复默认策略。
5.3 “Cannot connect to the Docker daemon at unix:///var/run/docker.sock” 的网络级诊断
当dockerCLI 完全无法连接 daemon,需跳出用户权限思维,从网络协议层诊断:
确认 dockerd 进程是否存活:
ps aux | grep dockerd # 若无输出,说明服务未启动:`sudo systemctl start docker`确认 socket 文件是否存在:
ls -l /var/run/docker.sock # 若提示 "No such file or directory",说明 dockerd 启动失败,回到 5.1 节排查确认 Docker CLI 是否指向正确 socket:
echo $DOCKER_HOST # 若输出 `tcp://127.0.0.1:2375`,说明 CLI 被强制指向 TCP 端口,而 dockerd 默认只监听 unix socket。执行: unset DOCKER_HOST终极验证:用 curl 直接调用 API:
curl --unix-socket /var/run/docker.sock http://localhost/version # 成功返回 JSON 即证明 daemon 正常,CLI 问题;若失败,则是 socket 权限或 SELinux 问题。
5.4 常见问题速查表:一句话定位,三步修复
| 问题现象 | 一句话定位 | 三步修复命令 |
|---|---|---|
docker run hello-world报dial unix /var/run/docker.sock: connect: permission denied | 当前用户不在docker组 | sudo usermod -aG docker $USER→ 退出终端 → 重进终端 |
sudo systemctl status docker显示active (exited) | dockerd 启动后立即退出,通常是配置错误 | sudo dockerd --config-test→ 修正/etc/docker/daemon.json→sudo systemctl restart docker |
docker pull nginx卡在Waiting | 镜像源配置无效或网络不通 | curl -I https://docker.mirrors.ustc.edu.cn/v2/→ 若失败,换源或更新 CA →sudo systemctl restart docker |
docker images无输出,但docker ps -a有容器 | 镜像被误删,或存储驱动损坏 | sudo docker system prune -a→sudo rm -rf /var/lib/docker→sudo systemctl start docker |
WSL2 中docker build极慢,CPU 占用 100% | WSL2 默认使用ext4文件系统,I/O 性能差 | wsl --shutdown→wsl --export→wsl --unregister→wsl --import到 NTFS 分区 |
6. 进阶实践:从安装到部署的平滑过渡
6.1 安装完成后,立刻执行的 3 个验证性操作
不要急于docker run,先用这 3 个命令建立对环境的完整掌控:
操作一:验证 daemon 健康度
sudo docker info | grep -E "(Server Version|Storage Driver|Logging Driver|Security Options)"输出应包含Server Version: 24.0.7,Storage Driver: overlay2,Logging Driver: journald,Security Options: seccomp, apparmor, rootless。若Storage Driver显示vfs,说明overlay2加载失败,需检查内核模块。
操作二:验证网络连通性
docker run --rm alpine ping -c 3 8.8.8.8 docker run --rm alpine nslookup google.com前者测试 IP 层,后者测试 DNS。若前者成功后者失败,说明/etc/resolv.conf配置错误,需在daemon.json中添加:
"dns": ["114.114.114.114", "8.8.8.8"]操作三:验证镜像拉取链路
time docker pull --platform linux/amd64 nginx:alpine记录耗时。若超过 2 分钟,立即检查镜像源配置和网络代理。--platform参数强制指定架构,避免 Apple Silicon 机器拉取arm64镜像失败。
6.2 为后续部署铺路:Docker Compose 的安装与验证
“docker compose” 是热词高频项,但docker-compose(v1)和docker compose(v2)是两个不同项目。2024 年必须用 v2(即docker compose插件)。
安装(Ubuntu/Debian):
sudo apt-get install -y docker-compose-plugin # 验证: docker compose version # 输出应为:Docker Compose version v2.23.0验证 YAML 解析:
创建test-compose.yml:
services: web: image: nginx:alpine ports: ["8080:80"]执行:
docker compose -f test-compose.yml up -d curl http://localhost:8080 docker compose -f test-compose.yml down若curl返回 Nginx 欢迎页,说明 Compose 环境完全就绪。
6.3 安全基线检查:运行docker scan的前置条件
docker scan是 Docker 官方提供的镜像漏洞扫描工具,但需先完成两项配置:
登录 Docker Hub:
docker login # 输入账号密码(非邮箱)启用 Docker Scout(Personal 计划免费):
docker scout quickview nginx:alpine # 首次运行会提示启用,按 y 确认
注意:
docker scan依赖docker scout服务,若执行docker scan nginx:alpine报scout command not found,说明docker-scout-plugin未安装,需执行sudo apt-get install -y docker-scout-plugin。
6.4 个人经验:我踩过的 3 个深坑与避坑口诀
- 坑一:在阿里云 ECS 上用
docker.io包,结果docker build时apt update超时
原因:docker.io包的 `containerd