1、安装wsl2
2.重启电脑后,手动打开cmd,查看刚刚安装的,
输入wsl.exe
开始菜单也有wsl,但是打开后闪一下就没了,不知道什么情况。
3.选择一个linux发行版安装,根据ai的推荐
wsl.exe --install Ubuntu-22.04
输入后没反应,最佳方法是切到wsl1后再安装linux,安装完成后再切回wsl2.
wsl --set-default-version 1 大概会报错(下图),报错的话就用以下命令
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
命令解释:
dism.exe是 Windows 系统自带的部署工具,这个命令的意思是“在线启用名为‘Microsoft-Windows-Subsystem-Linux’的Windows功能,并包含所有子组件,且完成后不立即重启”。
如图显示成功,就可以继续下载linux。
wsl --install -d Ubuntu-22.04
输入后会在0%,等几分钟,进度条会开始动。
自定义用户名:docker
自定义密码。
看到命令行提示符变成类似用户名@电脑名:~$的样子,恭喜你,现在已经成功登录到 Ubuntu 系统.
🚀 安装完成后,可以做什么?
既然系统已经装好,你可以接着完成我们之前讨论的目标:
先升级到 WSL 2:为了更好的 Docker 性能,建议你现在就将它升级。在 Ubuntu 中输入
exit退出,回到 Windows 的 PowerShell 或 CMD,执行我们上次提到的转换命令:
wsl --set-default-version 2
查看已安装的linux.
接下来安装docker的windows版,
百度搜索docker,找到官网,或者直接访问https://www.docker.com/get-started/
网页打开有些慢,打不开可以刷新一下,再等一下。
下载AMD64那个。
下载后双击打开
确保Use WSL 2 instead of Hyper-V这个选项是勾选状态(默认就是勾选的)
提示重启电脑,点击"Close and restart"即可
不登录,点继续。(docker注册账号的页面国内应该是打不开的)
点设置--Resources--WSL integration
确保Enable integration with my default WSL distro开启,
然后能看到刚刚安装的linux,把开关打开,Apply。
开始菜单可以看到在docker之前用wsl安装的Ubuntu,把它打开
输入docker run hello-world验证一下,应该会报错。Docker 无法连接到它的官方镜像仓库(Docker Hub)。核心问题就是网络连接失败,这在国内是使用 Docker 最常遇到的状况。错误中的target machine actively refused it表明连接请求被直接拒绝或超时了。
需要添加国内镜像源,先打开docker设置,来到这里
添加json,把注释去掉
"registry-mirrors": [ "https://docker.nju.edu.cn", // 南京大学镜像源(稳定) "https://docker.mirrors.sjtug.sjtu.cn", // 上海交通大学镜像源 "https://hub-mirror.c.163.com", // 网易镜像(经测试目前有效) "https://ccr.ccs.tencentyun.com" // 腾讯云容器镜像服务 ]
效果如下:
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "registry-mirrors": [ "https://docker.nju.edu.cn", "https://docker.mirrors.sjtug.sjtu.cn", "https://hub-mirror.c.163.com", "https://ccr.ccs.tencentyun.com" ] }Apply之后,执行命令注册一下新镜像源,
docker info | grep -A 5 "Registry Mirrors"
再次尝试运行docker run hello-world,应该就可以拉取镜像了,
拉取自己需要的镜像,比如
docker pull swr.cn-north-4.myhuaweicloud.com/ci-service/openharmony-standard-build-env-22.04
查看已下载的镜像:
docker image ls
启动已下载的镜像:
docker run -it --name ohos-build [镜像名] /bin/bash
| 命令/参数 | 作用解释 |
|---|---|
docker run | Docker 启动容器的核心命令。 |
-it | 这是-i和-t的组合。它让容器启动后,你能直接进入容器的内部命令行(Shell),就像直接操作一台 Linux 机器一样。 |
--name ohos-build | 给这个容器起一个叫ohos-build的名字,方便后续管理(如启动、停止、删除)。如果不指定,Docker 会随机分配一个名字。 |
swr.cn-north-4...:4.0.0 | 指定用来创建容器的镜像。这里就是你之前下载好的那个完整的镜像名称。 |
/bin/bash | 容器启动后,直接运行bash命令,也就是进入命令行模式 |
容器窗口关了如何重新打开?
docker ps -a
查看所有容器,看status,
重点关注两列:
STATUS:显示容器是否在运行(
Up表示运行中,Exited表示已停止)。NAMES:你之前给容器起的名字(比如
ohos-build)或自动生成的名称。
如果容器仍在运行(STATUS 为Up)
直接使用docker exec命令打开一个新的 bash 会话:
docker exec -it <容器名或ID> /bin/bash
例如:
docker exec -it ohos-build /bin/bash
你会立即进入容器的内部命令行,所有之前的环境和文件都保持不变。
如果容器已停止(STATUS 为Exited)
先启动容器(让它后台运行),然后再进入:
docker start <容器名或ID> # 启动已停止的容器 docker exec -it <容器名或ID> /bin/bash
例如:
docker start ohos-build docker exec -it ohos-build /bin/bash
搞了一长串,相信有的人已经忘记了刚才都做了什么了。
来回忆一下:安装WSL2--》同时安装了Ubuntu--》安装docker桌面版并且设置修改镜像源,勾选ubuntu--》打开Ubuntu并在里面使用docker run下载启动了指定的镜像。
那么,问题来了,
安装wsl2,Ubuntu,docker桌面版这3者之间是什么关系?
我启动了一个已经下载的镜像后,在里面所做的更改也会更改这个镜像本身吗?万一环境搞坏了我可不想重新下载一遍。
简单来说,WSL2是“地基”,Ubuntu是“房子”,Docker Desktop是“房客和管理员”。它们之间是紧密协作、层层依赖的关系。
1. 核心角色分工
WSL 2(技术底座)
它是Windows下的一个轻量级虚拟机,相当于在Windows里搭建了一个高效运行Linux的底层平台。
它的职责是让Linux内核能在Windows上流畅、低开销地运行。
Ubuntu(运行环境)
它是在WSL2这个平台上运行的具体Linux发行版,就像你在这个地基上盖起的一栋具体的“房子”。
你的Docker命令(如
docker run)实际上就是在这栋“房子”里被理解和执行的。
Docker Desktop(管理工具)
它是Windows上的一个图形化软件,你可以把它看作“物业管理处”。
它的职责是帮你管理和配置Docker的运行环境,包括决定Docker使用哪个WSL发行版(比如你的Ubuntu)。当你启动Docker Desktop后,它就会把真正的“发动机”——Docker引擎——安装到你指定的那个WSL发行版(Ubuntu)里。
2. 它们是如何协同工作的?
当三者正确配置后,工作流程是这样的:
你启动Docker Desktop(点击Windows右下角的小鲸鱼)。
Docker Desktop会唤醒WSL 2平台,并向它管理的Ubuntu系统里注入Docker引擎。
当你在Ubuntu终端里输入
docker run时,这个命令会直接与运行在“隔壁”的Docker引擎通信,然后引擎去拉取镜像、创建容器。整个过程在底层由WSL2提供Linux兼容层,在用户层面你看到的则是Ubuntu终端和Docker Desktop的界面。
3. 为什么需要这种组合?
这种“三件套”的组合解决了Windows上使用Docker的根本矛盾:
Docker依赖Linux内核:Docker容器本质上是Linux进程,需要Linux内核环境才能运行。
Windows需要运行Docker:通过WSL2,Windows无需创建完整的虚拟机,就能高效地提供一个Linux内核环境。
用户需要方便地管理:Docker Desktop提供了友好的图形界面和系统托盘,让你可以一键启动、停止Docker,并管理资源分配。
总结一下,你可以把WSL2想象成一台能运行Linux的“虚拟机”,Ubuntu是这台虚拟机上安装的操作系统,而Docker Desktop则是帮你在这个系统里安装、启动和管理Docker引擎的助手。
==============================================================
第二个问题回答:不会。你在容器里做的任何更改,都不会修改你下载的那个原始镜像。
镜像 vs. 容器:就像“光盘”和“播放器”
你可以把Docker 镜像想象成一张只读的蓝光光盘(或游戏光盘)。它存储了所有固定的内容,比如操作系统、依赖库和应用程序。这张光盘本身是只读的,你无法直接修改光盘上的内容。
当你运行docker run启动一个镜像时,Docker 实际上是在这张只读光盘之上,附加了一个薄薄的、可写的“便签层”。这个“光盘+便签层”的组合,就是一个容器。
镜像= 只读的蓝光光盘(永久不变)
容器= 光盘 + 可写的便签层(便签层上的更改临时保存)
你在容器里创建、修改、删除的任何文件,都发生在这个临时的“便签层”上。原始的光盘(镜像)始终完好无损,不会被改动。
✍️ 实际操作中的表现
结合你之前的场景:
你运行了
docker run -it --name ohos-build ... /bin/bash,这基于你那个镜像创建了一个容器。然后你在容器里安装了 JDK,设置了环境变量,还尝试构建项目。
所有这些更改,都只写在了你这个容器的“便签层”上。你下载的那个镜像本身,在你退出容器后,依然是刚下载时的原始状态,没有任何改变。
🔄 如何验证?
你可以做一个简单的小实验:
基于同一个镜像,启动另一个新的容器(取个不同的名字):
bash
docker run -it --name xxx-test <你的镜像名> /bin/bash
进入后,你会发现之前你在容器里安装的 JDK、设置的环境变量,这个新容器里一个都没有。它完全是镜像初始的、干净的状态。
💡 如果你想保存更改,怎么办?
如果你在容器里配置好了一切(比如装好了 JDK、下载了依赖),希望把这个“已配置好的环境”保存下来,作为一个新的镜像供以后使用,你需要执行docker commit命令:
bash
# 将名为 ohos-build 的容器,保存为一个名为 my-kotlin-env 的新镜像 docker commit ohos-build my-kotlin-env:latest
之后,你就可以基于这个新镜像my-kotlin-env启动容器,它会包含你之前做的所有更改。不过,更推荐的做法是编写Dockerfile来自动化地构建镜像,但这属于更高级的用法了。
总结一下:容器是镜像的一个动态的、临时的实例。你可以在容器里随意“折腾”,不用担心弄坏原始的“母版”镜像。这正是 Docker 隔离性和灵活性的魅力所在。
========================================
电脑关机,第二天开机开始继续之前的工作:开始菜单--搜索Ubuntu--打开,
查看本机的镜像的命令是:
docker image ls
此时有可能提示如下,说明还需要把docker程序打开:
再次执行命令即可:
那么如果此时使用docker run -it --name [容器名] [镜像名] /bin/bash命令,容器名字写昨天的名字,就不是启动容器,而是新建容器,此时会报错,因为重名了。
前面提到过,查看本地容器是
docker ps -a
如果容器还在运行中,那就用:
docker exec -it [容器名] /bin/bash
如果容器已关机,那就用:
docker start <容器名或ID> # 启动已停止的容器 docker exec -it <容器名或ID> /bin/bash # 进入容器