WindowsでDockerコンテナを自動起動させる

公開日:2025年11月04日
最終更新日:2025年11月04日
レベル:★★★☆☆
Windows11 上でDockerを動かし、Dockerコンテナを自動起動させてサーバ運用させてみた方法をご紹介します。

Windows11 上でDockerを動かし、Dockerコンテナを自動起動させてサーバ運用させてみたログです。

Windows上でDockerを動かすためにはWSL(Windows Subsystem for Linux)を導入する必要がありますので、WSLの導入も行っていきます。
Dockerの導入は、「Docker Desktop」を利用するのが簡単ですが、サーバとして自動起動させたいこと、商用として利用したいことのため、今回はWSLで導入するLinux(Ubuntu)のパッケージのDockerを利用することにします。

なお、今回の設定に使用するWindowsは「Windows11 24H2」を前提とします。

事前準備

デスクトップ下側にあるタスクバーを右クリックしてタスクマネージャを開き、「パフォーマンス」タブの「仮想化」が「有効」になっていることを確認します。

Windowsの機能の有効化

Windowsタスクバーの「検索」に「機能」と入力し、「Windowsの機能の有効化または無効化」を開き、「Virtual Machine Platform」にチェックを入れて有効化します。

以前のWindows11のバージョンの場合、「仮想マシン プラットフォーム」という表記になっています。

[OK]をクリックすると再起動を要求してくるので再起動します。

Hyper-VやWindowsハイパーバイザー プラットフォーム は特にインストールしなくてもよさそうです。

WSL & Ubuntu のインストール

WSLのインストール

Windows11にWSL(Windows Subsystem for Linux)を導入する環境が整いましたので、以降よりWSL本体とLinuxをインストールしていきます。

Windoiwsマーク -> すべてのアプリ -> Windowsツール -> Windows PowerShell を開いて次のコマンドを入力します。

wsl --install

特に指定をしなければLinuxディストリビューションは「Ubuntu」がインストールされます。

途中ユーザーアカウント制御のウィンドウが開くので[はい] をクリックします。

しばらくすると次のようなウィンドウが表示されます。

Windows Power Shellのウィンドウに次のようなメッセージが表示されます。

これはLinux用のユーザを作成する設定です。ユーザ名の初期値として、現在Windowsにログインしているユーザ名がセットされています。

 :
Create a default Unix user account: user

ユーザ名がこれで良ければ、[Enter]キーを押しUNIXユーザを作成します。

次にパスワードの入力を促してきますので、パスワード(Windowsログインユーザと同じパスワードのほうが良い)を入力します。

これでWSLとLinuxのインストールは完了です。

念のため再起動します。

Ubuntuの起動確認

再起動後、次のどちらかの方法でUbuntuコンソールを表示させます。

方法1. Windowsボタン -> すべてのアプリ -> Ubuntu

方法2. Windows Power Shell を起動し、上部の「v」をクリックしてプルダウンメニューを表示し、「Ubuntu」を選択する。(またはCtrl + Shft + 4 )

WindowsからWSLディレクトリへのアクセス

WSLの物理的な場所は、WSL(Linuxディストリビューション?)のバージョンによって過去様々な場所に変更されています。今後もバージョンアップによって物理的な場所が変更される可能性があります。
よって、WindowsからWSLのディレクトリにアクセスするためには、エクスプローラのアドレスバーに次のように入力してアクセスします。

¥¥wsl$

または、エクスプローラを開き、左側ペインの下部にある「Linux」アイコンをクリックしてアクセスします。

WSL(Linux)からWindowsのフォルダへのアクセス

WSLからWindowsのフォルダへアクセスするには、Linuxターミナルを開き

$ ls /mnt/c/

とすると、WindowsのCドライブを参照できます。

$ ls /mnt/c/Users/ユーザ名/

とすると、C:¥Users¥ユーザ名 フォルダを参照できます。

Dockerのインストール

以上でWindows11上でLinuxを動作させる環境が整いました。
以降より、Windows11のLinux(WSL)でDockerを動かすための設定を行います。

Dockerリポジトリのインストール

2025年10月現在、WSLのUbuntuには標準でDockerパッケージをインストールできる環境がありません。
以下のコマンドを入力することによって、 WSLのUbuntuにDockerのパッケージをインストールするための事前設定(リポジトリのインストール)を行います。

