Docker 从零入门:Windows 下 WSL 2 + Docker Desktop 安装与基本使用
前言
最近想学 Docker,主要是被“换台电脑就要重配一遍环境”这件事搞烦了。前后端加数据库,每次都要开三个终端,装依赖、配端口,一个版本对不上就报错。听说 Docker 能把环境和应用一起打包,一条命令全启动,就动手试了试。
这篇文章记录我从零开始,在 Windows 上装好 Docker、跑通第一个容器、再到用 Docker Compose 一键启动多个服务的完整过程,包括中间踩的坑。适合 Docker 零基础、用 Windows 想入门的朋友。
读完你能得到:
- 理解 Docker 是什么、解决什么问题
- 在 Windows 上正确安装 WSL 2 + Docker Desktop
- 掌握 Docker 基本命令
- 会用 Docker Compose 一键启动前后端和数据库
环境说明:Windows 11,Docker Desktop 最新版,WSL 2 + Ubuntu。
一、Docker 是什么,解决什么问题
一句话定义
Docker 是一个容器化平台,把应用和它需要的运行环境(代码、依赖、配置)打包成一个标准化的“容器”,让它在任何装了 Docker 的机器上都能以相同方式运行。
传统方式的痛点
假设你要跑一个前后端分离的项目:
- 开一个终端,进后端目录,装依赖,启动后端
- 再开一个终端,进前端目录,装依赖,启动前端
- 再开一个终端,装 MySQL,配用户名密码,启动数据库
- 三个终端都得开着,关一个服务就挂
- 换台电脑,所有环境重新配一遍,还可能版本对不上
Docker 的三个核心概念
- 镜像(Image):只读模板,包含应用运行所需的一切。类似“安装包”。
- 容器(Container):镜像跑起来的实例,独立、隔离。类似“正在运行的程序”。
- 仓库(Registry):存放镜像的地方,默认是 Docker Hub。
你从仓库拉镜像,用镜像启动容器,容器里跑你的应用。
二、Windows 上安装 Docker
2.1 为什么 Windows 需要 WSL 2
Docker 容器不是虚拟机,它直接共用宿主机的 Linux 内核,靠的是 Linux 内核的几个特性:
- Namespace:让每个容器“以为”自己独占一台机器
- Cgroups:限制容器能用多少 CPU、内存
- UnionFS:实现镜像分层
这些都是 Linux 内核才有的,Windows 内核没有。所以 Docker 在 Windows 上没法直接跑 Linux 容器。
微软的解决方案是WSL 2(Windows Subsystem for Linux 2):用一个轻量级虚拟机跑真正的 Linux 内核,然后和 Windows 深度打通。Docker Desktop 在 Windows 上就是靠它来运行容器的。
WSL 2 架构大致是:Windows 用户态 ↔ 轻量虚拟机(Linux 内核 + Ubuntu + Docker 引擎 + 容器)。它和 Windows 文件、端口、进程都是打通的。
2.2 开启 WSL 2
用管理员身份打开 PowerShell,输入:
wsl--install这条命令会自动开启所需功能、下载 Linux 内核、安装 Ubuntu 发行版,并设为默认 WSL 2。装完重启电脑。
重启后检查版本:
wsl--list--verbose如果显示VERSION是2,就对了。
2.3 我遇到的坑:没有已安装的分发
第一次跑wsl --list --verbose,输出是这样的:
适用于 Linux 的 Windows 子系统没有已安装的分发。 可通过安装包含以下说明的分发来解决此问题: 使用“wsl.exe --list --online' ”列出可用的分发 和 “wsl.exe --install <Distro>” 进行安装。原因:WSL 平台装好了,但还没有安装任何 Linux 发行版。就像买了台电脑装好 BIOS,但硬盘是空的。
解决:先看有哪些可选:
wsl--list--online然后安装 Ubuntu:
wsl--install-d Ubuntu安装过程会提示创建 Linux 用户名和密码。注意:这个密码输入时不显示,是正常现象。这个账号和 Windows 账号没关系。
装完再验证:
wsl--list--verbose应该能看到:
NAME STATE VERSION * Ubuntu Running 2如果
wsl --install -d Ubuntu报错,先跑wsl --update更新内核,再重试。
2.4 安装 Docker Desktop
去 Docker 官网下载Docker Desktop Installer.exe,运行。
安装时会让你选配置:
- Per-user installation (Recommended):只给当前用户安装,不需要管理员权限,用 WSL 2 后端。推荐选这个。
- All-users installation:给所有用户安装,需要管理员密码,能用 Windows Containers 和 Hyper-V 后端。
个人开发选默认的 Per-user 就行。下面的“Add shortcut to desktop”勾上。
装完后启动 Docker Desktop,它应该能自动对接 WSL 2 里的 Ubuntu。
2.5 验证安装
在 PowerShell 里跑:
docker run hello-world看到Hello from Docker!就说明全部搞定。
三、Docker 基本使用
3.1 拉取镜像
dockerpull nginx从 Docker Hub 下载最新的 nginx 镜像。下载完用docker images查看本地镜像。
3.2 启动容器
dockerrun-d-p8080:80--namemy-nginx nginx参数解释:
docker run:创建并启动容器-d:后台运行-p 8080:80:把本机 8080 端口映射到容器内 80 端口--name my-nginx:给容器起名nginx:使用的镜像名
跑完后浏览器访问http://localhost:8080,能看到 nginx 欢迎页。
3.3 查看和管理容器
dockerps# 看正在运行的容器dockerps-a# 看所有容器,包括已停止的dockerstop my-nginx# 停止容器dockerstart my-nginx# 启动已停止的容器dockerrestart my-nginx# 重启dockerrmmy-nginx# 删除容器(需先停止)dockerrm-fmy-nginx# 强制删除运行中的容器3.4 进入容器内部
dockerexec-itmy-nginx /bin/bashexec:在运行中的容器里执行命令-it:交互式终端/bin/bash:打开 bash,有些镜像没有 bash 可换成/bin/sh
进去后就像在一台 Linux 里,exit退出。退出不会停止容器。
3.5 看日志
dockerlogs my-nginx# 看全部日志dockerlogs-fmy-nginx# 实时跟踪dockerlogs--tail100my-nginx# 只看最后 100 行调试程序报错时最常用。
3.6 删除镜像
dockerrmi nginx# 删除镜像dockerrmi-fnginx# 强制删除删除前要确保没有容器在用这个镜像。
四、多服务一键启动:Docker Compose
4.1 传统方式 vs Compose
实际项目往往要同时跑好几个容器(Web + 数据库 + Redis)。手动一个个docker run很麻烦,docker compose就是解决这个问题的。
4.2 写 docker-compose.yml
在项目根目录创建docker-compose.yml:
services:frontend:build:./frontendports:-"3000:3000"backend:build:./backendports:-"8000:8000"depends_on:-dbdb:image:mysql:8environment:MYSQL_ROOT_PASSWORD:123456volumes:-db-data:/var/lib/mysqlvolumes:db-data:frontend/backend:用各自目录下的 Dockerfile 构建depends_on:控制启动顺序,让后端等数据库先起来db:直接用 mysql 官方镜像volumes:数据持久化,容器删了数据还在
4.3 一键启动和停止
dockercompose up-d# 启动全部服务dockercompose down# 停止并删除dockercompose logs-f# 看日志三个服务全部启动,各自在独立容器里跑。停止也是一条命令。
4.4 数据持久化:Volume
容器删了,里面的数据也没了。数据库这类需要保留数据的,要用卷:
dockerrun-d-p3306:3306\-vmysql-data:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD=123456\--namemy-mysql mysql-v mysql-data:/var/lib/mysql:把卷挂载到容器数据目录-e MYSQL_ROOT_PASSWORD=123456:设置环境变量
查看卷:docker volume ls,删除卷:docker volume rm mysql-data。
五、Dockerfile:把自己的应用打包成镜像
写一个Dockerfile:
FROM python:3.11 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]构建:
dockerbuild-tmy-app.-t my-app:给镜像起名.:构建上下文是当前目录
构建完就能docker run my-app跑起来。
说明:依赖会被打包进镜像,之后启动不用重新下载。但镜像体积不会变小,甚至更大,因为它还包含基础操作系统。Docker 省空间靠的是多个镜像共享基础层。
六、常见问题与踩坑
6.1 WSL 没有已安装的分发
现象:wsl --list --verbose提示没有已安装的分发。
原因:WSL 平台装好了,但没装 Linux 发行版。
解决:wsl --install -d Ubuntu。
6.2 镜像拉取慢
现象:docker pull卡住或超时。
解决:配置国内镜像加速器。在 Docker Desktop 设置里添加registry-mirrors,或用阿里云、中科大的地址。
6.3 端口映射失败
现象:docker run -p 8080:80报端口被占用。
原因:本机 8080 已经被别的程序用了。
解决:换一个本机端口,比如-p 8081:80。
6.4 进容器报错没有 bash
现象:docker exec -it 容器名 /bin/bash报executable file not found。
原因:有些精简镜像没有 bash。
解决:换成/bin/sh。
七、常用命令速查
| 目的 | 命令 |
|---|---|
| 看本地镜像 | docker images |
| 拉镜像 | docker pull 镜像名 |
| 跑容器 | docker run ... |
| 看运行中容器 | docker ps |
| 看所有容器 | docker ps -a |
| 停止/启动/删除容器 | docker stop/start/rm 名字 |
| 进容器 | docker exec -it 名字 bash |
| 看日志 | docker logs -f 名字 |
| 看卷 | docker volume ls |
| 清理无用资源 | docker system prune |
八、总结
学完这一套,我最大的收获是三点:
- 环境一致性:镜像把应用和依赖打包在一起,换台电脑不用重配。
- 一键启动:Docker Compose 把前后端和数据库一次拉起,告别开三个终端。
- 隔离性:每个容器环境独立,版本冲突问题基本消失。
参考
- Docker 官方文档:https://docs.docker.com/
- WSL 官方文档:https://learn.microsoft.com/zh-cn/windows/wsl/
- Docker Hub:https://hub.docker.com/
本文为个人学习记录,环境为 Windows 11 + WSL 2 + Docker Desktop。如有错误欢迎指正。