尝试将Docker容器移植到WSL(Windows 10 Fall Creators Update)上

WSL-Toyc 摘要

尝试将Docker容器移植至WSL(Windows 10秋季创作者更新版)。

准备 Docker 容器

在这里,我们将尝试运行未经过 Windows 移植的 Redis 4.0 系列。

在Docker运行环境中创建要移植的容器。

$ # docker container を作成
$ docker pull redis:4.0
$ docker create --name redis4 redis:4.0

创建 WSL 分发

在WSL上注册并启动分发。

用非管理员权限打开普通的命令提示符。

> rem ツールのダウンロード (お好みのプログラムで)
> curl -LO https://github.com/noumia/wsl-toyc/releases/download/v1.0/wsl-toyc.zip
> 7za x wsl-toyc.zip

> rem 環境用のフォルダーを準備して rootfs ファイル等を配置する
> mkdir redis4
> move create-toyc.exe redis4
> rem docker container のイメージファイル作成
> rem docker の稼働している環境から rootfs.tar.gz ファイルを転送しても可
> docker export redis4 | gzip -c - > redis4\rootfs.tar.gz

> rem redis4 環境を作成する (フォルダー名がそのままディストリビューション名になる)
> redis4\create-toyc.exe

> rem 起動用実行ファイルの準備 (実行ファイル名をディストリビューション名にリネーム)
> ren launch-toyc.exe redis4.exe

> rem redis-server の起動
> redis4 /bin/bash -c "cd /data && docker-entrypoint.sh redis-server"

> rem Ctrl-C 押下で redis-server は終了します。

起动命令的参数变得复杂,因为未反映Dockerfile中的配置信息,因此需要编写一个执行相同操作的命令。

为了确认操作,请打开另一个命令行提示符,并启动客户端工具。

> redis4 redis-cli PING
PONG

删除 WSL 分发

在WSL分发环境中创建的文件将全部被删除。

> wslconfig /u redis4

如果不再使用,请删除redis4文件夹和redis4.exe文件。

删除发行版后,再次执行 redis4\create-toyc.exe,环境将回到初始启动状态。

动作的机制

由两个程序组成。

名称動作create-toyc.exerootfs.tar.gz をもとに WSL distribution を新たに作成launch-toyc.exeWSL distribution のランチャープログラム (使用時にはリネーム)

创建时,使用WSL API的WslRegisterDistribution函数,但由于其规定,将调用进程的可执行文件位置用作Linux文件系统的安装目录,因此需要为每个想要使用的环境实例创建相应的可执行文件。

在 create-toyc.exe 中,我们将基础文件夹的名称直接注册为分发名称。

请将要用作源的 rootfs.tar.gz 文件(文件名固定)放在 create-toyc.exe 文件所在的位置。

可以使用通过docker export命令导出的容器文件作为rootfs.tar(需要使用gzip压缩)。

由于其输出的映像文件形式不同,因此无法直接使用docker save。

大部分的Docker容器可能能够运行,但不基于glibc的容器无法工作。因此,以busybox或alpine为基础的容器将无法正常运行。

通过复制create-toyc.exe文件到不同的位置,可以创建任意多个环境。(分发名称必须是唯一的。)

您可以使用 wslconfig /l命令确认已注册的发行版名称。

注册后,Linux文件系统会被展开到create-toyc.exe文件所在目录的rootfs下面。然而,这些文件对于Windows端的应用程序是禁止访问的,以防止文件损坏的可能性。

如果要启动Linux程序,请使用launch-toyc.exe,但请将文件名改为您想要启动的发行版名称。

提取实行文件名(不包括扩展名)作为分发名称,并作为启动的机制。

当没有提供参数时,将启动Shell(bash)。

在部署启动器程序时,可以选择任何位置。

版权问题

这个项目 (https://github.com/noumia/wsl-toyc) 的代码版权归公共领域。

bannerAds