Windows 10 WSL2 + Docker Desktop 入门:新手怎么跑第一个容器

Windows 10 WSL2 + Docker Desktop 入门:新手怎么跑第一个容器

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 基础环境,可以先看前两篇:

WSL2 + Docker Desktop 入门路线图
WSL2 + Docker Desktop 入门路线图

一、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

安装步骤:

  1. 去 Docker 官网下载 Docker Desktop for Windows。
  2. 安装时确认勾选"Use WSL 2 instead of Hyper-V"。
  3. 安装完成后打开 Docker Desktop。
  4. 进入 Settings -> General,确认"Use the WSL 2 based engine"是勾选状态。
  5. 进入 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",或者报权限错误,可以试:

  1. 重启 Docker Desktop。
  2. 在 Docker Desktop 的 WSL Integration 里确认 Ubuntu 已开启。
  3. 关闭并重新打开 Ubuntu。
  4. 如果还不行,在 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 访问。

如果访问不了:

  1. 先在 Ubuntu 里确认容器在跑:docker ps。
  2. 确认端口映射正确:看 PORTS 列是否有 0.0.0.0:8080->80/tcp。
  3. 重启 Docker Desktop。
  4. 在 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、微服务编排。

建议按这个顺序来:

  1. 先学会 docker run、docker ps、docker stop、docker rm 这几个基本命令。
  2. 再学会用 -p 映射端口、用 -v 挂载数据。
  3. 然后学会 docker compose up 和 docker compose down。
  4. 等这些熟练以后,再去看 Dockerfile、镜像构建、多阶段构建。
  5. 最后再考虑编排、集群、CI/CD。

Docker 本身不难,难的是一开始就想学太多。先把基本操作跑顺,再按项目需要扩展。

总结

Docker 在 Windows 10 上配合 WSL2 使用,体验已经比以前好很多。

Docker Desktop 负责"管理界面",WSL2 负责"运行引擎",Ubuntu WSL2 负责输入命令。三者配合,你就可以在 Windows 上用 Linux 风格跑各种服务。

对新手来说,先把这三个事情搞清楚:

  1. Docker Desktop 怎么安装、怎么启用 WSL2 backend。
  2. 怎么用 docker run 跑一个容器,怎么用 -p 映射端口。
  3. 怎么用 -v 挂载数据目录,避免容器删了数据也丢。

这三个搞定了,后面跑 MySQL、Redis、Nginx、WordPress、Python 服务,都是同样的套路。


*本文由 数码罗记 · godsun.pro 整理。*

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注