見出し画像

Docker DesktopからRancher Desktopへの移行 ~ 移行で直面した問題と解決策 ~

はじめまして、こんにちは。LaKeel DX Platform Group SRE Team に所属する吉村と申します。普段の業務では、LaKeel DX のインフラの構築と、LaKeel DX 開発者をサポートする「LaKeel Manager」という製品の開発を行っています。

さて、弊社ではもともと Docker 環境の構築に Docker Desktop for Windows を使用していましたが、最近の Docker Desktop の有償化に伴い、Rancher Desktop への移行を行いました。
しかし、正直なところ、Rancher Desktop への移行はとても大変でした。そこで、今回はその移行の道のりを皆さんにご紹介していきたいと思いますので、気軽にお付き合いください!

Docker Desktop と Rancher Desktop の比較

移行の話をする前に、まずは、Docker Desktop と Rancher Desktop の違いを確認してみましょう。

Docker Desktop と Rancher Desktop の比較表

上表でみると、Docker Desktop で利用できる機能は、Rancher Desktop でも利用できます。さらに、Rancher Desktop では、Containerd をコンテナランタイムとして選択することができます。これは、Kubernetes 1.24 以降、Dockerd のサポートが終了し、Containerd が主流のコンテナランタイムとなっていることから、Rancher Desktop へ移行する大きな動機付けとなりますね。
ただ、Rancher Desktop だと、GUI からのイメージやコンテナの管理が行えません。Portainer などのコンテナ管理 GUI の OSS を使用することもできますが、Rancher Desktop への移行を機に docker/nerdctl コマンドを覚えてみるのも良いかもしれません。

Rancher Desktop への移行

弊社の開発環境は、以下の通りです。

  • OS: Windows 10

  • セキュリティ対策ソフトウェア: SEP (Symantec Endpoint Protection)

OS は、Windows 10 を利用しており、セキュリティ対策として、SEP を導入しています。このソフトウェアは、マルウェアやウイルスなどの脅威からシステムを保護するために全社的に導入されています。

さて、この開発環境で、Rancher Desktop を利用することになった訳ですが、幾つかの問題点に突き当たりました。。。

  1. WSL2 のインストールの必要性

  2. SEP によるネットワークの遮断

  3. Windows ホストと WSL2 のポートフォワーディングの不具合

それぞれ、問題の詳細と解決策を見ていきましょう!

問題点1 : WSL2 のインストールの必要性

Rancher Desktop は、Linux ベースのコンポーネントを使用しており、Linux カーネル上でなければ動作できません。そこで、Windows を OS として使用している場合には、WSL2 (Windows Subsystem for Linux 2)という Linux の仮想化環境が必要となります。WSL2 の仮想化は、Microsoft の Hyper-V によって実現されおり、設定については、仮想マシン関係の「Windowsの機能」の記事が参考になると思います。

以下は、Windows10 に、WSL2 をインストールするコマンドです。
ちなみに弊社では、Ubuntu 20.04 のディストリビューションを使用しています。(デフォルトシェル bash)

# WSL のデフォルトバージョンを 2 に設定
> wsl --set-default-version 2
# オンラインに存在するインストール可能な Linux のディストリビューションの表示
> wsl --list --online
# 任意のディストリビューションのインストール
> wsl --install --distribution ${DistributionName}

上記のコマンドを実行すると、Ubuntu ディストリビューションの WSL2 が自動で起動し、任意のユーザー名とパスワードを設定することで、Windows で Linux 環境を扱えるようになります。

問題点2 :  SEP によるネットワークの遮断

WSL2 で利用される仮想ネットワークは通常のネットワークとは異なる振る舞いをする場合があります。したがって誤検知を避けるためにセキュリティソフトである SEP が Windows ホスト以外との TCP/UDP 通信を遮断するため、インターネットへのアクセスが制限されていました。これでは、公式イメージを取得したり、コンテナにコマンドをインストールすることすらできません。

当初の SEP によりインターネット通信が制限されたネットワークの図
インターネットへの通信に失敗

これは SEP の F/W ルールを変更することで、通信を許可することでも解消できますが、弊社のセキュリティポリシーでは端末側での設定変更が許可されておらず、別の解決策をとる必要がありました。
そのため、 Windows ホストに Apache のプロキシサーバーを設置し、WSL2 とコンテナの通信をプロキシサーバーを経由させることにしました。

