使用VSCode在WSL和Docker中开发
通过WSL,开发人员可以安装 Linux 发行版(例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等),并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,不用进行任何修改,也无需使用传统虚拟机或设置成双启动系统。借助 Docker Desktop for Windows 中支持的 WSL 2 后端,可以在基于 Linux 的开发环境中工作并生成基于 Linux 的容器,同时使用 Visual Studio Code 进行代码编辑和调试。
安装WSL
通过WSL,开发人员可以安装 Linux 发行版(例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等),并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,不用进行任何修改,也无需使用传统虚拟机或设置成双启动系统。
安装WSL2
在Windows11或Windows10(更新至新版)中,可以使用单个命令安装运行 WSL 所需的一切内容。 在管理员模式下打开 PowerShell 或 Windows 命令提示符,方法是右键单击并选择“以管理员身份运行”,输入 wsl --install 命令,此命令将启用运行 WSL2 并安装 Linux 的 Ubuntu 发行版所需的功能。。
如果不使用默认的Ubuntu发行版,也可以进行更改。
- 若要更改安装的发行版,请输入:
wsl --install -d <Distribution Name>
。 将<Distribution Name>
替换为要安装的发行版的名称。
设置 Linux 用户信息
安装 WSL 后,需要为新安装的 Linux 发行版创建用户帐户和密码。
检查正在运行的 WSL 版本
可列出已安装的 Linux 发行版,并通过在 PowerShell 或 Windows 命令提示符中输入以下命令来检查每个发行版的 WSL 版本:wsl -l -v
。
D:\>wsl -l -vNAME STATE VERSION
* Ubuntu Running 2docker-desktop Running 2
应确保使用WSL2,以便利的使用Docker、VScode等软件进行开发。
使用 WSL 运行多个 Linux 发行版的方法
WSL 支持运行想要安装的任意数量的不同 Linux 发行版。 这可能包括从 Microsoft Store 选择发行版、导入自定义发行版或生成自己的自定义发行版。
可以使用命令wsl -l -o查看可安装的Linux发行版。
D:\>wsl -l -o
以下是可安装的有效分发的列表。
使用“wsl.exe --install <Distro>”安装。NAME FRIENDLY NAME
AlmaLinux-8 AlmaLinux OS 8
AlmaLinux-9 AlmaLinux OS 9
AlmaLinux-Kitten-10 AlmaLinux OS Kitten 10
AlmaLinux-10 AlmaLinux OS 10
Debian Debian GNU/Linux
FedoraLinux-42 Fedora Linux 42
SUSE-Linux-Enterprise-15-SP5 SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6 SUSE Linux Enterprise 15 SP6
Ubuntu Ubuntu
Ubuntu-24.04 Ubuntu 24.04 LTS
archlinux Arch Linux
kali-linux Kali Linux Rolling
openSUSE-Tumbleweed openSUSE Tumbleweed
openSUSE-Leap-15.6 openSUSE Leap 15.6
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
安装后,有几种方法可以运行 Linux 发行版:
- 安装 Windows 终端(推荐):使用 Windows 终端支持你想要安装的任意数量的命令行,并允许你在多个标签或窗口窗格中打开它们并在多个 Linux 发行版或其他命令行(PowerShell、命令提示符、Azure CLI 等)之间快速切换。 可使用独特的配色方案、字体样式、大小、背景图像和自定义键盘快捷键来完全自定义终端。 了解详细信息。
- 通过访问 Windows“开始”菜单并键入已安装的发行版的名称,可以直接打开 Linux 发行版。 例如:“Ubuntu”。 这会在其自己的控制台窗口中打开 Ubuntu。
- 在 Windows 命令提示符或 PowerShell 中,可以输入已安装的发行版的名称。 例如:
ubuntu
- 在 Windows 命令提示符或 PowerShell 中,可以在当前命令行中打开默认的 Linux 发行版,方法是输入:
wsl.exe
。 - 在 Windows 命令提示符或 PowerShell 中,可以在当前命令行中使用默认的 Linux 发行版,而无需输入新的发行版名称,方法是输入:
wsl [command]
。 将[command]
替换为 WSL 命令,例如,替换为wsl -l -v
以列出已安装的发行版,或wsl pwd
以查看当前目录路径在 WSL 中的装载位置。 在 PowerShell 中,命令get-date
将提供 Windows 文件系统中的日期,而wsl date
将提供 Linux 文件系统中的日期。
WSL2上的Docker 远程容器
Docker 容器概述
Docker 是一种工具,用于创建、部署和运行应用程序(通过使用容器)。 容器使开发人员可以将应用与需要的所有部件(库、框架、依赖项等)打包为一个包一起交付。 使用容器可确保此应用的运行与之前相同,而不受任何自定义设置或运行该应用的计算机上先前安装的库的影响(运行应用的计算机可能与用于编写和测试应用代码的计算机不同)。 这使开发人员可以专注于编写代码,而无需关心将运行代码的系统。
Docker 容器与虚拟机类似,但不会创建整个虚拟操作系统。 相反,Docker 允许应用使用与运行它的系统相同的 Linux 内核。 这使得应用包能够仅要求主计算机上尚未安装的部件,从而降低包大小以及提高性能。
将 Docker 容器与 Kubernetes 等工具结合使用以实现持续可用性是容器普及的另一个原因。 这样就可以在不同的时间创建应用容器的多个版本。 每个容器(及其特定的微服务)均可以动态更换,而无需停止整个系统来进行更新或维护。 你可以准备一个包含所有更新的新容器,将该容器设置用于生产,并在新容器准备就绪后直接指向该容器。 你还可以使用容器对不同版本的应用进行存档,如有需要,还可将其作为安全回退保持运行。
安装 Docker Desktop
借助 Docker Desktop for Windows 中支持的 WSL 2 后端,可以在基于 Linux 的开发环境中工作并生成基于 Linux 的容器,同时使用 Visual Studio Code 进行代码编辑和调试,并在 Windows 上的 Microsoft Edge 浏览器中运行容器。
在已安装WSL之后,安装Docker Desktop.
- 下载 Docker Desktop 并按照安装说明进行操作。(https://docs.docker.com/docker-for-windows/wsl/#download)
- 安装后,从 Windows 开始菜单启动 Docker Desktop,然后从任务栏的隐藏图标菜单中选择 Docker 图标。 右键单击该图标以显示 Docker 命令菜单,然后选择“设置”。
- 确保在“设置”>“常规”中选中“使用基于 WSL 2 的引擎”。
- 通过转到“设置”>“资源”>“WSL 集成”,从要启用 Docker 集成的已安装 WSL 2 发行版中进行选择。
- 若要确认已安装 Docker,请打开 WSL 发行版(例如 Ubuntu),并通过输入
docker --version
来显示版本和内部版本号 - 通过使用
docker run hello-world
运行简单的内置 Docker 映像,测试安装是否正常工作。(如果$ docker run hello-world
Unable to find image ‘hello-world:latest’ locally
docker: Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers),需要配置国内镜像源) - 一些需要了解的有用 Docker 命令:
- 通过输入以下命令列出 Docker CLI 中可用的命令:
docker
- 使用以下命令列出特定命令的信息:
docker <COMMAND> --help
- 使用以下命令列出计算机上的 docker 映像(此时仅为 hello-world 映像):
docker image ls --all
- 使用以下命令列出计算机上的容器:
docker container ls --all
或docker ps -a
(如果没有 -a 显示全部标志,则仅显示正在运行的容器) - 使用以下命令列出有关 Docker 安装的系统范围的信息,包括 WSL 2 上下文中你可使用的统计信息和资源(CPU 和内存):
docker info
使用 VS Code 在远程容器中开发
安装VS Code扩展
若要开始使用 Docker 和 WSL 2 开发应用,建议使用 VS Code 以及 WSL、Dev Containers 和 Docker 扩展。
- 安装 VS Code WSL 扩展。 此扩展使你能够在 VS Code 中打开在 WSL 上运行的 Linux 项目(无需担心路径问题、二进制兼容性或其他跨 OS 的难题)。
- 安装 VS Code Dev Containers 扩展。 此扩展使你能够打开容器内的项目文件夹或存储库,并利用 Visual Studio Code 的完整功能集在容器中执行开发工作。
- 安装 VS Code Docker 扩展。 此扩展添加了从 VS Code 内生成、管理和部署容器化应用程序的功能。 (需要 Dev Containers 扩展才能使用容器作为你的开发环境。)
使用 Docker 为现有应用项目创建开发容器
-
对于此示例,我将在 Python 开发环境设置文档中使用适用于 Django 的 Hello World 教程中的源代码。如果想要使用自己的项目源代码,可以跳过此步骤。 若要从 GitHub 下载 HelloWorld-Django Web 应用,请打开 WSL 终端(例如 Ubuntu)并输入:
git clone https://github.com/mattwojo/helloworld-django.git
-
在 WSL 终端中,将目录更改为此项目的源代码文件夹:
Bash
cd helloworld-django
-
通过输入以下内容,在本地 WSL 扩展服务器上运行的 VS Code 中打开项目:
Bash
code .
通过检查 VS Code 实例左下角的绿色远程指示器,确认已连接到 WSL Linux 发行版。(WSL: Unbutu-24.04)
-
从 VS Code 命令面板 (Ctrl + Shift + P),输入:开发容器: 在容器中重新打开,因为我们使用的是已使用 WSL 扩展打开的文件夹。 也可使用“开发容器: 在容器中打开文件夹…”,以使用本地
\\wsl$
共享(从 Windows 端)选择 WSL 文件夹。 有关更多详细信息,请参阅 Visual Studio Code 快速入门:在容器中打开现有文件夹。 如果这些命令在你开始键入时未显示,请检查并确保你已安装上面链接的 Dev Containers 扩展。 -
选择要容器化的项目文件夹。 在我的示例中,它是
\\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\
-
将显示容器定义列表,因为项目文件夹(存储库)中还没有 dev container 配置。 显示的容器配置定义列表将根据项目类型进行筛选。 对于 Django 项目,我将选择 Python 3。
-
系统将打开新的 VS Code 实例,开始生成新映像,生成完成后,将启动容器。 将看到出现新的
.devcontainer
文件夹,其中Dockerfile
和devcontainer.json
文件中包含容器配置信息。 -
若要确认项目仍然连接到 WSL 和容器中,请打开 VS Code 集成终端 (Ctrl + Shift + ~)。 通过输入
uname
检查操作系统,并通过python3 --version
检查 Python 版本。 可以看到,uname 返回为“Linux”,因此你仍然连接到 WSL 2 引擎,Python 版本号将基于容器配置,该配置可能不同于 WSL 发行版上安装的 Python 版本。 -
若要使用 Visual Studio Code 在容器内运行和调试应用,请首先打开“运行”菜单(Ctrl+Shift+D 或选择最左侧菜单栏上的选项卡)。 然后选择“运行和调试”以选择调试配置,并选择最适合项目的配置(在我的示例中,这将是“Django”)。 这会在项目的
launch.json
文件夹中创建一个.vscode
文件,其中包含有关如何运行应用的说明。 -
在 VS Code 中,选择“运行”>“开始调试”(或只按 F5 键)。 这会在 VS Code 中打开终端,并且你应会看到如下所示的结果:“正在 http://127.0.0.1:8000/ 启动开发服务器。使用 CONTROL-C 退出服务器。”按住 Control 键并选择显示的地址,以在默认 Web 浏览器中打开应用,并查看在其容器中运行的项目。
现在,已使用 Docker Desktop 成功配置了远程开发容器,该容器由 WSL 2 后端提供支持,可以使用 VS Code 对该容器进行编码、生成、运行、部署或调试。
Docker 镜像源设置
在Windows中,docker desktop – settings --docker engine中增加镜像源,例如:
{"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors":["https://docker.xuanyuan.me"]
}
然后点击"Apply & restart",之后,就可以在WSL中查看设置和拉取镜像了。
$ docker info
Client:Version: 28.0.4Context: defaultDebug Mode: falsePlugins:
......Registry Mirrors:https://docker.xuanyuan.me/Live Restore Enabled: false
运行docker image测试:
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
Digest: sha256:0b6a027b5cf322f09f6706c754e086a232ec1ddba835c8a15c6cb74ef0d43c29
Status: Downloaded newer image for hello-world:latestHello from Docker!
This message shows that your installation appears to be working correctly.To generate this message, Docker took the following steps:1. The Docker client contacted the Docker daemon.2. The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)3. The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.4. The Docker daemon streamed that output to the Docker client, which sent itto your terminal.To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bashShare images, automate workflows, and more with a free Docker ID:https://hub.docker.com/For more examples and ideas, visit:https://docs.docker.com/get-started/
查看docker image
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 74cc54e27dc4 4 months ago 10.1kB
相关文章:

