尝试将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,环境将回到初始启动状态。
动作的机制
由两个程序组成。
创建时,使用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) 的代码版权归公共领域。