文章

wslc 完整教程 —— WSL 容器 CLI

wslc 完整教程 —— WSL 容器 CLI

依据 Microsoft Learn《在 WSL 上开始使用容器》(https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers)
并结合本机 wslc 3.0.3.0 的实际 --help 输出整理。
所有命令均可用 wslc <命令> --help 查看实时帮助。


目录

  1. 概述与先决条件
  2. 安装与验证
  3. 全局用法与帮助体系
  4. 快速上手:运行第一个容器
  5. run 命令完整选项
  6. 容器生命周期管理
  7. 容器内交互:exec / attach / cp / export / logs / stats / events
  8. 映像管理
  9. build 构建自定义映像
  10. 网络管理
  11. 卷管理
  12. 注册表登录(login / logout)
  13. 系统信息与容器会话
  14. 完整实战:构建并运行自己的应用
  15. 故障排除与磁盘回收
  16. 常用命令速查表

1. 概述与先决条件

wslc.exe 是 Windows 上 WSL 自带的容器 CLI 工具(无需 Docker Desktop、无需单独引擎),用于生成、传输和运行 Linux 容器。命令风格与 Docker CLI 高度相似,很多 Docker 用户可以直接迁移。

先决条件

项说明
WSL ≥ 2.9.3运行 wsl --update 更新;wsl --version 确认版本
已安装 WSL安装方式见 https://learn.microsoft.com/zh-cn/windows/wsl/install
VS Code + WSL 扩展(可选)编辑代码、调试 WSL 上的容器化项目
Windows Terminal(可选)多终端体验更好

wslc 命令总览

wslc [全局选项] [<命令>] [选项]

命令:
  container  管理容器(create/start/stop/run/exec/logs/... 的完整前缀形式)
  image      管理映像(build/pull/tag/save/load/import/...)
  network    管理网络
  registry   管理注册表凭据(login/logout)
  settings   在默认编辑器中打开 wslc 用户设置文件(.yaml)
  system     系统级命令(info/events/session)
  volume     管理卷
  attach     附加到容器
  build      从 Dockerfile 生成映像
  create     创建容器
  exec       在正在运行的容器中执行命令
  events     监视容器事件
  export     将容器的文件系统导出为 tar 存档
  images     列出映像
  import     从 tarball 导入映像
  info       显示系统信息
  inspect    检查对象
  kill       终止一个或多个正在运行的容器
  list       列出容器
  load       加载映像
  login      登录到注册表
  logout     从注册表注销
  logs       查看容器日志
  pull       拉取映像
  push       将映像上传到注册表
  remove     移除容器
  restart    重新启动容器
  rmi        移除映像
  run        运行容器
  save       保存映像
  start      启动容器
  stats      显示容器资源使用统计信息
  stop       停止容器
  tag        标记映像
  version    显示版本信息

全局选项:
  --session  指定要使用的会话
  -v  --version   显示版本信息
  -?  --help      显示帮助

注意:顶层短命令(run、list、pull…)与带前缀的完整形式(container run、container list、image pull…)等价,例如 wslc run = wslc container run。


2. 安装与验证

wslc.exe 随 WSL 发行,没有单独的引擎要安装。

# 1. 更新 WSL 到最新版本(需要 ≥ 2.9.3)
wsl --update

# 2. 确认 WSL 版本
wsl --version

# 3. 确认 wslc 可用并查看版本
wslc version

# 4. 查看系统信息(客户端/会话服务版本、活动会话列表)
wslc info

# 5. 用内置 hello-world 映像测试(本地没有会自动拉取)
wslc run --rm hello-world

看到 "Hello from the WSL container!" 之类的消息即说明工作正常。

实用帮助命令:

wslc --help                 # 列出所有可用命令
wslc <COMMAND> --help       # 查看某个命令的详细信息,如 wslc run --help
wslc container list         # 列出运行中的容器
wslc container list --all   # 列出所有容器(含已停止)
wslc image list             # 列出本机映像
wslc stats                  # 查看运行中容器资源占用

3. 全局用法与帮助体系