使用VSCode在WSL和Docker中开发
通过WSL,开发人员可以安装 Linux 发行版(例如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等),并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,不用进行任何修改,也无需使用传统虚…...

ZooKeeper 命令操作
文章目录 Zookeeper 数据模型Zookeeper 服务端常用命令Zookeeper 客户端常用命令 Zookeeper 数据模型 ZooKeeper 是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似,拥有一个层次化结构。这里面的每一个节点都被称为: ZNode,每个节…...
解决 Ubuntu 20.04 虚拟机中 catkin_make 编译卡死问题
完整解决步骤 1. 禁用当前交换文件 sudo swapoff /swapfile 2. 删除旧的交换文件 sudo rm /swapfile 3. 使用更可靠的创建方法 # 使用 dd 命令创建交换文件(更兼容但较慢) sudo dd if/dev/zero of/swapfile bs1M count4096# 或者使用 truncate 命令…...
【HTML-15】HTML表单:构建交互式网页的基石
表单是HTML中最强大的功能之一,它允许网页收集用户输入并与服务器进行交互。无论是简单的搜索框、登录页面,还是复杂的多步骤调查问卷,表单都是实现这些功能的核心元素。本文将深入探讨HTML表单的各个方面,帮助您构建高效、用户友…...
一些较好的学习方法
1、网上有一些非常经典的电路,而且有很多视频博主做了详细的讲解。 2、有一部分拆解的UP主,拆解后会还原该器件的原理图,并一步步做讲解。 3、有两本书,数电、模电,这两本书中的内容很多都值得学习。 5、某宝上卖的…...

