Docker Desktop を使わずに、Windows 10 に Docker のバイナリを直接インストールして、Windows コンテナを動かすまでをやってみました。
やり方は以下のドキュメントに記載されていました。
記載の通り、これで動かせるようになるのは Windows コンテナのみで、Linux コンテナは動かせません。
Windows 上で Linux コンテナを動かしたい場合は、WSL を使う方法などがあります。
環境
- Windows 10 Pro
Windows の機能の有効化
コントロールパネルの [Windows の機能の有効化または無効化] より、コンテナ
にチェックを入れます。
これにチェックが入っていないと Docker コンテナが動きませんでした。
また、Hyper-V の有効化が必要という記事も見かけましたが、私の環境では Hyper-V を有効化しなくても動きました。
Hyper-V については以下を参照してください。
インストール方法
バイナリのダウンロード
以下からインストールしたい Docker のバージョンのバイナリファイルをダウンロードします。
現時点で最新の 24.0.7 をダウンロードしました。
ProgramFiles への展開
ダウンロードした zip を ProgramFiles に展開するため、PowerShell を管理者で起動して以下を実行します。
> Expand-Archive <ダウンロードした zip へのパス> -DestinationPath $Env:ProgramFiles
$Env:ProgramFiles
は環境変数 ProgramFiles
を表示しており、通常は C:\Program Files
というパスになります。
以降のコマンドは全て PowerShell で実行します。
サービスへの登録
Docker をサービスへ登録します。
> &$Env:ProgramFiles\Docker\dockerd --register-service
&
は、PowerShell においてコマンドやスクリプトを呼び出す演算子です。
従って、環境変数展開後の C:\ProgramFiles\Docker\dockerd
という文字列をコマンドとして実行しています。
サービスの開始
> Start-Service docker
動作確認
Hello World イメージを動かしてみます。
> &$Env:ProgramFiles\Docker\docker run hello-world:nanoserver
基本的にはこれで上手くいくはずですが、プロキシ環境下の場合は、後述するプロキシ設定が必要になります。
環境変数へパスを通す
毎回 &$Env:ProgramFiles\Docker\docker
と打つのは面倒なため、$env:ProgramFiles\docker\
をPATHに追加します。
> [Environment]::SetEnvironmentVariable("Path", $env:Path + ";$env:ProgramFiles\docker\", [EnvironmentVariableTarget]::Machine)
PowerShell を一度閉じて、再度開きます。
これで以下のように docker
と打つだけで実行できるようになります。
> docker run hello-world:nanoserver
プロキシ設定
プロキシ環境下では、プロキシサーバーの設定を行っていないと Docker イメージを pull できません。
設定方法については以下に記載がありました。
環境変数 HTTP_PROXY
HTTPS_PROXY
を設定します。
> [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://<IP address>:<port>", [EnvironmentVariableTarget]::Machine)
設定後、Docker サービスを再起動します。
> Restart-Service docker
docker クライアントのプロキシ設定
Linux では ~/.docker/config.json
に設定しますが、Windows では %USERPROFILE%\.docker\config.json
に設定します。
以下のように設定しておくことで、Dockerfile のビルドを行う際に --build-args
などで都度プロキシの設定を行う必要がなくなります。
{
"proxies": {
"default": {
"httpProxy": "http://<IPアドレス>:<port>",
"httpsProxy": "http://<IPアドレス>:<port>",
"noProxy": "localhost,127.0.0.1,host.docker.internal"
}
}
}
もしかしたら、一度 Docker サービスを再起動する必要があるかもしれません。
エラーが発生した場合
次のようなエラーが発生した場合、Docker サービスが起動していないか、プロキシにより通信が通っていないかのどちらか可能性が高いです。
Unable to find image 'hello-world:nanoserver' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'
また、次のようなエラーが発生した場合、[Windows の機能の有効化または無効化] で コンテナ
にチェックが入っていない可能性があります。
docker: Error response from daemon: hcs::CreateComputeSystem d5ccfe373c27d9053c87689f60075aed9acdca360d6cd42e1abdc5591bb60cbc: The request is not supported.
アンインストール
サービスから Docker を削除します。
> &$Env:ProgramFiles\Docker\dockerd --unregister-service
これだけではまだ完全にサービスは削除されていないので、一度 OS を再起動します。
その後、docker のフォルダを削除します。
> Remove-item -Recurse $Env:ProgramFiles\Docker
アップデート
現在のバージョンをアンインストールし、新しいバージョンをインストールします。
余談:他の Windows コンテナを動かしてみた
python3.11 の Windows コンテナを動かしてみました。
python イメージのタグ一覧が以下です。
Windows コンテナをベースとしている python3.11 のイメージとして以下の2つがあります。
- 3.11-windowsservercore-ltsc2022
- 3.11-windowsservercore-1809
私の PC では、3.11-windowsservercore-ltsc2022
は動かず、3.11-windowsservercore-1809
は動きました。
ベースとしている Windows コンテナの詳細は以下で確認できます。
参考 URL
- https://www.ulvaniac.co.jp/2023/09/06/docker-desktop%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84windows%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E5%8B%95%E4%BD%9C%E6%96%B9%E6%B3%95/
- https://and-engineer.com/articles/YcGZxhYAACUAbPjg
- https://qiita.com/SGTY/items/1126e0b95c35843fd8c5
- https://blog.shibata.tech/entry/2016/08/05/233212
- https://learn.microsoft.com/ja-jp/virtualization/windowscontainers/manage-docker/configure-docker-daemon