$ sudo apt update
  :
メッセージが表示されます
  :
$ sudo apt install ca-certificates curl
  :
メッセージが表示されます
  :
$ sudo install -m 0755 -d /etc/apt/keyrings

$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

$ sudo chmod a+r /etc/apt/keyrings/docker.asc

次のコマンドを入力します(ちょっと長いです)。

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

これにより/etc/apt/sources.list.d/ ディレクトリに「docker.list」というファイルができています。

less /etc/apt/sources.list.d/docker.list

としてdocker.list ファイルの中身を参照すると次のようになっています。

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu   jammy stable

再度apt update を実行します。dockerが反映されていることが確認できます。

$ sudo apt update
Get:1 https://download.docker.com/linux/ubuntu noble InRelease [48.8 kB]
Get:2 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages [29.3 kB]
Hit:3 http://security.ubuntu.com/ubuntu noble-security InRelease
  :
Reading state information... Done
All packages are up to date.

Dockerのインストール

下記コマンドでDockerをインストールします。

$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  :
Need to get 104 MB of archives.
After this operation, 435 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y <--- [Y]を入力
  :
Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /usr/lib/systemd/system/docker.socket.
Processing triggers for man-db (2.12.0-4build2) ...
Processing triggers for libc-bin (2.39-0ubuntu8.5) ...
$

Dockerインストールの確認

下記コマンドでDockerコンテナが正常に動作することを確認します。

$ sudo docker run hello-world <---- 入力

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e6590344b1a5: Pull complete
Digest: sha256:ec153840d1e635ac434fab5e377081f17e0e15afab27beb3f726c3265039cfff
Status: Downloaded newer image for hello-world:latest

Hello from Docker! <--- これが表示されればDockerが正常に起動している
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

docker compose コマンドもインストール済みです。

$ docker compose version
Docker Compose version vx.xx.x

systemd でdockerデーモンが動作し、Linux起動時にdockerデーモンも自動起動されるようになっています。

Windowsを再起動し、WSLターミナルより次のコマンドを入力してdocerサービスが開始されていることを確認します。

$ systemctl -t service
  :
  cron.service              loaded active running Regular background program pro>
  dbus.service              loaded active running D-Bus System Message Bus
  docker.service            loaded active running Docker Application Container E> <--- Dockerが動いている
  getty@tty1.service        loaded active running Getty on tty1
  :

/etc/systemd/system/multi-user.target.wants/ ディレクトリを確認すると、docker.serviceが入っていることが確認できます。

$ ls -l /etc/systemd/system/multi-user.target.wants/
  :
lrwxrwxrwx 1 root root 34 Apr  9 15:13  docker.service -> /lib/systemd/system/docker.service
  :

Docker実行権限の設定

Dockerのインストール直後は、上で作成したUNIXユーザにdockerコマンドを実行する権限が付与されていません

$ docker image ls
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied

$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),116(netdev)

よって下記コマンドで権限を付与します。
「user」の箇所は作成したUNIXユーザの名前に置き換えてください

$ sudo usermod -aG docker user

一旦ログアウト後、再度確認します。
「999(docker)」が追加されていることがわかります。

$ id
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),116(netdev),999(docker)

$ docker image ls <--- dockerコマンドが正常に動作する
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   11 months ago   13.3kB

Docker(WSL)の自動起動

通常WSLをインストールした直後の状態ではWSL(Ubuntu)は自動起動してくれません。WSLのターミナルを起動した時点でWSL(Linux)が起動するようになっています。
通常のターミナルで次のコマンドを入力するとWSLが停止していることがわかります。

C:\Users\user> wsl --list -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         2

一度Ubuntuのウィンドウを開き、

WSLの状態を確認すると、

Ubuntuの状態(STATE)が稼働(Running)になっていることがわかります。

しかし、WSLのターミナルを閉じるとWSL(Linux)もしばらくすると停止してしまいます。

DockerはLinuxのsystemd経由で自動起動するように設定されていることがわかりましたが、Linux自体が起動しない限りDockerも起動しません。
WindowsにDockerを入れてサーバとして利用したい場合、これでは不都合です。

そこで、Windowsの起動時(実際にはユーザログイン時)、WSLを起動させるスクリプトを実行させることによってDockerも起動〜実行するようにしてみます。

