Docker Desktopを使わずにWindowsでDocker
2022年07月25日 月曜日
CONTENTS
こんにちは、九州支社技術部(九州・中四国事業部)所属のy-morimotoです。
WindowsでDockerを使いたい時、多くの方はDocker Desktopを使われていると思いますが、実は他にもWindowsでDockerを使う方法があります。
以前紹介させて頂いた「ブラウザだけでDockerしたい」といった方法もありますが、今回は「PCに直接インストールする」方法のご紹介です。
1.どうやるの?
単純ですが「WSL2のUbuntuでDockerを動かす」です。
意外と盲点だったりするので、簡単に導入手順をまとめてみました。
2.導入手順
導入手順は以下のとおりです。
- WindowsTerminalをインストール
WindowsでTerminalを使う場合はこれが無難です。
https://aka.ms/terminal
(必須ではないので、既に愛用しているターミナルがあれば、そちらをご利用ください) - 仮想化支援機能の有効化
WSL2の利用にはCPUの仮想化支援機能が必要です。
(これが必要なのはDocker Desktopと変わりません)
タスクマネージャのパフォーマンスタブで確認できます。
「有効」になっていない場合は、UEFIの設定変更が必要です。
管理者権限で開いたコマンドプロンプトで、以下のコマンドを実行するとWindowsが再起動され、UEFIの画面を開く事ができます。shutdown /r /fw
UEFIの画面では「Intel VT-x/VT-d」や「AMD AMD-V/SVM」のような項目があると思いますので、Enableに変更しSave & Exitします。
(設定画面はメーカーによって多種多様なので、「仮想化支援 有効化 メーカー名orPC名」あたりで検索すると答えを見つけられると思います) - WSL2でUbuntuをインストール
仮想化支援機能の準備が完了したら、Windows Terminalを管理者として開きます。
(インストール直後であれば、「最近追加されたもの」に表示されます)
(ついでに「タスクバーにピン留めする」しておくと、後々便利です)
Windows Terminalを開いたら、
1. WSL2のアップデート
2. Ubuntuのインストール
3. 再起動 (再起動を要求するメッセージが表示された場合)
を行います、コマンドは以下の通りです。wsl --update wsl --install -d Ubuntu shutdown /r
Windows 再起動後、Ubuntuのインストールが始まるのでしばらく待ち、ユーザ名とパスワードを求められるので入力します。
(ユーザ名とパスワードはWindowsとは別物です。同じ物を設定する事もできます)
Ubuntuのターミナルが表示されたら設定終わりです。「exit」します。 - Dockerのインストール
WSL2の準備とUbuntuのインストールが終わったら、Dockerのインストールです。
Windows Teminalを開き、Ubuntuという項目が増えているので、そちらを開きます。
Ubuntuが上手く開かない場合は以下のコマンドで起動します。wsl -d Ubuntu
Ubuntuが起動したら、公式の手順でインストールを進めます。
sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list sudo apt update sudo apt install -y docker-ce docker-compose-plugin
(ついでにdocker-compose-pluginもインストールする手順になってます。docker compose便利です。)
(環境によってはproxyの設定が必要です。ホストのWindowsでNATされて外に出て行きますが、proxyの設定は引き継がれません) - Dockerの起動とコンテナの実行
以下のコマンドでDockerが起動します。sudo service docker start
ここまで来たら実行環境の準備は完了です。
hello-worldコンテナも動かせるようになっていると思います。sudo docker run hello-world
あとはお好みでdockerコマンドを使いたいアカウントを、dockerグループに追加しておきましょう。
sudo usermod -aG docker (ユーザ名)
(ログイン済みユーザへのグループ変更は反映されない為、その場合は再ログインすると良いです。)
3.おまけ
インストール後のちょっとしたおまけです。
- Dockerの自動起動
Windowsのスタートアップに以下内容のbatファイル(wsl-service-start.bat等で)を置いておくと、Windowsログイン時に自動でDockerサービスが起動されます。@echo off wsl -u root -- service docker start
(スタートアップフォルダは「Windows+E」で、アドレスバーに「shell:startup」で開けます)
- Windows TerminalのメニューからUbuntu起動できない場合の設定見直し
メニューにあっても起動できない場合は、以下を参考に、設定からプロファイルを更新してください。
(y-morimotoの環境で起動確認できているプロファイルです) - Visual Studio Codeで編集
Dockerとは関係ありませんが、「code (ファイル名)」 や 「code .」で、WSL2 Ubuntuのファイルやディレクトリを、Visual Studio Codeで開く事ができます。 - Docker bridge networkのIPアドレス帯変更
デフォルトで作成されるDocker bridge network (docker0)が、WSL2やLANのIPアドレス帯と重複するケースがあります。
そうなると、コンテナから該当のIPアドレス帯に通信できない為、設定変更が必要です。
(WSL2環境では変更推奨です。WSL2とDockerはどちらも「172.16.0.0~172.31.255.255」を使うので重複しやすいです)
「/etc/docker/daemon.json」設定ファイル(なければ新規作成する)を置く事で、IPアドレス帯を変更する事ができます。
以下がdaemon.jsonの設定例です。(この場合、192.168.128.0/24のネットワークとなり、192.168.128.254 がgw になります){ "bip": "192.168.128.254/24", "fixed-cidr": "192.168.128.0/24" }
ファイルを設置した後は「sudo service docker restart」でDockerを再起動する事で反映されます。
- コンテナのproxyの設定
Windows環境のproxy設定がUbuntuには引き継がれない件ですが、コンテナにも引き継がれません。
こちらは、コンテナのENVにhttp_proxy等を設定する方法がありますが、「~/.docker/config.json」に設定しておくと自動設定されるので、runやbuildの際に楽です。
以下がconfig.jsonの設定例です。(proxy.your.domainにはお使いのproxyサーバ名またはIPアドレスを設定してください){ "proxies": { "default": { "httpProxy": "http://proxy.your.domain:8080", "httpsProxy": "http://proxy.your.domain:8080" } } }
4.今更感はありますが
といったところで、今更感ある内容ではありますが、もし参考になれば幸いです。