用法: wslc [全局选项] [<命令>] [选项]
  • --session <name>:指定要操作的容器会话(wslc 支持多会话,默认使用默认会话;会话管理见第 13 节)。
  • 任何命令后加 --help / -? 查看该命令的帮助。
  • 短名与长名:多数命令有别名,如 wslc container ls / wslc container ps / wslc list / wslc ps 都是列出容器;wslc images / wslc image ls 都是列出映像。

4. 快速上手:运行第一个容器

# 在一次性容器中运行命令(-it 交互终端,--rm 结束后自动删除容器)
wslc run --rm -it ubuntu:latest bash -c "echo Hello world from WSL container!"

# 后台启动一个 nginx 网页服务,把宿主机 8080 映射到容器 80 端口
wslc run -d --rm -p 8080:80 --name web nginx

# 请求正在运行的网页服务
curl localhost:8080

# 列出运行中的容器
wslc container list

# 在运行中的容器里再执行一条命令
wslc exec web cat /etc/os-release

# 停止容器(因用了 --rm,停止后容器自动删除)
wslc container stop web

要点:

  • -d / --detach:后台运行;不加则前台运行(Ctrl+C 退出)。
  • -p 主机端口:容器端口:发布端口,让 Windows 能通过 localhost 访问。
  • -it:-i 保持标准输入打开,-t 分配伪终端,交互式 shell 需要 -it。
  • --rm:容器停止后自动移除,不占磁盘。
  • --name:给容器起个可读名字,后续命令可直接用名字代替 ID。

5. run 命令完整选项

用法: wslc container run [选项] <image> [<command>] [<arguments>...]
别名: wslc run
选项说明
-d, --detach后台(分离)运行
-it交互 + 伪终端(-i --interactive + -t --tty)
--rm容器停止后自动移除
-p, --publish 主机:容器发布端口(可多次)
-P, --publish-all发布所有 EXPOSE 端口到随机主机端口
--name指定容器名
-e, --env KEY=VALUE设置环境变量(可多次)
--env-file从文件读取环境变量
-v, --volume绑定挂载卷(源:目标)
--mount以挂载规格挂载文件系统
--tmpfs在容器内某路径挂载 tmpfs
--entrypoint覆盖镜像 ENTRYPOINT
-w, --workdir容器内工作目录
-u, --user以指定用户运行(name|uid|uid:gid)
-h, --hostname容器主机名
--domainname容器域名
-m, --memory内存限制(如 512M、1G)
--cpusCPU 数(如 0.5、1、2.5)
--shm-size/dev/shm 大小(如 64M、1G)
--network指定要加入的网络
--network-alias网络范围内的别名
--ip在网络上分配固定 IPv4 地址
--dns / --dns-option / --dns-search自定义 DNS
--pull映像拉取策略:always | missing(默认)| never
--gpus透传 GPU 设备(all 表示全部)
--health-cmd / --health-interval / --health-retries / --health-start-period / --health-timeout健康检查配置
--no-healthcheck禁用镜像自带的健康检查
--stop-signal停止时发送的信号
--stop-timeout停止前等待秒数(-1 表示无超时)
-l, --label添加元数据标签
--cidfile将容器 ID 写入指定文件
--ulimitulimit(<name>=<soft>[:<hard>],-1 无限制)
--session(全局)指定会话

示例:

# 限制资源 + 环境变量 + 挂载
wslc run -d --name app -m 1G --cpus 2 -e MODE=prod `
  -v E:\data:/data `
  --network-alias app1 myimage

