Docker的安装与使用
本文最后更新于 2026年3月10日 晚上
本文主要介绍了Docker的安装与使用。
安装
Windows 11
系统要求
-
我应该使用 Hyper-V 还是 WSL?
Docker Desktop 的功能在 WSL 和 Hyper-V 上保持一致,没有对任何一种架构的偏好。 Hyper-V 和 WSL 各有优缺点,具体取决于您的具体设置和计划的用例。
-
要运行 Windows containers,您需要 Windows 10 或 Windows 11 专业版或企业版。 Windows 家庭版或教育版仅允许您运行 Linux containers。
安装步骤
-
安装WSL。
https://learn.microsoft.com/en-us/windows/wsl/install
-
以管理员模式打开 PowerShell 或 Windows 命令提示符:
1
wsl --install使用
wsl --install命令安装的新 Linux 安装将默认设置为 WSL 2。要查看您的 Linux 发行版是设置为 WSL 1 还是 WSL 2,请使用命令:wsl -l -v。 -
重启计算机。
-
计算机重启后会自动打开终端安装Ubuntu,提示创建用户名和密码后可正常使用。(第一次启动新安装的 Linux 发行版时,将打开一个控制台窗口,系统会要求您等待文件解压缩并存储在您的计算机上。未来所有的启动都将花费不到一秒的时间。)
-
(可选)遵循设置 WSL 开发环境的最佳实践指南,逐步了解如何为已安装的 Linux 发行版设置用户名和密码、使用基本 WSL 命令、安装和自定义 Windows 终端、设置 Git 版本控制、使用 VS Code 远程服务器进行代码编辑和调试、文件存储的良好实践、设置数据库、安装外部驱动器、设置 GPU 加速等。
-
(可选)运行
wsl --list --online以查看可用发行版的列表,并运行wsl --install -d <DistroName>以安装发行版。要更改版本,请使用以下命令:
wsl --set-version <distro name> 2将<distro name>替换为您要更新的 Linux 发行版的名称。例如,wsl --set-version Ubuntu-20.04 2将设置您的 Ubuntu 20.04 发行版以使用 WSL 2。 -
(可选)要卸载 WSL,请参阅卸载旧版本的 WSL或取消注册或卸载 Linux 发行版。
-
-
开始虚拟化。
-
启用 Hyper-V 虚拟化平台。
Windows 11 家庭版和专业版:启用 Hyper-V 虚拟化平台的步骤
Hyper-V 预安装在 Windows 11 专业版、企业版和教育版中,只需启用即可。但是,在其他版本(如 Windows 11 家庭版)中,缺少启用 Hyper-V 的选项。
并非所有计算机硬件都设计为运行虚拟机管理程序。因此,您必须首先确认您的硬件是否支持它。打开终端,输入:
1
systeminfo这将生成一个列表,您将在列表末尾找到“Hyper-V 要求”部分,如果满足这些要求,结果将显示为“是”。但是,如果您发现“在固件中启用虚拟化”状态为“否”,则需要使用下面的指南启用它。
-
在 Windows 11 电脑上安装/启用 Hyper-V 之前,请确保已从系统 BIOS 启用它。在上面的步骤中,如果您发现“在固件中启用虚拟化”状态为“否”,则需要启用它。操作方法如下:
- 重新启动计算机并使用热键进入 BIOS 设置。
- 在 Bios 中查找“虚拟化”选项卡并单击它以启用。不同主板 Bios 选项不同,您可以搜索不同品牌 Bios 中启用虚拟化教程。
- 保存新设置并退出 BIOS。系统现在将正常重新启动。
-
如果你有 Windows 11 家庭版,请按照以下步骤安装 Hyper-V。复制以下批处理代码,新建空白文本后保存,保存更改文本
.txt后缀为.bat格式,这样就能变为批处理脚本。右键以管理员身份运行即可。1
2
3
4
5
6
7
8pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause重新启动后,Hyper-V 将在您的 Windows 上安装并自动启用。
-
-
在电脑上打开“控制面板”->“程序”-> “启动或关闭Windows功能”。
-
勾选:
- Hyper-V
- Windows虚拟机监控程序平台
- 适用于Linux的Windows子系统
- 虚拟机平台
-
重启计算机。
-
-
安装Docker。
【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南
- 下载Docker Desktop for Windows-x86 64。
- 双击
Docker Desktop Installer.exe进行安装。- OK -> Close and log out
- 重新登录后自动打开了Docker界面 -> Accept -> Sign up or Sign in。
-
测试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16docker version # 查看版本
docker pull hello-world # 拉取
docker image ls # 列出本机的所有 image 文件。
docker ps # 列出 Docker 容器
# docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。
docker container run hello-world # 输出这段提示以后,hello world就会停止运行,容器自动终止。
# 有些容器不会自动终止,因为提供的是服务。比如,安装运行 Ubuntu 的 image,就可以在命令行体验 Ubuntu 系统。
docker container run -it ubuntu bash
exit # 退出容器且关闭
# 对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。
docker container kill [containID]
docker image rm [imageName] # 删除 image 文件 -
完成。
Ubuntu 18.04
TODO
报错
WSL integration with distro 'Ubuntu' unexpectedly stopped. Do you want to restart it?
解决:
下面是一套从低风险到“重置”的排查顺序。建议按顺序做;每一步做完都尝试重新启动 Docker Desktop。
-
先确认:你的发行版名是不是 Ubuntu 还是 ubuntu:
-
Docker 的日志里出现了
-d ubuntu,但你系统里发行版名称可能是Ubuntu(大写 U)。在 PowerShell(管理员或普通都行)执行:1
wsl -l -v看列表里 Ubuntu 的 NAME 是不是
Ubuntu、Ubuntu-22.04、Ubuntu-24.04等。 -
如果你根本没有名为
ubuntu的发行版,而是Ubuntu(或别的名字),那 Docker Desktop 可能绑定了错误的 distro 名称。 -
解决:Docker Desktop → Settings → Resources → WSL integration,把对应的 Ubuntu 勾选取消再勾上,必要时对正确的发行版启用集成。
-
-
完全关闭 WSL 和 Docker Desktop 后重启:
-
退出 Docker Desktop(托盘右键 Quit)。
-
PowerShell 执行:
1
wsl --shutdown -
再启动 Docker Desktop。
-
很多“WSL integration unexpectedly stopped”是 WSL 内部残留进程/挂载没清理干净,这一步就能恢复。
-
-
检查 Ubuntu 在 WSL 里是否能正常启动、root 是否可用:
-
Docker 用的是
-u root。如果你的 Ubuntu 被你改坏了(比如/etc/wsl.conf、root 被锁、文件系统错误等),就会导致它启动命令失败。 -
测试:
1
2
3wsl -d Ubuntu
# 以及 root:
wsl -d Ubuntu -u root -e sh -lc "id && uname -a && ls -la /"把上面命令里的
Ubuntu替换成你在wsl -l -v里看到的实际名字。 -
如果 Ubuntu 进不去 或 root 执行就失败:先把 Ubuntu 修好(例如文件系统、wsl.conf、发行版损坏)。
-
如果你看到输出正常,继续下一步。
-
-
检查并修复 WSL 组件:
-
Windows 11 上 Docker Desktop 对 WSL2 依赖很重。你可以直接更新/修复:
1
2wsl --update
wsl --status -
然后重启电脑,再试 Docker Desktop。
-
-
是否开启了 systemd / 自定义了 wsl.conf(会引发 Docker 集成异常):
-
如果你在 Ubuntu 里启用了 systemd 或做过特殊配置,有时会影响 Docker Desktop 的代理启动。
-
在 Ubuntu 里检查:
1
cat /etc/wsl.conf 2>/dev/null || true -
如果你看到类似:
1
2[boot]
systemd=true -
建议先临时关闭验证(把
systemd=true注释/改为 false),然后在 Windows 执行:1
wsl --shutdown -
再试 Docker Desktop。
-
-
重置 Docker Desktop 的 WSL 发行版(最有效,但会清掉镜像/容器数据):
-
如果上面都正常,最常见的最终修复是:docker-desktop 或 docker-desktop-data 这两个 WSL 发行版坏了。重置它们通常立刻解决,但代价是 Docker 数据会被清空(镜像、容器、volume 等会丢)。
-
先看看它们是否存在:
1
wsl -l -v -
如果看到:
docker-desktopdocker-desktop-data
-
执行(会清数据):
1
2
3wsl --shutdown
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data -
然后重新启动 Docker Desktop,它会自动重建这两个发行版。
-
-
如果你不想清数据:先导出再重置(保守方案):
-
如果你很在意
docker-desktop-data里的数据,可以先 export(需要磁盘空间):1
2wsl --shutdown
wsl --export docker-desktop-data "$env:USERPROFILE\Desktop\docker-desktop-data.tar" -
然后再执行上一步 unregister,之后理论上也可以
--import恢复,但恢复路径和 Docker Desktop 的期望布局可能不完全兼容;通常更推荐接受“重置数据”,或者改走 Docker Desktop 自带的备份/镜像仓库方案。
-
-
完成。
docker: Error response from daemon: ports are not available
核心原因:端口 3000 被占用了,或者更具体地说,Windows 系统保留了一段端口范围(Hyper-V / WSL2 动态端口),而 3000 恰好落在这个范围内,导致 Docker 无法绑定该端口。
解决:
-
方案一:重启 Windows NAT 服务(最快,临时有效):
-
以 管理员身份 打开 PowerShell 或 CMD。
-
依次执行以下两条命令:
1
2net stop winnat
net start winnat -
重新运行你的 Docker 启动命令。
如果重启后过一段时间又出现这个问题,说明系统再次将 3000 划入了保留范围,请尝试方案二。
-
-
方案二:修改 Docker 映射端口(最稳妥):
-
既然 3000 被系统占用了,最简单的办法是换一个宿主机端口。
-
如果你的命令是:
1
docker run -p 3000:3000 ... -
将其改为其他端口(例如 3001):
1
docker run -p 3001:3000 ... -
然后通过
http://localhost:3001访问即可。
-
-
方案三:排除保留端口范围(永久解决):
-
如果你必须使用 3000 端口,且方案一无效,你需要告诉 Windows 不要保留 3000 这个端口。
-
查看当前保留的端口范围:在管理员 PowerShell 中运行:
1
netsh interface ipv4 show excludedportrange protocol=tcp你会看到类似这样的输出:
1
2
3
4
5
6Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
3000 3099 <-- 如果 3000 在这里面,就是问题所在
... -
添加排除项(将 3000 从保留区移除):我们需要先保留一个临时的范围覆盖住 3000,然后重启 WinNAT 服务来重置随机分配,最后删除临时范围。
步骤 A:强制保留 3000(防止系统随机分配它)
1
netsh int ipv4 add excludedportrange protocol=tcp startport=3000 numberofports=1步骤 B:重启 WinNAT 服务(应用更改并清除之前的随机保留)
1
2net stop winnat
net start winnat步骤 C:现在 3000 应该可用了。你可以选择删除刚才添加的排除项(可选,通常不需要删,留着也没事)
1
netsh int ipv4 delete excludedportrange protocol=tcp startport=3000 numberofports=1有些情况下,只要执行完步骤 A 和 B,Docker 就能正常启动了,不需要执行步骤 C。
-
完成。
-
-
方案四:检查是否有其他程序占用
-
虽然概率较小(因为报错是 "forbidden by access permissions" 而不是 "address already in use"),但也可能是某个程序真的占用了 3000。
-
查找占用端口的进程:
1
netstat -ano | findstr :3000 -
如果有输出,记下最后的 PID(进程ID),然后在任务管理器中结束该进程,或者使用
taskkill /PID <进程ID> /F。
-
-
完成。
使用
概述
Docker 包括三个基本概念:
-
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 Ubuntu 16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。
-
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
常用命令
- docker run(需要完整的配置参数) = (docker pull) + docker create(需要完整的配置参数) + docker start(只需要容器名)
1 | |
推荐“删容器再新建”主要是因为 Docker 容器本质上更适合当作不可变运行实例(immutable runtime):你想变更的大多数东西(端口映射、挂载、
--add-host、很多环境变量)在容器创建后基本都改不了或改起来很别扭。重建反而最简单、最可控。
restart参数
1 | |
| 策略 | 容器崩溃 | Docker 重启 | 系统重启 | 手动 stop 后 Docker 重启后 | 推荐场景 |
|---|---|---|---|---|---|
no(默认) |
❌ | ❌ | ❌ | ❌ | 临时测试 |
on-failure |
✅ | ❌ | ❌ | ❌ | 开发环境 |
always |
✅ | ✅ | ✅ | ✅ 自动启动 | 生产服务器 |
unless-stopped |
✅ | ✅ | ✅ | ❌ 保持停止 | 个人使用⭐ |
容器的使用
只要你没有删除容器,关闭(停止)后再次启动同一个容器,你在容器内部所做的更改(包括文件的增删改、软件的安装等)都会被保留。如需持久化重要数据,建议用挂载卷(volume),这样即使容器被删数据也不会丢失。最佳实践建议:
- 开发/实验阶段:可以直接启动旧 container,方便调试和保留现场。
- 生产/团队协作/备份:建议将修改后的容器提交为新的 image,日后新建 container。这样环境可复现、易于管理。
- 长期维护:推荐用 Dockerfile 管理镜像,所有更改都写进 Dockerfile,这样环境最可控、最易于维护和升级。
重新挂载目录
在现有的 Docker 容器中无法直接重新挂载一个新的目录。Docker 的挂载点(即 -v 或 --mount 参数所指定的挂载)是在容器创建时确定的,并且一旦容器启动后,挂载配置就无法更改。
如果你需要修改挂载配置,有以下几种方法:
删除旧容器并重新创建
这是最常见的方法,删除旧容器并使用新的挂载配置重新创建一个容器。
1 | |
使用 docker cp 复制数据
如果你只需要将新的目录内容注入现有容器,而不需要重新挂载,可以使用 docker cp 命令来复制文件或目录。
1 | |
直接修改挂载的解决方法(不推荐)
通过底层工具(如 nsenter 和 mount),可以尝试在运行中的容器中手动挂载目录,但这非常复杂且容易出错,通常不推荐。
迁移 Docker 环境
-
迁移 Docker 镜像。
-
在源机器导出镜像:
1
2
3docker images # 查看所有镜像
docker save -o my_images.tar 镜像名1:tag 镜像名2:tag ...
# docker save -o all_images.tar $(docker images -q) -
拷贝到目标机器(比如用
scp或rsync):1
scp my_images.tar user@dest_ip:/path/to/1
rsync -av my_images.tar user@dest_ip:/path/to/-a:归档模式,保留文件属性。-v:显示详细过程。
-
在目标机器导入镜像:
1
docker load -i my_images.tar -
完成。
-
-
迁移数据卷(Volumes)。
-
找到你用的卷名或挂载目录:
1
2docker volume ls
docker inspect 卷名 -
导出卷内容(假设卷名为 mydata):
1
docker run --rm -v mydata:/volume -v $(pwd):/backup alpine tar czf /backup/mydata.tar.gz -C /volume . -
拷贝
mydata.tar.gz到目标机器并恢复:1
2
3
4
5# 在目标机器新建同名卷
docker volume create mydata
# 恢复数据
docker run --rm -v mydata:/volume -v $(pwd):/backup alpine sh -c "cd /volume && tar xzf /backup/mydata.tar.gz" -
完成。
-
-
迁移 Docker Compose 配置(如有)。
-
直接把
docker-compose.yml及相关.env配置文件复制到目标机器即可。 -
在目标机器上运行:
1
docker-compose up -d -
完成。
-
-
迁移容器(可选)。
一般只迁移镜像和数据卷即可,容器本身建议在新机器用相同参数重建。
1
2
3
4
5
6docker commit <container_name_or_id> my_temp_image:latest
docker save -o my_temp_image.tar my_temp_image:latest
# 拷贝到新机器
scp my_temp_image.tar user@new_host:/path/
# 新机器上导入
docker load -i my_temp_image.tar -
迁移网络(如有特殊网络配置)。
- 可用
docker network ls和docker network inspect查看配置,必要时在新机器用docker network create手动创建。
- 可用
-
完成。