Redis底层数据结构之深入理解跳表(1)
在上一篇文章中我们详细的介绍了一下Redis中跳表的结构以及为什么Redis要引入跳表而不是平衡树或红黑树。这篇文章我们就来详细梳理一下跳表的增加、搜索和删除步骤。 SkipList的初始化 跳表初始化时,将每一层链表的头尾节点创建出来并使用集合将头尾节点进行存储&…...
鸿蒙【HarmonyOS 5】 (React Native)的实战教程
一、环境配置 安装鸿蒙专属模板 bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} 配置 ArkTS 模块路径 在 entry/src/main/ets 目录下创建原生模块&…...
PCB设计教程【入门篇】——电路分析基础-元件数据手册
前言 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理 目录 前言 一、数据手册的重要…...

20250529-C#知识:继承、密封类、密封方法、重写
C#知识:继承、密封类、密封方法、重写 继承是面向对象的三大特性之一,通过继承能够减少重复代码的编写,有助于提升开发效率。 1、继承 C#不同于C,只支持单继承当子类出现与父类同名的成员时,父类成员被隐藏࿰…...

从0到1,带你走进Flink的世界
目录 一、Flink 是什么? 二、Flink 能做什么? 三、Flink 架构全景概览 3.1 分层架构剖析 3.2 核心组件解析 四、Flink 的核心概念 4.1 数据流与数据集 4.2 转换操作 4.3 窗口 4.4 时间语义 4.5 状态与检查点 五、Flink 安装与快速上手 5.1 …...

