Docker Desktop のバージョン更新でライセンス変更が行われたこともあり、「Windows Container (Windows コンテナ) も使えなくなった?」と不思議に思い、調査しました。結論としては Windows コンテナは Docker Desktop を使わないで使うことができます。
Windows コンテナを使えるようにする (セットアップ)
Docker Desktop は今や有料のプロダクトと考える方が正しそうですが、 Docker に関するオープンソースのプロダクトが公開されたままなのは変わりないようです。以下の内容を見ると Docker CLI や Docker Compose などは、オープンソースのままです。
このようなところから、Docker Desktop で基本的な機能のみを使っていたのであれば置き換えは可能そうです。
Windows コンテナを起動するために Docker (CLI) をインストールする
以下の作業を、管理者として開いた PowerShell でおこないます。Docker のバージョンについては使用状況において適切に読み替えて下さい。
curl.exe -o docker.zip -LO https://download.docker.com/win/static/stable/x86_64/docker-20.10.8.zip
Expand-Archive docker.zip -DestinationPath C:\
[Environment]::SetEnvironmentVariable("Path", "$($env:path);C:\docker", [System.EnvironmentVariableTarget]::Machine)
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
この作業は Windows10 20H2 Professional エディションにて行っています。また WSL2 をバックエンドに使用した Docker Desktop を使っていた状態でしたので、 Docker Desktop をアンインストールして作業を行っています。
サービスと設定して起動・動作の確認
Windows サービスとして Docker を設定して、簡単なサンプル (Hello World) を起動してみます。作業中の PowerShell で引き続き、以下のコマンドを実行します。
dockerd --register-service
Start-Service docker
docker run hello-world
上記の図のように、 Hello from Docker メッセージが表示されていれば、うまく Windows コンテナでの Hello world が成功しています。
おまけ:Linux コンテナと Windows コンテナを共存する
今回の Windows コンテナと、以前紹介した WSL2 Ubuntu 20.04 上で動かしている Docker でLinux コンテナをなるべく切替の手間無く使いたいところです。 Docker Desktop では、 Windows コンテナと Linux コンテナの操作対象を切り替えて作業 していた箇所となります。
WSL2 側 Linux の設定を変更
まず以前構築した WSL2 の Docker の設定を変更します。
“/lib/systemd/system/docker.service” ファイルを開き、以下のように localhost で docker デーモンを公開します。
この後、以下のコマンドでサービスを更新しておきます。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
サービスの起動後は、ポートが公開された状態で動いているか確認しておきます。
$ ss -atln
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.1:2375 0.0.0.0:*
LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
Windows 側でコンテキストを作成
Windows 側 Powershell で以下のコマンドを実行し、 Linux 用のコンテキストを生成します。
docker context create linux --docker host=tcp://127.0.0.1:2375
動作の確認
それでは簡単に動作を確認してみます。
Windows コンテナとして IIS を動かし、 Linux コンテナでは nginx を動かしているという状況です。さすがにポートは同一にできないので、 IIS: 8080 を、 nginx:80 を割り当てるようにして動かしています。
このとき、 PowerShell 側で docker コマンドを叩いて、Windows / Linux 両方の状態を確認することが可能となります。コンテキストの指定は必要となりますが、切替操作は不要で同時に Linux コンテナと Windows コンテナを同一ホスト上で動かして制御することが可能です。
docker ps (Windowsコンテナが表示される)
docker -c linux ps (Linux コンテナが表示される)
まとめ
今回は Windows コンテナを使うための準備について説明しました。機会があったら、この Windows コンテナを使って何かやってみた事例を紹介したいと思います。
参考
- https://lippertmarkus.com/2021/09/04/containers-without-docker-desktop/