Windows 10 WSL2 + Docker Desktop 入门:新手怎么跑第一个容器
前两篇我们讲了 Windows 10 安装 WSL2、以及 Ubuntu WSL2 装完后的基础配置。如果你已经照着做了,现在 Ubuntu 能打开,Python 和 Node.js 也装上了,VS Code 也能连进去。
接下来该学 Docker 了。
很多人对 Docker 的第一印象是:它是什么?我为什么要用它?跟虚拟机有什么区别?
这篇就从零讲起,不讲大概念,只回答几个实际问题:Docker Desktop 和 WSL2 是什么关系?怎么在 Ubuntu 里跑 docker 命令?怎么用 Docker 一键启动 MySQL、Redis、Nginx?容器里的数据放哪里才不会丢?新手最容易踩的端口和权限问题怎么解决?
如果你还没装好 WSL2 或 Ubuntu 基础环境,可以先看前两篇:
- Windows 10 安装 WSL2 教程:不是 WSL1,是真正能跑 Linux 的子系统
- Ubuntu WSL2 安装后完整配置:换国内源、Python、Node.js、Git、VS Code、Docker 和网络路径问题

一、Docker 是什么?用最简单的话讲
Docker 的作用可以这样理解:它把一个软件连同它需要的所有依赖、配置、环境,打包成一个"容器"。你拿到这个容器以后,不用再单独装依赖、改配置,直接跑就行。
举个例子:
你要在自己电脑上跑 MySQL。如果不用 Docker,你要去官网下载安装包、配置环境变量、设置 root 密码、调整字符集、处理端口冲突……折腾一圈可能还跑不起来。
用 Docker 的话,一条命令就行:
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:8
几分钟以后,MySQL 就跑起来了。
再举个例子:
你要跑一个 WordPress 网站。不用 Docker,要装 PHP、MySQL、Nginx、下载 WordPress、改配置文件。用 Docker,一个 docker-compose.yml 就能全搞定。
这就是 Docker 的核心价值:不用在本地环境里一个一个装软件,而是把软件装进容器里,随用随开,用完就关。
二、Docker Desktop 和 WSL2 是什么关系?
在 Windows 10 上跑 Docker,官方推荐用 Docker Desktop。
Docker Desktop 是一个 Windows 软件,它帮你管理 Docker 引擎、容器、镜像。你在 Windows 桌面上能看到它的界面,但它背后的 Docker 引擎跑在 WSL2 里。
简单说:
- Docker Desktop 是"管理界面",跑在 Windows 上。
- Docker 引擎是"真正干活的",跑在 WSL2 的轻量级虚拟环境里。
- 你在 Ubuntu WSL2 里敲
docker命令,实际是在调用这个引擎。
所以 Docker Desktop 和 WSL2 的关系是:Docker Desktop 依赖 WSL2 来运行 Docker 引擎,同时它可以把 Docker 命令暴露给 WSL2 里的 Ubuntu 使用。
这也是为什么前面一直强调要确认你用的是 WSL2 而不是 WSL1。Docker Desktop 的 WSL2 backend 不支持 WSL1。
三、安装 Docker Desktop 并启用 WSL2
安装步骤:
- 去 Docker 官网下载 Docker Desktop for Windows。
- 安装时确认勾选"Use WSL 2 instead of Hyper-V"。
- 安装完成后打开 Docker Desktop。
- 进入 Settings -> General,确认"Use the WSL 2 based engine"是勾选状态。
- 进入 Resources -> WSL Integration,确认你的 Ubuntu 是开启状态。
如果这里看不到 Ubuntu,先确认你已经安装了 WSL2 和 Ubuntu,并且执行过 wsl --set-default-version 2。
四、在 Ubuntu WSL2 里确认 docker 能用
回到 Ubuntu WSL2,执行:
docker version
正常应该看到 Client 和 Server 两部分输出。如果 Server 部分也能正常显示,说明 Docker 引擎已经在跑了。
再试:
docker ps
如果没有报错,只是输出一个空表头,说明一切正常。
跑一个测试容器:
docker run hello-world
如果你看到类似"Hello from Docker!"的输出,恭喜,Docker 已经可以在 WSL2 里正常使用了。
如果 docker 命令提示"command not found",或者报权限错误,可以试:
- 重启 Docker Desktop。
- 在 Docker Desktop 的 WSL Integration 里确认 Ubuntu 已开启。
- 关闭并重新打开 Ubuntu。
- 如果还不行,在 PowerShell 里执行
wsl --shutdown,然后重新打开 Ubuntu。
五、跑第一个实用容器:Nginx
Nginx 是一个 Web 服务器,非常适合用来验证 Docker 是否正常工作。
docker run -d --name my-nginx -p 8080:80 nginx:latest
这条命令的意思:
-d:后台运行。--name my-nginx:给容器起个名字叫 my-nginx。-p 8080:80:把容器里的 80 端口映射到 Windows 的 8080 端口。nginx:latest:使用最新版 Nginx 镜像。
第一次执行会自动下载 Nginx 镜像,可能要等一会儿。
下载完成后,打开 Windows 浏览器,访问:
http://localhost:8080
如果你看到 Nginx 的欢迎页面,说明容器跑起来了。
查看运行中的容器:
docker ps
停止容器:
docker stop my-nginx
再次启动:
docker start my-nginx
删除容器:
docker stop my-nginx
docker rm my-nginx
这就是 Docker 的基本操作流程:拉镜像、跑容器、停容器、删容器。
六、用 Docker 跑 MySQL
MySQL 是开发中最常用的数据库之一。用 Docker 跑 MySQL 非常方便:
docker run -d
--name mysql
-e MYSQL_ROOT_PASSWORD=123456
-p 3306:3306
mysql:8
这条命令:
- 设置 root 密码为 123456。
- 把容器 3306 端口映射到 Windows 3306 端口。
- 使用 MySQL 8 镜像。
第一次运行会下载镜像,需要等一下。
启动后,可以在 Ubuntu 里连接:
docker exec -it mysql mysql -uroot -p123456
如果能进入 MySQL 命令行,说明数据库跑起来了。
但是这里有个关键问题:如果你直接这样跑,容器删掉以后,数据库里的数据就没了。这个问题后面第七节专门讲。
七、用 Docker 跑 Redis
Redis 是一个内存数据库,常用作缓存和消息队列。
docker run -d --name redis -p 6379:6379 redis:7
测试连接:
docker exec -it redis redis-cli
进入 Redis 命令行后可以试:
set name docker
get name
如果返回 "docker",说明 Redis 正常工作。
退出 Redis 命令行:
exit
八、容器数据放哪里?最容易被忽略的问题
新手用 Docker 最容易踩的坑就是:容器删了,数据也跟着没了。
为什么?因为容器本身是无状态的。你创建一个 MySQL 容器,往里面写了一堆数据,然后执行 docker rm 把容器删了,数据就没了。
解决办法是用"数据卷"或"绑定挂载"。
方法一:绑定挂载
把容器里的数据目录映射到 WSL2 的一个本地目录:
mkdir -p ~/docker-data/mysql
docker run -d
--name mysql
-e MYSQL_ROOT_PASSWORD=123456
-p 3306:3306
-v ~/docker-data/mysql:/var/lib/mysql
mysql:8
-v ~/docker-data/mysql:/var/lib/mysql 的意思是:把容器里 MySQL 的数据目录 /var/lib/mysql 映射到 WSL2 里的 ~/docker-data/mysql。
这样即使容器被删了,数据文件还在 ~/docker-data/mysql 里。下次再跑一个新 MySQL 容器,指向同一个目录,数据就能恢复。
方法二:Docker Volume
docker volume create mysql-data
docker run -d
--name mysql
-e MYSQL_ROOT_PASSWORD=123456
-p 3306:3306
-v mysql-data:/var/lib/mysql
mysql:8
Docker Volume 是 Docker 自己管理的存储空间,不用你自己指定路径。查看所有 volume:
docker volume ls
新手建议用绑定挂载,因为你能在 ~/docker-data/ 目录下直接看到文件,心里更有底。等熟悉了再用 Docker Volume。
九、用 Docker Compose 一次跑多个容器
如果你要同时跑 MySQL、Redis 和一个 Web 服务,一个一个 docker run 会很麻烦。这时用 Docker Compose 更方便。
创建一个目录:
mkdir -p ~/projects/docker-demo
cd ~/projects/docker-demo
创建 compose.yaml:
services:
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: "123456"
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:7
ports:
- "6379:6379"
nginx:
image: nginx:latest
ports:
- "8080:80"
启动所有服务:
docker compose up -d
查看状态:
docker compose ps
停止所有服务:
docker compose down
这样三个服务就一起跑起来了。MySQL 在 3306,Redis 在 6379,Nginx 在 8080。
十、新手最常见的端口问题
用 Docker 跑服务时,端口问题是最容易卡人的。
问题一:端口被占用
如果你已经在本机装了 MySQL,3306 端口就被占了。再跑 Docker MySQL 映射 3306 就会报错。
解决办法:换一个端口映射:
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql:8
-p 3307:3306 意思是:容器里还是 3306,但 Windows 上通过 3307 访问。
问题二:localhost 访问不了
在 WSL2 里跑的 Docker 容器,Windows 浏览器一般可以通过 localhost 访问。
如果访问不了:
- 先在 Ubuntu 里确认容器在跑:
docker ps。 - 确认端口映射正确:看
PORTS列是否有0.0.0.0:8080->80/tcp。 - 重启 Docker Desktop。
- 在 PowerShell 里执行
wsl --shutdown,再重新打开 Ubuntu。
问题三:局域网其他设备访问不了
WSL2 有自己的虚拟网络。Windows 本机可以通过 localhost 访问容器,但局域网其他电脑或手机默认访问不到。
如果要让局域网设备访问,需要在 Windows 上做端口转发。这个对新手来说比较复杂,建议先把本机 localhost 跑通,以后有需要再研究。
十一、新手最常见的权限问题
在 Ubuntu WSL2 里执行 docker 命令,有时会报权限错误:
permission denied while trying to connect to the Docker daemon socket
解决办法是把当前用户加入 docker 组:
sudo usermod -aG docker $USER
然后关闭 Ubuntu,在 PowerShell 里执行:
wsl --shutdown
再重新打开 Ubuntu,执行:
docker ps
如果不再报权限错误,就说明修好了。
如果还是报错,可以临时用 sudo:
sudo docker ps
但不建议长期用 sudo 跑 docker,还是应该把用户加到 docker 组里。
十二、Docker 常用命令速查
查看运行中的容器:
docker ps
查看所有容器(包括已停止的):
docker ps -a
停止容器:
docker stop 容器名
启动已有容器:
docker start 容器名
删除容器:
docker rm 容器名
查看镜像列表:
docker images
删除镜像:
docker rmi 镜像名
查看容器日志:
docker logs 容器名
进入容器内部:
docker exec -it 容器名 bash
清理不再使用的容器、镜像、网络和缓存:
docker system prune -a
注意:docker system prune -a 会删除所有停止的容器和未使用的镜像。执行前想清楚。
十三、Docker 镜像源慢怎么办?
和 Ubuntu 软件源一样,Docker 默认从 Docker Hub 拉镜像,国内有时很慢。
你可以在 Docker Desktop 的 Settings -> Docker Engine 里编辑 JSON 配置,添加国内镜像源。常见格式类似:
{
"registry-mirrors": ["https://镜像地址"]
}
具体地址建议查当前可用的国内 Docker 镜像站,因为这个变化比较快,我不在这写死某个地址。
添加后点 Apply & Restart,再试 docker pull 看是否变快。
十四、学 Docker 的建议路线
如果你刚接触 Docker,不要一上来就学 Kubernetes、CI/CD、微服务编排。
建议按这个顺序来:
- 先学会
docker run、docker ps、docker stop、docker rm这几个基本命令。 - 再学会用
-p映射端口、用-v挂载数据。 - 然后学会
docker compose up和docker compose down。 - 等这些熟练以后,再去看 Dockerfile、镜像构建、多阶段构建。
- 最后再考虑编排、集群、CI/CD。
Docker 本身不难,难的是一开始就想学太多。先把基本操作跑顺,再按项目需要扩展。
总结
Docker 在 Windows 10 上配合 WSL2 使用,体验已经比以前好很多。
Docker Desktop 负责"管理界面",WSL2 负责"运行引擎",Ubuntu WSL2 负责输入命令。三者配合,你就可以在 Windows 上用 Linux 风格跑各种服务。
对新手来说,先把这三个事情搞清楚:
- Docker Desktop 怎么安装、怎么启用 WSL2 backend。
- 怎么用
docker run跑一个容器,怎么用-p映射端口。 - 怎么用
-v挂载数据目录,避免容器删了数据也丢。
这三个搞定了,后面跑 MySQL、Redis、Nginx、WordPress、Python 服务,都是同样的套路。
*本文由 数码罗记 · godsun.pro 整理。*