众所周知,代码复现最头疼的莫过于 运行环境 问题,明明按照 README 配置好了环境,却因为库版本、系统、硬件层面等的差异,出现一些莫名其妙的错误。
docker 平台的出现改变了这一现状,它通过创造一个容器 (container),技术人员在其中安装开发环境、完成代码开发并打包,使用者下载镜像 (image) 后即可复现这个自带开发环境的容器,从而顺利使用上程序,即口号 “build, share and run”。
WSL2 (Windows Subsystem for Linux 2) 是微软自带的 Linux 子系统,最早发布于 2021 年的 Windows 10 中,目前在 Windows 10 和 Windows 11 中都可以安装和运行。
docker 必须运行在 Linux 系统下,因此 Windows 系统需要调用 WSL2 来实现 docker。
直通链接:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
安装完毕后打开 powershell,输入:
wsl --set-default-version 2
更多关于 WSL2 的安装问题请见:
https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package
更多关于 WSL2 的安装问题请见:
https://docs.docker.com/desktop/install/windows-install/
打开 Docker Desktop,可以看到左侧有三个主要功能:
Docker Desktop 允许方便地查看和删除最近的活动,但是操作起来并不清晰和明确,因此更推荐在命令行执行指令,以下列举了最常见的指令:
镜像:docker pull xxx (下载) / docker run xxx (安装) / docker image ls (列表)
容器:docker start xxx (启动) / docker stop xxx (停止) / docker container ls (列表)
数据卷:docker volume create xxx (创建) / docker volume ls (列表)
- 下载所需的 image (环境,譬如 python 3)
- 准备一个 volume (数据盘)
- 把将要执行的代码和数据放在 volume 里面
- 创建 container (容器) ,安装环境,并挂载 volume
- 在容器复现的环境内运行代码
回到 Docker Desktop,右上角搜索 python,然后选择所需的版本,再点击 Pull 即可
完成后,将看到 images 中多了一个 python
打开 Windows Powershell,输入以下指令
完成后可以在 Docker Desktop 的 Volumes 中看到新增的数据盘
docker volume create --name disk
该数据盘的实际位置可以通过 Windows 文件浏览器访问:
\wsl.localhost\docker-desktop-data\data\docker\volumes\disk_data
此时可以在该位置新建或者复制进来一个 test.py,内容如下:
print('Hello World!')
答疑:这个奇怪的路径是怎么回事?
请回忆一下 docker 平台的原理,它运行在 Windows 利用 WSL2 创建的 Linux 环境中, 换句话说,以上路径可以理解成:
- WSL2 创造了 Linux 系统,位于网络位置 \wsl.localhost
- docker 平台安装在该系统中,因此位于 docker-desktop-data 文件夹
- docker 创建了一个硬盘,因此位于 \data\docker\volumes 内
打开 Windows Powershell,输入以下指令
docker run -it --name test -v disk:/mnt python
此时看到进入了容器的 python 环境中,容器的系统是 Linux 系统
Python 3.11.0 (main, Nov 15 2022, 19:58:01) [GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
答疑:run 里面的参数是怎么回事?
此时,我们已经为 Linux 子系统准备好了 Docker 带来的容器 test,该容器内安装好了 python 环境,同时该容器的 /mnt 文件夹挂载了系统的 disk 文件夹,内含有传输过来的代码,等待进一步执行。
我们首先进入这个容器:
接着和 Linux 一样,切换容器的工作目录到 /mnt 中,然后执行代码:
cd mnt
python test.py
大功告成: