Docker Desktopを使わずにWindowsでDocker

2022年07月25日 月曜日


【この記事を書いた人】
y-morimoto

九州支社技術部(九州・中四国事業部)所属。自作パソコン好きで、ハードウェア選定の仕事を与えると喜ぶ。最近は何でもコンテナにしたい教に入信し、コンテナ化の機会を虎視眈々と狙っている。

「Docker Desktopを使わずにWindowsでDocker」のイメージ
2023/01/31 追記

Windows11での設定方法を公開しました。

Windows11でDocker Desktopを使わずにDocker

 

こんにちは、九州支社技術部(九州・中四国事業部)所属のy-morimotoです。

WindowsでDockerを使いたい時、多くの方はDocker Desktopを使われていると思いますが、実は他にもWindowsでDockerを使う方法があります。
以前紹介させて頂いた「ブラウザだけでDockerしたい」といった方法もありますが、今回は「PCに直接インストールする」方法のご紹介です。

1.どうやるの?

単純ですが「WSL2のUbuntuでDockerを動かす」です。
意外と盲点だったりするので、簡単に導入手順をまとめてみました。

2.導入手順

導入手順は以下のとおりです。

  1. WindowsTerminalをインストール
    WindowsでTerminalを使う場合はこれが無難です。
    https://aka.ms/terminal
    (必須ではないので、既に愛用しているターミナルがあれば、そちらをご利用ください)
  2. 仮想化支援機能の有効化
    WSL2の利用にはCPUの仮想化支援機能が必要です。
    (これが必要なのはDocker Desktopと変わりません)
    タスクマネージャのパフォーマンスタブで確認できます。

    「有効」になっていない場合は、UEFIの設定変更が必要です。
    管理者権限で開いたコマンドプロンプトで、以下のコマンドを実行するとWindowsが再起動され、UEFIの画面を開く事ができます。

    shutdown /r /fw

    UEFIの画面では「Intel VT-x/VT-d」や「AMD AMD-V/SVM」のような項目があると思いますので、Enableに変更しSave & Exitします。
    (設定画面はメーカーによって多種多様なので、「仮想化支援 有効化 メーカー名orPC名」あたりで検索すると答えを見つけられると思います)

  3. WSL2でUbuntuをインストール
    仮想化支援機能の準備が完了したら、Windows Terminalを管理者として開きます。

    (インストール直後であれば、「最近追加されたもの」に表示されます)
    (ついでに「タスクバーにピン留めする」しておくと、後々便利です)
    Windows Terminalを開いたら、
    1. WSL2のアップデート
    2. Ubuntuのインストール
    3. 再起動 (再起動を要求するメッセージが表示された場合)
    を行います、コマンドは以下の通りです。

    wsl --update
    wsl --install -d Ubuntu
    shutdown /r

    Windows 再起動後、Ubuntuのインストールが始まるのでしばらく待ち、ユーザ名とパスワードを求められるので入力します。

    (ユーザ名とパスワードはWindowsとは別物です。同じ物を設定する事もできます)
    Ubuntuのターミナルが表示されたら設定終わりです。「exit」します。

  4. 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の設定は引き継がれません)

  5. Dockerの起動とコンテナの実行
    以下のコマンドでDockerが起動します。

    sudo service docker start

    ここまで来たら実行環境の準備は完了です。
    hello-worldコンテナも動かせるようになっていると思います。

    sudo docker run hello-world

    あとはお好みでdockerコマンドを使いたいアカウントを、dockerグループに追加しておきましょう。

    sudo usermod -aG docker (ユーザ名)

    (ログイン済みユーザへのグループ変更は反映されない為、その場合は再ログインすると良いです。)

3.おまけ

インストール後のちょっとしたおまけです。

  1. Dockerの自動起動
    Windowsのスタートアップに以下内容のbatファイル(wsl-service-start.bat等で)を置いておくと、Windowsログイン時に自動でDockerサービスが起動されます。

    @echo off
    wsl -u root -- service docker start

    (スタートアップフォルダは「Windows+E」で、アドレスバーに「shell:startup」で開けます)

  2. Windows TerminalのメニューからUbuntu起動できない場合の設定見直し
    メニューにあっても起動できない場合は、以下を参考に、設定からプロファイルを更新してください。

    (y-morimotoの環境で起動確認できているプロファイルです)
  3. Visual Studio Codeで編集
    Dockerとは関係ありませんが、「code (ファイル名)」 や 「code .」で、WSL2 Ubuntuのファイルやディレクトリを、Visual Studio Codeで開く事ができます。
  4. 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を再起動する事で反映されます。

  5. コンテナの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.今更感はありますが

といったところで、今更感ある内容ではありますが、もし参考になれば幸いです。

y-morimoto

2022年07月25日 月曜日

九州支社技術部(九州・中四国事業部)所属。自作パソコン好きで、ハードウェア選定の仕事を与えると喜ぶ。最近は何でもコンテナにしたい教に入信し、コンテナ化の機会を虎視眈々と狙っている。

Related
関連記事