springboot @value
#springboot value value 可以读取 yaml 中 的数据...

Dify-5:Web 前端架构
本文档提供了 Dify Web 前端架构的技术概述,包括核心组件、结构和关键技术。它解释了前端如何组织、组件如何通信以及国际化功能如何实现。 技术栈 Dify 的 Web 前端基于现代 JavaScript 技术栈构建: 框架:Next.js(基于 React …...

深度学习赋能图像识别:技术、应用与展望
论文: 一、引言 1.1 研究背景与意义 在当今数字化时代,图像作为信息的重要载体,广泛存在于各个领域。图像识别技术旨在让计算机理解和识别图像内容,将图像中的对象、场景、行为等信息转化为计算机能够处理的符号或数据 &am…...

八N皇后问题
1 问题的提出 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法 我们的任务就是用MATLAB进行求解 2 数学模型的构建 首先我们分析题目就是 任意两个皇后都不能处于…...

TMS320F28388D使用sysconfig配置IPC
第1章 配置IPC底层代码 使用IPC的动机: 我计划我的项目中要使用RS485,CANFD通信和EtherCAT通信,由于通信种类较多,而对于电机控制来说大部分数据都是重复的,并且有些数据可以很久才改变一次,所以我计划使…...
代码训练LeetCode(19)轮转数组
代码训练(19)LeetCode之轮转数组 Author: Once Day Date: 2025年6月3日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 189. 轮转数组 - 力扣(LeetCode)力扣 (LeetCode) 全球极客挚爱的…...
每日算法 -【Swift 算法】将整数转换为罗马数字
💡 Swift:将整数转换为罗马数字(含思路讲解与详细注释) 罗马数字是一种古老的数字表示方式,虽然在现代我们不再使用它进行计算,但在表盘、章节、纪念碑等地方依然很常见。今天我们就来实现一个经典算法题&…...

Qwen与Llama分词器核心差异解析
Qwen和 Llama 词映射(分词器)的区别及通用词映射逻辑 一、Qwen 与 Llama 词映射(分词器)区别 维度Qwen 分词器Llama 分词器技术基础基于字节级别字节对编码(BBPE),以 cl100k 为基础词库,扩充中文字词、多语言词汇基于 BPE,但依赖 SentencePiece 单字模型,核心为英文优…...

华为云Flexus+DeepSeek征文 | 基于ModelArts Studio 与 Cline 快速构建AI编程助手
目录 一、前言 二、ModelArts Studio(MaaS)介绍与应用场景 2.1ModelArts Studio(MaaS)介绍 2.2 ModelArts Studio(MaaS)使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、Cline简介和安装 3.1 C…...

pikachu靶场通关笔记11 XSS关卡07-XSS之关键字过滤绕过(三种方法渗透)
目录 一、源码分析 1、进入靶场 2、代码审计 3、攻击思路 二、渗透实战 1、探测过滤信息 2、注入Payload1 3、注入Payload2 4、注入Payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到安…...
Android App引用vendor编写的jni动态库
简单描述一下,就是我自己基于FastDDS写了一个Jni的so,然后编写了jar包引用该so,最后写了一个Android的测试apk使用jar包,调用jni中的接口去创建Participant,Subscriber等。 实际将jni的so放到 /system_ext/lib64&#…...
React从基础入门到高级实战:React 核心技术 - 错误处理与错误边界:构建稳定的应用
React 错误处理与错误边界:构建稳定的应用 在开发 React 应用时,错误处理是确保应用稳定性和用户体验的重要环节。无论是运行时错误、API 请求失败还是用户操作失误,合理的错误处理机制都能防止应用崩溃,并为用户提供清晰友好的反…...
页面输入数据的表格字段(如 Web 表单或表格控件)与后台数据库进行交互时常用的两种方式
“从页面输入数据的表格字段(如 Web 表单或表格控件)在与后台数据库进行交互时,常用的有两种方式:” 🎯 两种方式(操作调用数据库、绑定数据) 🚀 方式1:前端代码提交数据到后端,再由后端调用数据库 💡 原理和逻辑: 用户在页面上(比如输入表单、表格)输入数据…...

碰一碰发视频-源码系统开发技术分享
#碰一碰营销系统# #碰一碰系统# #碰一碰发视频# 架构设计哲学:近场通信的优雅平衡 一、核心通信技术选型 1. 双模协同传输引擎 技术协议栈延迟控制适用场景NFCISO 14443-A<100ms精准触发场景BLE 5.0GATT Profile300-500ms中距传输场景 工程决策依据&…...

C++学习过程分享
空指针:int *p NULL; 空指针:指针变量指向内存中编号为0的空间;用途:初始化指针变量注意:空指针指向的内存不允许访问注意:内存编号为0-255为系统占用空间,不允许用户访问 野指针:…...

C语言 — 动态内存管理
目录 1.malloc和free函数1.1 malloc函数1.2 free函数1.3 malloc函数的使用 2.calloc函数2.1 calloc函数2.2 calloc函数的使用 3.realloc函数3.1 realloc函数3.2 realloc函数的使用 4.动态内存管理笔试题4.1 笔试题(1)4.2 笔试题(2)…...

《TCP/IP 详解 卷1:协议》第5章:Internet协议
IPv4和IPv6头部 IP是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP和IGMP 数据都通过IP数据报传输。IP提供了一种尽力而为、无连接的数据报交付服务。 IP头部字段 IPv4 头部通常为 20 字节(无选项时),而 IPv6 头部固定为 40 字节。IPv6 不…...
C#面向对象实践项目--贪吃蛇
目录 一、项目整体架构与核心逻辑 二、关键类的功能与关系 1. 游戏核心管理类:Game 2. 场景接口与基类 3. 具体场景类 4. 游戏元素类 5. 基础结构体与接口 三.类图 四、核心流程解析 五、项目可优化部分 一、项目整体架构与核心逻辑 该项目运用场景管理模…...

学习STC51单片机26(芯片为STC89C52RCRC)
每日一言 真正的强者,不是没有眼泪,而是含着泪依然奔跑。 硬件:4G模块 这个是接线原理,我们也只要知道这个4根线的连接就好了,我们也是连接到USB转TTL的模块上 要插卡哈......... 随后我们下载一个叫做亿佰特的调试助…...
Web前端为什么要打包?Webpack 和 Vite 如何助力现代开发?
一. 为什么要使用框架库? 1.1 传统网页与现代前端的差异 在最早期的网页开发中,我们只需要写几个.html文件,配上.css和.js文件,浏览器直接加载就能展现页面,每个文件都是独立的静态资源,简单且直观 但现在网站越来越复杂了: 需要用到最新的js语法(比如ES6)使用框架(Vue…...