# 固定主机端口 + 健康检查
wslc run -d -p 8080:80 --health-cmd "curl -f http://localhost/ || exit 1" `
  --health-interval 30s --health-retries 3 nginx

6. 容器生命周期管理

wslc container [attach|cp|create|exec|export|inspect|kill|logs|list|prune|remove|restart|run|start|stats|stop]

6.1 创建(不启动)

用法: wslc container create [选项] <image> [<command>] [<arguments>...]
别名: wslc create

选项与 run 完全相同(见第 5 节),但没有 -d(创建本身不运行)。

wslc create --name mydb -e POSTGRES_PASSWORD=secret postgres:16
wslc start mydb            # 之后单独启动

6.2 启动 / 停止 / 重启 / 终止

wslc start <容器名或ID>...        # 启动已停止的容器
wslc stop  <容器名或ID>...        # 停止(优雅,等信号处理)
wslc restart <容器名或ID>...      # 重启
wslc kill  <容器名或ID>...        # 强制立即终止(SIGKILL)

stop 选项:

选项说明
-s, --signal要发送的信号(默认容器配置的 STOPSIGNAL,未配置则 SIGTERM)
-t, --time终止前等待的秒数(默认容器配置的停止超时)

6.3 删除

wslc remove <容器名或ID>...     # 删除容器(需先停止;运行中的需先 stop/kill 或加 -f,视版本支持)
wslc container prune            # 移除所有已停止的容器(清盘利器)

6.4 列出

用法: wslc container list [选项]
别名: wslc container ls, wslc container ps, wslc list, wslc ls, wslc ps
选项说明
-a, --all显示所有状态(默认只显示运行中)
-n, --last N显示最近创建的 N 个容器(含所有状态)
-l, --latest显示最新创建的容器(含所有状态)
-f, --filter按条件过滤输出
--format输出格式 json 或 table(默认 table)
-s, --size显示总文件大小
-q, --quiet仅输出容器 ID
--no-trunc不截断输出
wslc ps                       # 运行中的容器
wslc ps -a                    # 全部容器
wslc list --format json       # JSON 输出,便于脚本处理
wslc list -q                  # 只要 ID 列表
wslc list -f "name=web"       # 过滤

6.5 检查详情

wslc container inspect <容器ID或名>...
选项说明
-s, --size显示总文件大小
-f, --format输出格式(单行输出为 JSON,默认缩进 JSON)
wslc inspect <容器ID>         # 顶层短名同样可用
wslc container inspect -f "{{.State.Status}}" web

7. 容器内交互

7.1 exec —— 在运行中的容器里执行命令

用法: wslc container exec [选项] <container-id> <command> [<arguments>...]
别名: wslc exec
选项说明
-d, --detach分离模式运行
-i, --interactive保持标准输入打开
-t, --tty分配伪终端
-u, --user以指定用户执行(name|uid|uid:gid)
-w, --workdir指定工作目录
-e, --env / --env-file注入环境变量
wslc exec web cat /etc/os-release
wslc exec -it web bash                 # 进入容器 shell
wslc exec -u root -w /app web ls -la   # 以 root、指定目录

7.2 attach —— 附加到容器主进程

wslc attach <容器ID或名>

把当前终端接到容器的主进程(PID 1)的输入/输出上(wslc container attach 同义)。

7.3 cp —— 容器与本地之间拷文件

用法: wslc container cp [选项] <source> <target>

本地→容器:   wslc container cp LOCAL_PATH CONTAINER:PATH
容器→本地:   wslc container cp CONTAINER:PATH LOCAL_PATH
stdin→容器:  wslc container cp - CONTAINER:PATH
选项说明
-q, --quiet静默
-L, --follow-link跟随源中的符号链接
-a, --archive归档模式(为兼容 Docker CLI 而保留)
wslc cp .\app.conf web:/etc/app/conf.conf     # Windows 文件进容器
wslc cp web:/var/log/app.log .\app.log        # 容器日志拷出来

7.4 export —— 导出容器文件系统

wslc export <容器ID> -o .\container-rootfs.tar

7.5 logs —— 查看日志

用法: wslc container logs [选项] <container-id>
别名: wslc logs
选项说明
-f, --follow持续跟踪输出(类似 tail -f)
-n, --tail只显示末尾 N 行
-t, --timestamps显示时间戳
--since / --until时间范围(Unix 秒或 RFC3339,如 2024-01-15T10:30:00Z)
--details显示日志附加详情
wslc logs web
wslc logs -f --tail 50 -t django             # 实时跟踪最后 50 行,带时间戳
wslc logs --since 2h web                     # 最近 2 小时

7.6 stats —— 资源使用统计

用法: wslc stats [选项] [<container-id>...]
别名: wslc container stats

显示运行中容器的 CPU、内存、网络 I/O、块 I/O、PID 快照。

选项说明
-a, --all显示所有状态
--formatjson 或 table(默认 table)
--no-trunc不截断
wslc stats                  # 所有运行中容器
wslc stats web django       # 指定容器

7.7 events —— 监视容器事件

用法: wslc events [选项]
别名: wslc system events
选项说明
-f, --filter按条件过滤
--since / --until时间范围
--formatjson 或 table
wslc events
wslc events -f "name=web" --since 1h

8. 映像管理

wslc image [build|remove|inspect|list|load|import|prune|pull|push|save|tag]

8.1 pull 拉取

用法: wslc image pull [选项] <image>
别名: wslc pull
选项说明
-a, --all-tags拉取仓库中所有 tag
-q, --quiet抑制详细输出
wslc pull ubuntu:latest
wslc pull --all-tags nginx
wslc pull myregistry.io/myteam/app:1.2.3

8.2 list 列出

用法: wslc image list [选项]
别名: wslc image ls, wslc images
选项说明
-a, --all显示所有(默认隐藏中间层映像)
--digests显示摘要
-f, --filter过滤
--formatjson 或 table
-q, --quiet仅输出 ID
--no-trunc不截断
--verbose详细信息
wslc images
wslc image list -f "reference=*nginx*"

8.3 tag 打标签

用法: wslc image tag [选项] <source> <target>
别名: wslc tag
wslc tag helloworld-django myregistry.io/myteam/helloworld-django:1.0

8.4 inspect / remove / prune

wslc image inspect <image>...        # 查看映像元数据(-f 指定格式)
wslc image remove <image>...         # 别名: wslc rmi, wslc image rm, wslc image delete
wslc rmi -f <image>                  # -f 强制删除(即使被使用); --no-prune 不连带删除父层

image remove 选项:

选项说明
-f, --force强制删除
--no-prune不删除未标记的父级
wslc image prune                     # 删除所有悬空(dangling)映像
wslc image prune -a -f               # 删除所有未被任何容器使用的映像,不确认
wslc image prune --filter "until=24h" # 只删 24 小时未使用的

8.5 save / load —— 导出导入完整映像(tar)

用法: wslc image save [选项] <image>...     # 别名: wslc save
用法: wslc image load [选项]                # 别名: wslc load
选项说明
save -o, --output输出 tar 路径
load -i, --input输入 tar 路径
load -q, --quiet抑制进度
# 导出(可一次多个)
wslc save -o .\nginx.tar nginx:latest
# 在另一台机器上导入
wslc load -i .\nginx.tar

8.6 import —— 从文件系统 tarball 造映像

用法: wslc image import [选项] <file> [<image>]
别名: wslc import
选项说明
--no-trunc不截断输出
wslc import .\rootfs.tar myimage:1.0   # 用已有文件系统 tar 直接建映像

8.7 push 推送

用法: wslc image push [选项] <image>
别名: wslc push
选项说明
-a, --all-tags推送所有 tag
-q, --quiet抑制详细输出
wslc login myregistry.io          # 先登录(见第 12 节)
wslc push myregistry.io/myteam/app:1.0

9. build 构建自定义映像

用法: wslc image build [选项] <path>
别名: wslc build

<path> 为构建上下文目录;用 - 表示从 stdin 读取 tar 存档或 Dockerfile。

选项说明
-t, --tag给生成的映像打标签
-f, --fileDockerfile 路径(- 从 stdin 读)
--build-arg KEY=VALUE构建时变量
--target只构建到多阶段中的某个目标阶段
--no-cache不使用缓存
--pull始终尝试拉取更新的基础映像
--secret id=NAME[,type=env|file][,env=VAR|src=PATH]向构建公开机密(默认取环境变量 NAME)
-o, --output构建输出目标(type=local,dest=path 或 type=tar,dest=out.tar)
--progress进度输出类型:auto(默认) / tty / plain / quiet
--iidfile将映像 ID 写入指定文件
-l, --label设置元数据
--verbose详细输出

示例:

# Containerfile(Dockerfile 同名文件)
FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
wslc build -t helloworld-django .                       # 基本构建
wslc build -t app:1.0 -f Containerfile.dev .            # 指定 Dockerfile
wslc build -t app:1.0 --build-arg VERSION=1.0 --no-cache .
wslc build -t app:1.0 --target builder .                # 多阶段只构建某阶段
wslc build -t app --secret id=api_key,type=file,src=.env.apikey .
wslc build -t app -o type=tar,dest=app.tar .            # 构建完直接输出 tar

构建上下文建议放在 WSL 文件系统(\\wsl$)内,跨文件系统访问会显著变慢。


10. 网络管理

wslc network [create|remove|inspect|list|prune|connect|disconnect]
# 创建网络(默认 bridge 驱动)
wslc network create mynet
wslc network create -d bridge --subnet 172.28.0.0/16 --gateway 172.28.0.1 mynet
wslc network create -l env=prod --internal internal-net     # 限制外部访问的内部网络

# 查看 / 检查 / 删除 / 清理
wslc network list
wslc network inspect mynet
wslc network remove mynet
wslc network prune                # 删除所有未使用的网络

# 动态连接 / 断开容器
wslc network connect mynet web
wslc network disconnect mynet web

network create 选项:

选项说明
-d, --driver驱动(默认 bridge)
-o, --opt驱动特定选项
-l, --label元数据
--gateway子网 IPv4/IPv6 网关
--internal限制对外部访问
--ip-range从 CIDR 子范围分配容器 IP
--subnetCIDR 子网

11. 卷管理

wslc volume [create|remove|inspect|list|prune]
# 创建命名卷(驱动: guest 或 vhd,默认 guest)
wslc volume create mydata
wslc volume create -d vhd -o size=10G myvhd
wslc volume create -l tier=hot mydata

# 查看 / 检查 / 删除 / 清理
wslc volume list
wslc volume inspect mydata
wslc volume remove mydata
wslc volume prune                 # 删除未使用的本地卷

容器使用卷的三种方式:

# 1) 命名卷
wslc run -d -v mydata:/var/lib/postgresql/data postgres:16

# 2) 绑定挂载(宿主路径进容器)—— Windows 盘符路径可直接写
wslc run -d -v E:\data:/data myimage
wslc run -d -v E:\data:/data:ro myimage        # 只读

# 3) tmpfs / 挂载规格
wslc run -d --tmpfs /tmp:size=256m myimage
wslc run -d --mount type=bind,source=E:\data,destination=/data myimage

✅ 实测(wslc 3.0.3.0):-v E:\data:/data 这样直接写 Windows 盘符路径即可挂载,读写双向同步正常(容器内写入的文件在 Windows 侧立即可见,:ro 只读生效)。

⚠️ 不要照抄 Docker/WSL 的 /mnt/e/... 写法:wslc 会话里不存在 /mnt/e(不是完整发行版,未自动挂载 Windows 盘)。若写 -v /mnt/e/data:/data,守护进程会在 VM 内自动创建同名空目录挂进去——命令不报错,但挂的是空目录,并不是 E 盘!


12. 注册表登录

wslc registry [login|logout]
用法: wslc login [选项] [<server>]
别名: wslc registry login
选项说明
-u, --username用户名
-p, --password密码或个人访问令牌(PAT)
--password-stdin从 stdin 读取密码/PAT
# 不指定 server 时使用会话默认注册表
wslc login
# 指定注册表
wslc login -u myuser -p mytoken myregistry.io
echo $token | wslc login -u myuser --password-stdin myregistry.io

# 推送前确保已登录
wslc push myregistry.io/myteam/app:1.0

# 注销
wslc logout myregistry.io

13. 系统信息与容器会话

13.1 系统信息

用法: wslc system info [选项]
别名: wslc info

显示 wslc 客户端与会话管理服务的版本,以及活动会话列表。

选项说明
--formatjson 或 table(默认 table)
wslc info
wslc info --format json

13.2 会话(session)

wslc 通过后台"会话"服务管理容器;可以创建多个隔离会话,并用全局选项 --session 指定目标。

wslc system session [enter|list|run|shell|terminate]
wslc system session list              # 列出活动会话
wslc system session list --verbose    # 带详细信息
wslc system session shell             # 附加到(默认)会话
wslc system session run <cmd> [args]  # 在无 TTY 的会话中直接运行命令
wslc system session enter             # 进入临时会话
wslc system session terminate         # 终止(默认)会话

# 配合全局 --session 操作特定会话
wslc --session work1 container list
wslc --session work2 run -d --name nginx2 nginx

13.3 设置

wslc settings            # 在系统默认编辑器中打开 wslc 用户设置文件(.yaml);
                         # 首次运行会创建文件,所有设置以默认值注释形式列出
wslc settings reset      # 将设置重置为内置默认值

14. 完整实战:构建并运行自己的应用

以 Django Hello World 为例(也可换成任意自己的项目)。

# 1. 在 WSL 终端(如 Ubuntu)克隆项目 —— 代码放在 WSL 文件系统里性能更好
git clone https://github.com/<username>/helloworld-django.git
cd helloworld-django

# 2.(可选)用 VS Code + WSL 扩展打开项目
code .
  1. 在项目根目录添加 Containerfile:
FROM python:3
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
# 4. 构建映像(在包含 Containerfile 的目录执行)
wslc build -t helloworld-django .

# 5. 确认映像已创建
wslc image list

# 6. 运行容器并发布端口
wslc run -d --rm -p 8000:8000 --name django helloworld-django

# 7. 确认运行状态与日志
wslc container list
wslc container logs django        # 或 wslc logs -f django 实时跟踪

# 8. 浏览器打开 http://localhost:8000/ 查看应用
#    并确认它跑在 Linux 上:
wslc exec django uname            # 输出 Linux → 跑在 WSL 2 内核上

# 9. 停止
wslc container stop django

至此已用 wslc.exe 在 Windows 上完成了 WSL 2 支持的 Linux 容器的构建与运行,配合 VS Code 可继续开发、调试。


15. 故障排除与磁盘回收

15.1 诊断容器/映像问题

wslc container inspect <container-id>   # 状态、配置、网络、挂载等全量信息
wslc container logs <container-id>      # 退出原因、报错栈
wslc image inspect <image>              # 映像配置、层信息
wslc events                             # 实时事件流(start/stop/die 等)

排障常用组合:

wslc container list --all               # 看状态是 Exited 还是死循环 Restarting
wslc logs -n 100 -t <容器>              # 最近 100 行带时间戳
wslc inspect -f "{{.State.ExitCode}}" <容器>   # 取退出码

15.2 回收磁盘空间

wslc container prune        # 删除所有已停止容器
wslc image prune            # 删除悬空映像
wslc image prune -a -f      # 删除所有未使用映像
wslc network prune          # 删除未使用网络
wslc volume prune           # 删除未使用卷

映像和停止的容器都会占用磁盘(最终落在 WSL VHDX 里)。配合 wsl --manage <发行版> --set-sparse 或压缩 VHDX 可进一步缩小磁盘占用。

15.3 其他参考


16. 常用命令速查表

日常高频

场景命令
跑一次即毁的命令wslc run --rm -it <image> <cmd>
后台起服务wslc run -d --name X -p 8080:80 <image>
进容器 shellwslc exec -it X bash
看日志(实时)wslc logs -f X
看资源占用wslc stats
停止 / 删除wslc stop X → wslc remove X
列出容器/映像wslc ps -a / wslc images

全部命令别名对照

完整形式顶层短名其他别名
container runrun—
container createcreate—
container execexec—
container listlistcontainer ls / container ps / ls / ps
container startstart—
container stopstop—
container killkill—
container restartrestart—
container removeremove—
container logslogs—
container statsstats—
container attachattach—
container exportexport—
container inspectinspect—
container cpcp—
image listimagesimage ls
image pullpull—
image pushpush—
image buildbuild—
image tagtag—
image savesave—
image loadload—
image importimport—
image removermiimage rm / image delete
system infoinfo—
system eventsevents—
registry loginlogin—
registry logoutlogout—

与 Docker 的主要差异

  • 无需 Docker Desktop / docker daemon:引擎即 WSL 本身。
  • 顶层直接给了短命令(wslc run),不必写 docker container run。
  • 有 session(会话) 概念,可用 --session 在不同隔离环境间切换。
  • 文件拷贝用 wslc cp(与 docker cp 相同语义)。
  • 卷驱动支持 guest / vhd(volume create -d vhd)。
  • 设置文件为 .yaml(wslc settings 直接打开编辑)。
License: