WSLもDocker Desktopも使わずにDockerをWindowsでやってみる
概要
この記事では、Windows上でDocker環境を作るための方法を説明します。
今回はDocker Desktopに代表されるGUI系Dokcer管理ツールは使わずに、Windowsコマンドプロンプト、PowerShellだけで実行できるようにします。
経緯
私はDockerの存在自体は知っていましたが、普段はJava開発やWebのフロント系を生業としているため、Eclipseやメモ帳だけで環境が完結できていました。
そんな中でも例えばセルフホスティングのツールを利用したいなとうっすらと思っていたのですが、最近のオープンソースはDockerで環境を作ることが前提、あるいはその方法しか書いていないことも多くあきらめてしまっていました。
ですが知ることを放置していても使いたいツールの代替手段が得られるわけでもないので、いいかげんDockerを始めてみることにしました。
ターゲット
- Dockerがなんなのかわからないけど、とりあえず説明も聞かずにやってみたいと思ってる人
- Linuxとかわかんないのでできれば触りたくない人
- Docker Desktopが有償って聞いたから避けたい人(※個人や小規模の場合は無料です)
- 代わりのGUIツールがあるといっても『他のサードパーティだってすぐ有償化するでしょ?』と懐疑的な人
こういった方向けですので、手順上の説明はしますが、結局Dockerがなんなのかの説明は一切しません。そういった文書は精錬された有志のドキュメントがZenn上にもたくさんありますので、そちらを探してみてください。
ゴール
- Dockerのセットアップが完了し、Windows上で操作、管理できるようになること
通常の方法と何が異なるのか
通常はWSL(Windows Subsystem for Linux)やHyper-Vを利用してLinuxを仮想化し、その上にコンテナを用意しますが、今回の方法ではWindowsコンテナを利用します。
コンテナは各OSのカーネルに準拠して動作するため、コンテナが「Linuxベースなのか」「Windowsベースなのか」が大きく異なります。
したがって次のような問題点があります。
これらを踏まえて、「Windowsコンテナは避けるべきだ」とお考えになった方はDocker Desktopから導入する方法、あるいはWSLやはHyper-Vを利用したDockerの導入方法を試してみてください。
おそらく、Windowsコンテナを使用するよりも素直かもしれません。
今回の方法における問題点1
Docker Hub(イメージを配布しているサイト)上に掲載されている「Windowsコンテナ」に対応するイメージが少ないです。
このリンクはDocker Hub上に登録されているWindowsコンテナでDockerを実行した場合に対応しているDockerイメージの一覧です。たとえばRust言語を利用するためのイメージ。
したがって読み込みをしようとするとno matching manifest for windows/amd64 10.0.22631 in the manifest list entries
(windows/amd64のコンテナには対応していません)というエラーになります。
逆にPython言語を利用するためのイメージ。
ですのでPythonはWindowsコンテナで使用することができます。
もちろんDockerイメージ自体は作ることができますので、自身で作ってしまえば気にならないかもしれませんがいささか不便かもしれません。
今回の方法における問題点2
Windowsコンテナを前提とした記事が非常に少ないです。
MicrosoftやDockerのドキュメントに日本語で解説は乗っていますが、世間的にはLinuxコンテナを利用する手段を採用するのが一般的です。
またDocker Desktopの旧称は「Docker for Windows」だったりしたので、検索するのも苦労すると思います。
そのため、検索に頼ろうとするとシェルをWindowsコマンドに読み替える必要が出てきます。
また、Linuxでしか動かせないプログラムは当然使用できません。
いまどきのプログラマはLinuxになれている方も多いとは思いますが、わたしのようにWindowsを前提としたシステム開発ばかりに携わってきた場合はすこし苦労するかもしれません。
用意するもの
-
Docker Engine
今回は「docker-25.0.2」を使用しています。
移行の手順はリンク先を参考にして記載していますので、一度ご覧になっていただくのがいいかなと思います -
Docker Compose v2
今回は「v2.24.5」を使用しています。
Docker環境を作る
「コンテナー」を有効にする
まずは「Windowsの機能」を開きます。
コントロールパネルから開く方法もありますが、私はスタートメニューから検索するのをお勧めします。
ツリーから「コンテナー」を有効化します。
「OK」を押下すると再起動を促されるので、再起動しましょう。
Dockerを展開する
Docker Engineをダウンロードします。
「用意するもの」のリンク先内でも入手方法やダウンロードページの紹介はされていますが、いまのところ下記のURLから入手可能です。
ダウンロードしたファイルはDockerをインストールしたいフォルダで展開しましょう。
私は図のような配置をしました。
📂 . (例:D:\service\docker)
├── 📂docker-xx.x.x
│ ├── docker.exe
│ ├── dockerd.exe
│ └── docker-proxy.exe
│
└── (ここには操作するバッチなどを置く予定)
Dockerをインストールする
設定ファイルとなるデーモンファイル、そしてサービスをインストール/アンインストールするバッチを「ここには操作するバッチなどを置く予定」としている場所に配置します。
daemon.json
{
"group": "xxxxxxx"
}
daemon.jsonはDocker Engineの設定ファイルです。
内容を修正するたびサービスの再起動が必要ですが、このように外部化しておくと設定自体をバックアップしやすいので作成しました。
group
管理者実行の必要がないアカウント/グループを指定することができる設定です。
Windowsの場合、group
はローカルユーザーアカウント名を指定できます。
通常は把握しているかもしれませんが、分からない場合はwhoami
コマンドで確認することができます。
上記の場合、「desktop-■■■■■■■」がグループ名、「admin」がユーザー名なのでdaemon.jsonは次の通り設定します。
{
"group": "admin"
}
その他の設定方法については下記を参考にしてください。
install.bat, uninstall.bat
@echo off
pushd %~dp0
rem ディレクトリパスは適時修正
set SERVICE_DIR=%~dp0\docker-xx.x.x
set DAEMON_FILE=%~dp0\daemon.json
%SERVICE_DIR%\dockerd.exe --register-service --config-file %DAEMON_FILE%
popd
exit /b
@echo off
pushd %~dp0
rem ディレクトリパスは適時修正
set SERVICE_DIR=%~dp0\docker-xx.x.x
%SERVICE_DIR%\dockerd.exe --unregister-service
popd
exit /b
あとはinstall.batを管理者で実行すれば「Docker Engine」がサービスに登録されます。
初期状態ではDockerは起動していないので、起動しておきましょう。
これでDockerセットアップは完了です。
Hello Worldしてみる
正常に動作が可能か確認しましょう。
バージョンを確認する
ターミナルでdockerをインストールしたディレクトリへ移動し、下記のコマンドでバージョンを確認します。
.\docker.exe version
バージョン情報が正常に表示されれば問題ありません。
hello-worldコンテナを実行する
バージョンを確認出来たらdockerは実行できる状態にあると思われます。
下記のコマンドでhello-worldコンテナを実行してみましょう。
.\docker.exe run hello-world
初めて実行する場合はhello-worldコンテナのダウンロードが行われるのでしばらく待ちます。
Hello from Docker!
が表示されて正常終了すれば、セットアップが正常に行われたといえます。
Dockerイメージを作成して実行する
Dockerイメージを作って実行してみましょう。
ここではDocker Hubから、PowershellがセットアップされているWindowsサーバーコンテナを利用してログインユーザーを表示するイメージを作ってみます。
FROM mcr.microsoft.com/powershell:windowsservercore-ltsc2022
# powershellイメージでは「C:\Program Files\PowerShell\pwsh.exe」がpowershellの実行ファイル
SHELL ["pwsh.exe", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
# test用のユーザーを作成
RUN net user testuser /ADD
RUN NET LOCALGROUP Administrators /add testuser
USER testuser
CMD whoami
Dockerfileの作成方法については省きますが、dockerfileを適当なフォルダに入れてイメージ化します。
今回はF:\docker\nginx
に放り込み、次のコマンドを実行しました。
cd D:\service\docker
.\docker build F:\docker\nginx -t example
Successfully tagged example:latest
が表示されればイメージ化の完了です。
続いて次を実行しましょう。
.\docker run example
ユーザー名が表示されれば成功です。
Docker Composeを追加する(CLIプラグインの導入方法)
Docker Composeの導入方法を説明しますが、おそらく他のCLIプラグインも同様かと思います。
Docker Composeを展開する
まずは「用意するもの」からDocker Composeをダウンロードします。
GitHubなのでReleasesから最新のDocker Composeを入手することができます。
たくさんファイルがあるかと思いますが今回使用するのはdocker-compose-windows-x86_64.exe
です。
次にC:\ProgramData\docker
ディレクトリにcli-plugins
フォルダを作成してください。
C:\ProgramData\docker
はDockerで作成したコンテナを管理しているデータフォルダで、C:\ProgramData\docker\cli-plugins
はCLIプラグインを格納するディレクトリです。
データフォルダ自体はinstall.batで呼び出しているdockerd
のオプションでパスを設定すると保管場所を変更することはできますが、cli-plugins
フォルダの位置は変更できないようです。
cli-plugins
フォルダを作成したらダウンロードしていたdocker-compose-windows-x86_64.exe
をdocker-compose.exe
にリネームしておきます。
この後、サービスを再起動すればDocker Composeの導入は完了です。
バージョンを確認する
ターミナルを開き、dockerをインストールしたディレクトリへ移動して下記のコマンドでバージョンを確認します。
.\docker.exe compose version
Docker Composeのバージョンが表示されたら導入できていることが確認できます。
ここでdocker: 'compose' is not a docker command.
と表示される場合は、cli-plugins
フォルダにdocker-compose.exe
という実行ファイルが存在していないことを示します。
以下を確認してみてください。
- Docker Composeのバージョンはv2であるか
古いバージョンでは.\docker.exe compose
というオプションがありません。
https://www.konosumi.net/entry/2023/02/26/142508
v2.x.x以降のDocker Composeを利用しましょう - サービスの再起動はしたか
C:\ProgramData\docker\cli-plugins
の適用はDocker Engineの再起動が必要なようです -
C:\ProgramData\docker\cli-plugins
にDocker Composeを置いたか
install.batでC:\ProgramData\docker
を移動したとしても、C:\ProgramData\docker\cli-plugins
ディレクトリは移動することができません。
ディレクトリパスが正しいか確認してください -
docker-compose.exe
にリネームしたか
docker-compose-windows-x86_64.exe
のままでは読み込んでくれません。リネームを舌か確認してください。
PATH
に登録する
Dockerを環境変数ここで詳細な手順は記載しませんが、docker-xx.x.x
を環境変数PATHに登録しておくとdocker
でコマンド実行できるようになるので便利です。
私は環境変数を変更するのは避けたかったのでしませんでしたが、通常は登録するのがいいと思います。
アンインストールをする場合の操作
C:\ProgramData\docker
はシンボリックリンクでシステムに強く結びつくため、単純にDeleteボタンを押下すれば削除できるというわけではありません。
削除する場合は、Docker Engineサービスを停止し、先刻作成したuninstall.batを実行してください。
次に「Windowsの機能」から「コンテナー」を無効化し再起動。その後、下記コードを参考にPowershellを管理者実行することで、C:\ProgramData\Docker
を削除できます。
#take ownership of docker files
if (Test-Path "C:\ProgramData\Docker") { takeown.exe /F "C:\ProgramData\Docker" /R /A /D Y }
if (Test-Path "C:\ProgramData\Docker") { icacls "C:\ProgramData\Docker\" /T /C /grant Administrators:F }
#invoke cmd to delete docker files
cmd /c rmdir /s /q "C:\ProgramData\Docker"
C:\ProgramData\docker
はDocker Engineサービスを起動した段階で生成されます。
クリーンな状態でインストールをし直したい場合は、試してみるのもいいでしょう。
続編
参考資料
DockerDesktopやWSLでの方法なども含めて調査をしていたので今回は多め。https://hub.docker.com//microsoft-powershell https://hub.docker.com//microsoft-windows-server
Discussion