以降は一例です。ご自身の環境に応じた方法を採用してください。

WSL起動スクリプトの例

WSLをWindowsのバックグラウンドで起動しっぱなしの状態にしておきたいので、WSFを実行する方式としてみました。
以下、一例です(wsl-startup.wsf)。

<job>
<script language="JScript">
var shell = WScript.CreateObject("WScript.Shell");
shell.Run('"C:\\Program Files\\WSL\\wsl.exe" -d Ubuntu', 0);
</job>

次にネットワーク系の設定です。

WSLより起動したDockerと、そのホストとなるWindowsやネットワーク上の他のPCと通信するためにIPアドレスとポートのマッピングを行う必要があります(WSLはWindowsホストとは違う独立したIPアドレスで動いています)。

次の例では、DockerでWebサーバを稼働させることを想定し、ポート80番(http)と443番(https)をマッピングするWindowsバッチファイルです。

FOR /F "usebackq" %%i in (`wsl -e hostname -I`) do set IP=%%i

netsh interface portproxy delete v4tov4 listenport=443
netsh interface portproxy add v4tov4 listenport=443 connectaddress=%IP% connectport=443

netsh interface portproxy delete v4tov4 listenport=80
netsh interface portproxy add v4tov4 listenport=80 connectaddress=%IP% connectport=80

これを1つのWindowsバッチファイルとして作成し、Windowsスケジュールでユーザのログオン時に起動させます。
以下がWindowsバッチファイルの例です(startwsl.cmd)。

cscript c:\Users\user\tools\wsl2-startup.wsf

FOR /F "usebackq" %%i in (`wsl -e hostname -I`) do set IP=%%i

netsh interface portproxy delete v4tov4 listenport=443
netsh interface portproxy add v4tov4 listenport=443 connectaddress=%IP% connectport=443

netsh interface portproxy delete v4tov4 listenport=80
netsh interface portproxy add v4tov4 listenport=80 connectaddress=%IP% connectport=80

eventcreate /l APPLICATION /T SUCCESS /ID 701 /SO StartWSL /D ExecuteNetsh

  1. 1行目でWSLを起動するWSFを実行します。
  2. 次のFOR文でWSLが持つIPアドレスを取得し、変数%IP%にセットします。
  3. 「netsh」コマンドを使って、一旦当該ポートのIPマッピングを削除した後、WSLのIPアドレスとポートにマッピングします。
  4. 最後に「アプリケーション」ログに「成功」のログをID「701」で書き込みます(IDは何でも良い)。

スケジューラに登録

上で作成したスクリプトを任意の場所に保存し、これをWindowsのタスクスケジューラに登録しておきます。

今回はユーザのホームフォルダ直下に「tools」というフォルダを新規作成し「C:¥Users¥ユーザ名¥tools¥startwsl.cmd」というパスでスクリプトにアクセスできるようにしておきます。

タスクスケジューラには次のような設定で登録します。
ポイントは「全般」タブで「最上位の特権で実行する」を有効にすること(netshコマンドは最上位の特権がないと正常に動作しないため)と、タスクのトリガーを「ログオン時」にすることです。

タスクスケジューラーへの登録が完了したら、一旦PCを再起動し、ログオンしてみます。
タスクスケジューラーが正常に動作すれば、WSLが起動し、同時にDockerも起動して所定のDockerコンテナも自動スタートしていると思います。
また、イベントビューアーにもアプリケーションログにイベントID「701」イベント名「StartWSL」としてログが記録されていると思います。

Windowsをサーバ用途で使用しDockerを稼働させたい場合、本来はログオフした状態でもDockerが動作している状態にしておきたいところなのですが、WSLがログオン状態でないと起動してくれないようなので今回はやむなく常時ログオンした状態で設定しました。
ログオンしていれば画面がスリープした状態でも問題なくWSL, Dockerは稼働を続けるようです。
ログオフした状態の完全にサーバ用途で運用したい場合であれば、Linuxホストにするのが無難かもしれません。
ログオフ状態でWSLを稼働させる方法をご存知なかたはぜひ教えて下さい。

以上で完了です。

ー 以上 ー

 CMSを使ったホームページ制作
 VPS, AWS等クラウドシステム構築
等々のご依頼承っております

Contents