プロキシサーバーを経由したネットワークの図

プロキシの設定について見ていきましょう。WSL2 とコンテナのプロキシ設定は、それぞれ "/etc/apt/apt.conf" と "~/.docker/config.json" というファイルに記述されます。

# /etc/apt/apt.conf
Acquire::http::proxy "http://${Hyper-VのIPアドレス}:${プロキシサーバーのポート番号}";
Acquire::https::proxy "http://${Hyper-VのIPアドレス}:${プロキシサーバーのポート番号}";
# ~/.docker/config.json
{
  "proxies":
        {
                "default":
                {
                        "httpProxy": "http://${Hyper-VのIPアドレス}:${プロキシサーバーのポート番号}",
                        "httpsProxy": "http://${Hyper-VのIPアドレス}:${プロキシサーバーのポート番号}"
                }
        }
}

上記の設定により、WSL2 とコンテナからの通信が Windows ホストに立てたプロキシサーバーを経由するようになります。その結果、インターネットへのアクセスに成功することが確認できました!

インターネットへの通信に成功

ただ、これでは問題があります。 Hyper-V の IP アドレスは、PC の起動時に設定されるため、設定ファイルにハードコードしてしまうと、PC を再起動した時に IP アドレスが更新されず、結果としてプロキシサーバーにアクセスできなくなってしまいます。そのため、プロキシの設定は設定ファイルに直接書き込むのではなく、WSL2 起動時に設定されるように、"~/.bashrc" に以下の記述を追記します。

# /etc/apt/apt.conf 更新用
tee /etc/apt/apt.conf << EOF >/dev/null
Acquire::http::proxy "http://$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):${プロキシサーバーのポート番号}";
Acquire::https::proxy "http://$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):${プロキシサーバーのポート番号}";
EOF

# ~/.docker/config.json 更新用
tee ~/.docker/config.json << EOF >/dev/null
{
  "proxies":
        {
                "default":
                {
                        "httpProxy": "http://$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):${プロキシサーバーのポート番号}",
                        "httpsProxy": "http://$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):${プロキシサーバーのポート番号}",
                }
        }
}
EOF

上記の記述では、"/etc/resolv.conf" から Hyper-V の IP アドレスを取得し、動的に先ほどの設定ファイルにプロキシの設定をします。
${プロキシのポート番号} の部分には、実際のプロキシサーバーのポート番号を記述します。これにより、WSL2 の起動時に自動的にプロキシの設定が反映されるようになります。

これでようやく PC を再起動しても WSL2 と コンテナからインターネットにアクセスできるようになりました!

問題点3 : Windows ホストと WSL2 のポートフォワーディングの不具合

「ついにコンテナが使えるようになった!」と思ったのもつかの間、次はRancher Desktopで立ち上げたコンテナに Windows ホストからアクセスできないことがしばしばありました。これは、Windows ホストと WSL2 の間でネットワークトラフィックを転送するために、Windows ホストのポートと WSL2 のポートをマッピングするポートフォワーディングがうまく機能しない場合があることが原因でした。

そこで、WSLHostPatcher という OSS の、Windows ホストのポートと WSL2 のポートのマッピングを正常に行うユーティリティを使用することでこの問題を解決しました。
設定方法は簡単で、WSLHostPatcherの Github ページから zip ファイルをダウンロードして zip ファイルを展開した後、WSL2 起動時に毎回 WSLHostPatcher が実行されるように、"~/.bashrc" に以下の記述を追記するだけです。

/:path/:to/WSLHostPatcher.exe

この設定を行うだけで、Windows ホストのポートと WSL2 内のポートのマッピングが正常に行われ、Windows ホストからコンテナにアクセスできるようになりました!

おわりに

本記事では、弊社が Docker Desktop から Rancher Desktop への移行を行った際に直面した問題点と解決策について紹介しました。今回は、プロキシサーバーの立て方や Rancher Desktop 自体の設定については省略してしまいましたが、別の機会にそれらの内容についても詳しく取り上げたいと考えています。

Rancher Desktop への移行は場合によっては多少の困難が伴うかもしれませんが、その後の利用においては無償で柔軟な環境を得ることができます。本記事が、Rancher Desktop を検討されている方のスムーズな移行の役に立てれば幸いです。最後までお付き合いいただきありがとうございました!

参考リンク


みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!