最近帮朋友搞了一台新电脑的Docker环境,Windows上各种诡异报错一个接一个,从“virtualisation support wasn’t detected”到“WSL未安装”,再到装完以后拉个MySQL镜像等了十分钟还没动静。我一边排坑一边把整个思路理了一遍:从装前准备、Windows和Linux平台怎么选,到装完验证、镜像加速,再到用MySQL、Redis、DVWA这些镜像把容器真正跑起来,一次说清楚。不管你是刚接触docker安装的新人,还是卡在Docker Desktop各种启动报错的老同学,这篇应该都能帮到你。
1. 装Docker前先想清楚这三件事,后面能少踩一半坑
1.1 Docker到底在装什么,它和虚拟机不是一回事
很多人装Docker之前没弄清楚它和VMware、VirtualBox这类虚拟机的区别,结果出了问题根本不知道往哪查。Docker不是“装一个软件”就完事,它依赖Linux内核里的namespace和cgroup技术做进程隔离和资源限制。换句话说,Docker容器和宿主机共享内核,所以Linux上跑Docker最顺畅,天生就是一家人。
但在Windows和macOS上,事情就复杂了:Windows没有Linux内核,Docker Desktop就必须先在系统里垫一层轻量级Linux环境,最常用的方案就是WSL2或者Hyper-V。WSL2本质上是一个通过虚拟化技术运行的Linux子系统,Docker Desktop的引擎就跑在这个Linux环境里。这也是为什么你安装Docker Desktop之前,系统必须开启CPU虚拟化、必须装好WSL2,少一个都起不来。很多报错,比如“Docker Desktop failed to start because virtualisation support wasn’t detected”,根子就在这一层。
理解了这个关系,你排错的时候就能分清楚:问题到底是出在物理机虚拟化,是WSL2环境,还是Docker Desktop本身的引擎。分层排查比瞎试命令高效得多。
1.2 Docker Desktop和Docker Engine,你该装哪个
搜“docker安装”的时候,很容易被各种教程搞晕:有人叫你装Docker Desktop,有人叫你装docker-ce,还有人直接在Linux上用apt install docker.io。到底哪个是对的?取决于你的操作系统。
- 桌面操作系统(Windows、macOS):装Docker Desktop,它是一个带图形界面的完整方案,集成了Docker引擎、docker CLI、Compose插件、Kubernetes单机集群。
- Linux服务器或云主机:装Docker Engine,也就是社区版docker-ce,没有图形界面,但轻量稳定,是生产环境最常用的选择。
- 老教程里的
apt install docker.io也能装,但版本通常偏旧,而且会被系统包管理器的仓库版本卡住,不建议新手用。
Docker Desktop和Docker Engine里的“引擎”是同一套,所以你不必担心在Windows上学的东西到Linux上就白学了,命令完全通用。选型的关键就一句:带桌面的Windows/Mac装Desktop,跑服务的Linux装Engine。
1.3 安装前检查清单
我见过不少人在装到一半才发现自己电脑根本不满足硬件条件,白折腾一下午。这里列一个检查清单,建议装之前先过一遍。
| 检查项 | 最低要求 | 说明 |
|---|---|---|
| CPU虚拟化 | BIOS/UEFI里开启Intel VT-x或AMD-V | Windows任务管理器“性能-CPU”里能看到“虚拟化:已启用” |
| 内存 | 至少4GB,建议8GB以上 | WSL2和Docker Desktop本身会占1GB以上,跑多个容器时更吃内存 |
| 系统版本 | Windows 10 2004(build 19041)及以上,或Windows 11 | Docker Desktop 4.26开始,对旧版Windows会直接报incompatible version |
| WSL2 | 启用“适用于Linux的Windows子系统”功能 | 需要管理员权限执行wsl --install,内核版本建议5.10以上 |
| Linux环境 | 内核3.10以上,建议4.0以上 | 太老的CentOS 6之类不建议装新版Docker |
| 网络 | 能访问镜像仓库 | 如果拉镜像慢,见第4章的加速器配置 |
这些条件不满足,后面等于白搭。尤其是公司电脑,BIOS里虚拟化经常被IT部门关掉,装机师傅又不会去开,检查这一项能省一大半排错时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Windows下安装Docker Desktop:从检查虚拟化到完全跑通的完整流程
2.1 先解决“虚拟化检测不到”的老大难
Windows上装Docker Desktop,最常见的拦路虎就是任务管理器里虚拟化显示“已禁用”,或者安装后启动直接弹出那句经典的“Docker Desktop failed to start because virtualisation support wasn’t detected”。
这句话翻译成人话就是:Docker Desktop需要在WSL2虚拟机里运行Linux环境,但你的CPU虚拟化没有打开,虚拟机根本没法创建。
解决步骤如下:
- 重启电脑,开机时按Del或F2进入BIOS/UEFI设置(不同品牌按键不同,常见的有F2、F10、Del)。
- 找到CPU配置相关选项,名称一般是“Intel Virtualization Technology”“Intel VT-x”“AMD-V”“SVM Mode”。
- 设置为Enabled,保存退出。
- 进入Windows后,打开任务管理器,性能 -> CPU,确认“虚拟化”那一行显示“已启用”。
如果你用的是Win11,还需要确认“Windows功能”里“虚拟机平台”和“适用于Linux的Windows子系统”两个选项都勾上了。勾选方法:控制面板 -> 程序和功能 -> 启用或关闭Windows功能,或者用管理员PowerShell执行:
powershell复制Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform, Microsoft-Windows-Subsystem-Linux -All
执行完重启,再启动Docker Desktop。很多人的问题到这一步就解决了。
2.2 WSL2的安装和默认版本切换
Docker Desktop从较新版本开始默认用WSL2作为后端,而不是老一代的Hyper-V。WSL2启动快、内存管理好,和Docker的结合也最顺。
最省事的安装方法是用管理员身份打开PowerShell或CMD,执行:
powershell复制wsl --install
它会自动开启必要的Windows功能并安装默认的Linux发行版。如果系统提示“适用于Linux的Windows子系统”没有启用,就先执行上一节那条Enable-WindowsOptionalFeature命令。装完后重启,然后执行:
powershell复制wsl --set-default-version 2
把默认版本设为WSL2。这一步很关键,因为WSL还分第一代和第二代,Docker Desktop要求的是WSL2,第一代的磁盘性能差很远。
检查当前状态:
powershell复制wsl --list --verbose
输出结果里会有一个VERSION列,如果是1,说明你某台发行版还在用WSL1,用下面命令切换:
powershell复制wsl --set-version <发行版名字> 2
如果你刚执行wsl --install就报“未安装WSL”之类的错误,大概率是系统版本太旧,或者安装过程没重启。先更新Windows补丁到至少Windows 10 2004,再重装一次。
还有个小细节:Docker Desktop启动时会自动使用默认的WSL发行版作为后端,但如果你机器上装了好几个发行版,可以在Docker Desktop的Settings -> Resources -> WSL Integration里控制哪个发行版允许集成。默认情况下Docker会创建一个专用的docker-desktop发行版,不用手动去碰它。
2.3 下载安装Docker Desktop,以及安装到D盘的问题
从Docker官网下载Docker Desktop安装包,选最新稳定版就行。关于版本,2024年以后的版本号基本都是4.x,比如4.26、4.28,如果你的机器是Windows 11,放心用新版本;如果是Windows 10的老版本,先更新系统,否则会碰到“We’ve detected that you have an incompatible version of Windows”的提示。
双击安装包,安装过程中会出现两个勾选项:
- Use WSL 2 instead of Hyper-V(推荐,除非你有特殊理由用Hyper-V)
- Add shortcut to desktop
安装完成后一般会要求重启。重启完第一次启动Docker Desktop,右下角会显示Docker Engine正在启动,这个过程第一次可能比较久,因为它还要初始化WSL2环境。
关于“Docker Desktop安装到D盘”这个常见需求,我说下实际情况:安装包本身在安装时可以选择路径,但它写入用户目录的数据(镜像、容器、配置)默认在C:\Users\你的用户名\AppData\Local\Docker和WSL的VHD文件里。C盘空间不够的人,真正影响大的是后面这部分。
修改镜像存储位置的方法:
- 打开Docker Desktop,Settings -> Resources -> Advanced。
- 找到“Disk image location”,点Browse选择D盘或其他分区。
- Apply & Restart,Docker会迁移现有的镜像数据。
这套操作只迁移Docker的数据盘,WSL2发行版自带的VHD还在C盘,但占大头的镜像和容器都在D盘了,效果很明显。
2.4 启动中的常见报错对照表
我结合这些年见到的报错,整理了一个对照表,遇到问题先看这张表,比自己瞎猜快得多。
| 报错信息 | 根本原因 | 处理方案 |
|---|---|---|
| Docker Desktop failed to start because virtualisation support wasn’t detected | BIOS虚拟化未开启或Hyper-V未启用 | 按2.1节开启VT-x/AMD-V,启用虚拟机平台功能 |
| We’ve detected that you have an incompatible version of Windows | Windows版本过旧 | 更新到Windows 10 2004或更高版本,建议Win11 |
| Docker Desktop requires a newer WSL kernel version | WSL2内核过旧 | 执行wsl --update升级内核 |
| wsl: command not found或未安装WSL | 未启用Windows子系统功能 | 执行wsl --install,重启 |
| failed to connect to the docker api at npipe:////./pipe/dockerdesktop-linux | Docker客户端连不上引擎,引擎没起来 | 确认Docker Desktop是否完成启动;重启Docker Desktop;wsl --shutdown后重试 |
| Docker Desktop is starting…卡住不动 | WSL2环境异常或残留数据损坏 | 执行wsl --shutdown,重启Docker;如果还不行,Settings -> Troubleshoot -> Clean / Purge data |
| permission denied while trying to connect to the Docker daemon socket | Linux端用户没权限 | 执行sudo usermod -aG docker $USER,重新登录 |
这几个问题里,“npipe连接失败”尤其吓人,很多人以为Docker坏透了,其实只要在任务管理器里把Docker Desktop彻底退出,再重新打开,等右下角鲸鱼图标稳定,基本就能好。如果反复出现,大概率是WSL2的后端崩了,先执行wsl --shutdown。
2.5 装完以后怎么确认自己真的装好了
启动Docker Desktop之后,打开PowerShell或CMD,执行:
powershell复制docker version
看到Client和Server两段都输出正常版本号,就说明引擎已经起来了。注意,Server段如果显示Cannot connect to the Docker daemon,说明引擎还没起来,等一会儿再试。
接着跑一个经典的hello-world:
powershell复制docker run hello-world
第一次执行需要拉取镜像,如果网速慢会卡一会儿。能看到一段“Hello from Docker!”的英文说明,整个安装过程就彻底验收通过了。
如果卡在拉镜像这一步不动,别慌,一般是镜像加速没配置,下一步马上解决。
3. Linux服务器安装Docker Engine:Ubuntu、CentOS、离线场景一次说清
3.1 Ubuntu/Debian安装:推荐使用官方仓库安装docker-ce
Linux服务器上安装Docker,我最推荐的是从Docker官方仓库安装docker-ce,因为这样可以拿到最新版本,也方便后续apt upgrade自动升级。Ubuntu系统分两个流派:用官方源,或者用国内镜像源。它们的安装命令几乎一样,只是仓库地址不同。
先卸载系统自带的旧版本:
bash复制sudo apt remove docker docker-engine docker.io containerd runc
安装依赖:
bash复制sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
添加Docker官方GPG密钥和仓库:
bash复制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 a+r /etc/apt/keyrings/docker.gpg
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
如果你的服务器在国内,拉GPG密钥和软件包都可能很慢,可以把download.docker.com换成阿里云或清华等镜像站的地址。以阿里云为例:
bash复制curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
然后更新索引并安装:
bash复制sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
最后设置开机自启并启动服务:
bash复制sudo systemctl enable docker
sudo systemctl start docker
这里有新手容易犯的一个错误:直接用apt install docker.io。那个包来自Ubuntu自己的仓库,版本旧,升级策略也和Docker官方不同。特别是后面要用docker compose新语法时,旧版本Docker不支持,会很麻烦。所以,走官方仓库安装,宁可在前面多敲两行命令。
3.2 CentOS/RHEL安装:yum源配置与CentOS 7升级的坑
CentOS上安装Docker,逻辑类似,但用的是yum/dnf。先安装yum-utils:
bash复制sudo yum install -y yum-utils
配置仓库。官方源:
bash复制sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
国内源用阿里云:
bash复制sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
然后安装:
bash复制sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动:
bash复制sudo systemctl enable docker
sudo systemctl start docker
如果你用的是CentOS 7,有几个非常实际的坑必须注意。
第一,CentOS 7系统自带的yum源可能没有docker-ce包,报“没有可用软件包”时,大概率是仓库没有生效,检查/etc/yum.repos.d/docker-ce.repo里的地址,确保网络能访问到。
第二,老版本Docker 1.13升级到新版时,会出现旧容器、旧网络配置和新版不兼容的情况。升级前先导出需要的容器和镜像:
bash复制docker save -o backup.tar <镜像名>
升级后如果docker服务起不来,看journalctl -u docker,有时候是因为/var/lib/docker里的数据结构版本太旧。这时可以备份后清空/var/lib/docker重建,但一定记得先备份,别手滑。
第三,CentOS 7自带的内核是3.10,Docker官方要求内核3.10以上,但很多新特性在新版容器上会有限制。能用CentOS 8+或Rocky Linux/AlmaLinux的,尽量用新系统,省心很多。
3.3 离线安装:内网服务器怎么装
很多生产环境是内网隔离的,没法直接访问外网仓库。这时候有两种方式:
一种是找一台能联网的机器,从Docker官方仓库下载好所有RPM或DEB包,再拷贝进内网。比如在联网机器上:
bash复制yum install --downloadonly --downloaddir=/tmp/docker-rpm docker-ce docker-ce-cli containerd.io docker-compose-plugin
把/tmp/docker-rpm整个目录拷进内网,然后在内网机器上执行:
bash复制yum localinstall -y /tmp/docker-rpm/*.rpm
Debian系同理,用apt download或apt-get download下载对应的.deb包,内网用dpkg -i *.deb安装。
另一种是直接拿二进制的Docker静态包。Docker官方提供docker-24.x.x.tgz这种压缩包,解压后把docker、dockerd、containerd这几个二进制放到/usr/bin,再写一个systemd service文件。这种方式适合特别封闭的离线环境,但手动管理进程,复杂度高一截,新手不推荐。
离线环境的另一个问题是镜像是空的,内网也没有仓库拉镜像。这时候要么在线下导出镜像(docker save),拷贝到内网再docker load,要么在内网搭一个Harbor或Registry私有仓库。我这里只提醒一句:离线环境装Docker引擎只是开始,镜像供应链才是大头,提前规划好。
3.4 Linux安装后的权限问题
很多人装完Docker,用起来第一个恼火的是每次都要sudo docker,不敲sudo就报:
text复制docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
这个报错是因为当前用户不在docker组里。解决办法:
bash复制sudo usermod -aG docker $USER
执行完退出当前终端重新登录,再跑docker version。如果还是报同样错误,可能需要sudo systemctl restart docker,或者重启服务器。
但这里我必须强调一个安全常识:把用户加入docker组,相当于给了该用户近乎root的权限。因为docker组里的用户可以任意挂载宿主机的目录进容器,也就等于可以读写宿主机文件系统。生产环境里,不要随便给所有开发人员都加docker组,能理解这一点,很多安全隐患在源头就能避免。
4. 安装完先别急着拉镜像,把加速器、常用命令和Compose都配好
4.1 镜像下载慢,先给Docker配置镜像加速
安装好Docker之后,很多人第一次docker pull就心态崩了,一个Ubuntu镜像等了十分钟还在转圈。原因不复杂:默认的镜像仓库Docker Hub在海外,网络链路长。国内主流做法是配置镜像加速器。
Linux上修改/etc/docker/daemon.json:
json复制{
"registry-mirrors": ["https://你的专属加速地址.mirror.aliyuncs.com"]
}
云厂商的镜像加速地址一般需要登录控制台才能拿到,比如阿里云容器镜像服务,会为每个用户分配一个专属地址。其他云厂商也有类似服务。拿到地址后写进配置,重启生效:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
验证是否生效:
bash复制docker info | grep -A 5 "Registry Mirrors"
输出里能看到你配置的地址就算成功。
Windows上的Docker Desktop配置更简单:打开Settings -> Docker Engine,在JSON配置里加入同样的registry-mirrors字段,点Apply & Restart即可。
配置好后,拉镜像速度会有质的提升。我实测一个MySQL 8.0镜像,没加速之前可能等五六分钟,配置后几十秒就下来了。
4.2 用三条命令验证安装结果
很多人docker version看到Client和Server都正常,就觉得大功告成。但真正能验证“镜像可以拉、容器能跑起来”的,是下面三条命令:
bash复制docker run hello-world
这条命令先检查本地有没有hello-world镜像,没有就去仓库拉,然后启动容器,打印一段Hello from Docker的说明。如果这条能完整跑完,说明镜像仓库连接、容器创建、执行整个链路都没问题。
bash复制docker run -it --rm ubuntu:22.04 bash
这条会拉Ubuntu 22.04镜像并进入容器内的bash。能正常进入,说明交互式终端参数-it、镜像拉取、shell执行都正常。--rm参数表示退出容器后自动删除容器,不会残留垃圾。
bash复制docker ps
docker ps -a
分别查看运行中的容器和所有容器。hello-world执行完会被--rm或默认状态清理掉,ps -a如果能看到刚才的容器记录,说明整个生命周期管理正常。
三条命令都通过,你的Docker才算真正“能用了”,而不是“装好了”。
4.3 日常必用命令速查
我把日常运维最常用的命令整理成一张表,建议新手先背这些,剩下的用到时候再查。
| 命令 | 作用 | 示例 |
|---|---|---|
| docker images | 查看本地镜像列表 | docker images |
| docker pull | 拉取镜像 | docker pull mysql:8.0 |
| docker run | 创建并启动容器 | docker run -d --name web -p 8080:80 nginx |
| docker ps | 查看运行中的容器 | docker ps -a(含退出的) |
| docker logs | 查看容器日志 | docker logs -f web |
| docker exec -it | 进入运行中的容器 | docker exec -it web bash |
| docker stop/start/restart | 停止/启动/重启容器 | docker restart web |
| docker rm | 删除容器 | docker rm -f web |
| docker rmi | 删除镜像 | docker rmi nginx |
| docker system prune | 清理停止的容器、悬空镜像、未使用网络 | docker system prune -a |
| docker stats | 查看容器资源占用 | docker stats |
这里特别提醒一下docker exec -it,它是你进入容器内部排查问题的核心手段。比如MySQL容器启动失败,你docker logs看不出原因,就可以:
bash复制docker exec -it mysql8 bash
进去以后看错误日志、手动跑命令,比在外面干猜高效得多。
4.4 不要忽略Docker Compose
装了Docker之后,docker compose插件是标配,尤其是Docker Desktop版本自带compose。它的价值在于:把多个容器的启动参数写在一个YAML文件里,一条命令全部启动,不需要绕着一大串docker run参数转。
一个最简单的compose文件compose.yml:
yaml复制version: '3.8'
services:
web:
image: nginx:1.25
ports:
- "8080:80"
redis:
image: redis:7
ports:
- "6379:6379"
启动:
bash复制docker compose up -d
查看状态:
bash复制docker compose ps
全部停止并删除:
bash复制docker compose down
我建议新手从装完Docker那一刻起就习惯用compose来定义容器,而不是靠记忆敲一长串docker run。一方面可读性强,另一方面以后部署微服务项目的时候,几十个服务靠docker compose up -d一键拉起,那个爽感是单条run命令给不了的。
5. 实战验收:用MySQL 8.0、Redis主从和DVWA把Docker用起来
5.1 MySQL 8.0的安装与使用,重点在于持久化
很多人装完Docker想做的第一件事就是跑一个MySQL,正好拿这个来验收安装成果。一行命令的事:
bash复制docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
-v /data/mysql:/var/lib/mysql \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
参数解释一下:
-d:后台运行--name mysql8:容器名称-p 3306:3306:宿主机3306端口映射到容器3306-e MYSQL_ROOT_PASSWORD:设置root密码-e TZ=Asia/Shanghai:设置时区-v /data/mysql:/var/lib/mysql:把宿主机目录挂载到容器数据目录,这是最关键的持久化参数,不写它容器一删数据全没--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci:指定字符集排序规则,避免中文乱码
验证连接:
bash复制docker exec -it mysql8 mysql -uroot -p
输入密码进入MySQL命令行,执行show databases;能看到系统库正常。
这里我想多说一句持久化的问题。很多人刚接触Docker,习惯忘掉-v,结果容器一删,辛苦建的表全没了。理解/var/lib/mysql是在容器内部,容器是“一次性”的,一定要把数据写到宿主机目录,这个观念越早建立越好。之后无论是重装容器、升级镜像版本,只要挂载目录没动,数据都在。
5.2 Redis主从搭建:一条命令验证网络配置能力
搜“docker安装redis主从”的人不少,下面给一个最简的搭建过程。
先起主库:
bash复制docker run -d --name redis-master -p 6379:6379 redis:7 redis-server --appendonly yes
再起从库,注意这里的--replicaof参数要指向主库地址:
bash复制docker run -d --name redis-slave -p 6380:6379 redis:7 redis-server --replicaof <主库IP> 6379
如果你是在同一台机器上跑,主库IP可以通过docker inspect redis-master | grep IPAddress查看,比如172.17.0.2。这样写:
bash复制docker run -d --name redis-slave -p 6380:6379 redis:7 redis-server --replicaof 172.17.0.2 6379
验证从库状态:
bash复制docker exec -it redis-slave redis-cli info replication
输出里role:slave,并且master_link_status:up,说明主从建立成功。
这个例子虽然简单,但很能锻炼一个关键能力:容器之间的网络互通。默认情况下Docker会创建一个bridge网络,同一台机器上的容器可以通过容器IP互相访问。如果你用-p把端口映射到宿主机,那外部也能通过宿主机IP访问。这两个概念搞明白了,后面部署任何中间件集群都顺。
5.3 DVWA靶场:用Docker快速搭建Web安全学习环境
“kali搭建dvwa靶场docker”是很多人搜索的场景。DVWA是一个专门用来练习Web安全的靶场应用,用Docker搭它极其省事,不用装PHP、MySQL,一条命令搞定:
bash复制docker run -d --name dvwa -p 80:80 vulnerables/web-dvwa
浏览器访问http://localhost,默认登录账号admin,密码password。进入后就能进行SQL注入、XSS、文件上传等安全测试练习。
不过有两个必须注意的点:
第一,DVWA默认配置很脆弱,里面全是故意留的漏洞,千万别把它暴露到公网。只放在本机或内网隔离环境里学习用,否则你就是给全网白送一台肉鸡。
第二,用Docker跑靶场和Kali没什么冲突,Kali是攻击机,DVWA是靶机,两个可以分开部署。你完全可以在Kali里用浏览器访问Docker上跑的DVWA,这是很标准的“攻击机-靶机”结构。
5.4 通用部署模板:一条命令装一个应用
MySQL、Redis、DVWA都跑通之后,你会发现所有容器的启动逻辑都一样:拉镜像(可能省略)、docker run映射端口、挂载数据卷、传环境变量。搜“docker部署kodbox”这类应用,本质也是这个套路。
以kodbox(一款可私有部署的网盘软件)为例:
bash复制docker run -d \
--name kodbox \
-p 8080:80 \
-v /data/kodbox:/var/www/html \
kodbox/kodbox
访问http://localhost:8080就能进入安装界面。
以后你想部署任何新应用,第一件事去Docker Hub或应用官网找它的镜像名和运行参数,然后把端口、数据卷、环境变量三个核心部分填好,命令基本就出来了。这套模板我用了很多年,从个人项目到微服务部署都通用。
6. 安装遇到问题,按这套思路排查,别瞎试
6.1 把问题分到三层:客户端、引擎、内核/虚拟化
Docker的问题虽然表现五花八门,但基本上可以归到三个层面。
- 客户端层:你敲
docker命令时报错,比如找不到命令、连接被拒绝,通常问题出在CLI配置或客户端到引擎的连接通道。 - 引擎层:Docker服务本身没起来,比如Linux上
systemctl status docker显示failed,引擎崩溃或配置错误。 - 内核/虚拟化层:Windows上最常见,比如虚拟化未开启、WSL2没装好、Hyper-V被禁用。Linux上则可能是内核版本太老、缺少某些模块。
举例来说,Windows上的failed to connect to the docker api at npipe是客户端连不上引擎;Docker Desktop一直starting是引擎没起来;而virtualisation support wasn’t detected就是虚拟化层的问题。分清层次,你就能知道该去查BIOS、查WSL2,还是查Docker Desktop设置,而不是把所有重装手段都试一遍。
6.2 日志是最好的医生
很多人遇到问题第一反应是重启、重装,但日志才是指出问题根源的关键。
Windows上,Docker Desktop的日志可以通过界面里的Troubleshoot面板收集,也可以直接看这个目录:
text复制%LOCALAPPDATA%\Docker\log
里面有很多*.log文件,按时间排序后找最新的那个,用文本编辑器打开,搜索“error”“failed”等关键词,通常能直接看到失败原因。
Linux上更直接:
bash复制sudo systemctl status docker
sudo journalctl -u docker -n 100
如果docker服务起不来,journalctl输出里会有具体报错,比如网络冲突、overlay2驱动加载失败、iptables配置错误等。把日志里的关键行复制到搜索引擎里,大概率能直接找到解决方案。这比我隔着屏幕猜原因靠谱一万倍。
6.3 端口和防火墙是第二个检查点
容器启动成功,但外部访问不了,这类问题不在Docker本身,而在端口和防火墙。
先确认端口映射是否生效:
bash复制docker ps
看PORTS列,比如0.0.0.0:3306->3306/tcp,表示宿主机3306端口映射到了容器3306。如果是127.0.0.1:3306->3306/tcp,那只有本机能访问,外部访问不到,这是常见坑。
如果映射正常但外部还是连不上,检查防火墙:
Ubuntu上:
bash复制sudo ufw status
sudo ufw allow 3306/tcp
CentOS上:
bash复制sudo firewall-cmd --list-ports
sudo firewall-cmd --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
云服务器的话,还要去安全组放行对应端口。这个步骤经常被人忽略,明明容器都正常,Navicat就是连不上MySQL,查到最后都是安全组或防火墙拦着。
6.4 彻底清理重装,但先把数据备份好
如果以上排查都做了,Docker Desktop还是各种诡异,最后一招是彻底清理后重装。
Windows上的彻底清理步骤:
- 退出Docker Desktop。
- 管理员PowerShell执行
wsl --shutdown。 - 在“设置-应用-已安装的应用”里卸载Docker Desktop。
- 删除残留目录:
C:\ProgramData\Docker、%USERPROFILE%\AppData\Local\Docker、%USERPROFILE%\AppData\Roaming\Docker。 - 如果还有残留的WSL发行版,执行
wsl --unregister docker-desktop和wsl --unregister docker-desktop-data(旧版本有这两个发行版)。 - 重新下载安装。
Linux上的彻底清理:
bash复制sudo systemctl stop docker
sudo apt remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo rm -rf /var/lib/docker /etc/docker /etc/apt/sources.list.d/docker.list
注意,rm -rf /var/lib/docker会删除所有本地镜像、容器和数据卷。如果里面有重要数据,先启动容器把数据导出,或者把整个/var/lib/docker拷贝备份。清理重装是最后的杀手锏,没有数据备份前千万别执行。
这套排查流程下来,大部分Docker安装和启动问题都能定位到根因。我个人的体会是,Docker安装的大多数翻车现场,往往不是Docker本身难装,而是Windows虚拟化环境和WSL2这层底子没打好。你把这层底子理顺了,后面所有容器操作都变得丝滑。还有一个很多人不知道的小技巧:Docker Desktop跑久了内存占用高,可以在设置里给它限制内存,比如限制到4GB,避免影响宿主机日常使用。方法是在%USERPROFILE%\.wslconfig文件里加:
ini复制[wsl2]
memory=4GB
swap=4GB
保存后执行wsl --shutdown重启WSL2,内存占用就有数了。这个细节我用下来非常实用,尤其是需要同时开IDEA、浏览器和Docker的开发场景,能明显减少电脑卡顿。
