プログラミングソフトは常に進化しています。同じ言語での開発でも、常に開発環境が更新されます。環境が良くなることは望ましいことですが、細かいルール変更により、以前に書いたコードではプログラムが作れなくなることもあります。
その都度、コードを書き直すことが理想ですが、セキュリティなどを重視しない自分だけが使うプログラムを毎回アップデートしていくのは効率がよくありません。
そのような場合、古い環境と新しい環境を共存させたくなります。
また、試しに新しい環境を構築して、不要になったら破棄したいという要求も出てきます。
ただ、Windowsは、ソフトウェアのインストールやアンインストールを繰り返すと動作が不安定になりがちです。
そのため、できる限り、自分のパソコンに影響を与えずに、開発環境の構築と破棄が可能な環境がほしくなります。
それが、今回オススメの
「wsl2 + Docker」で作る仮想環境です。
「wsl2」とは、「Windows Subsystem for Linux 2」の略称で、windows10や11の中に仮想的なLinux環境を作るための、windowsの機能です。
近年、徐々にバージョンアップを繰り返し、windows11に搭載されているwsl2はかなり高機能になりました。
「Docker」はDocker社が開発している仮想環境を構築するためのソフトウェアです。

Docker をwindows環境で使うなら2種類の選択肢があります。
「Docker desktop」をwindowsにインストールするか、

wsl2にUbuntuなどのLinuxを手動でインストールし、そのLinuxの中にDockerをインストールするか、

です。どちらがよいのかは難しい問題です…
「Docker desktop」は最近、一部が有料化しました。収益性から、今後は「Docker desktop」の開発が優先されていく可能性があります。つまり、将来性があるかもしれません。また、インストールは比較的簡単で、環境構築に必要な時間は短くて済むように思います。
一方で、Linuxをwsl2で構築することは、将来、開発環境を拡大するときの練習になります。大規模プログラムの開発は、計算を担う大型のコンピューターと、それを操作するコンピューターの2台(以上)の体制で行うことがあります。そのシステム構成に近い環境を作る練習ができます。
ちなみに、どちらの選択をしても、不具合がおきる可能性はあります。wsl2もDockerもバージョンの更新が早いソフトウェアです。そのため、アップデートにより動作が不安定になることがあります。その場合、再構築が必要になります。ただし、windows自体の再インストールは可能な限り避けたいです。windowsを長く使っていると、大切なソフトウェアやデータがたくさんインストールされることになります。開発環境の更新の度に、それらもすべて再インストールするのは大変な労力を必要とします。「Linuxをインストールして、その中にDockerを入れる」場合、windowsには直接、開発関係のソフトウェアをインストールしません。つまり、汚しません。windows環境を壊しにくいという意味で、wsl2にLinuxをインストールする方法を今回のオススメとします。
では、wsl2にLinuxをインストールします。
まずは「wsl2」を有効にする必要があります。
windows11のパソコンでは、初めから有効になっていることが多いように思うのですが、どうでしょう。とりあえず、Microsoft Storeから「Ubuntu 20.04.4 LTS」をインストールしてみます。(2022年3月の話です。一般に、新しいバージョンがあれば、それをインストールする方がよいです。)

無事にインストールできましたら、「Ubuntu 20.04.4 LTS」を「スタートメニュー」起動します。(インストールできないようでしたら、以下のリンクを参照してください。)


Linux(今回はUbuntu)で、Dockerをインストールします。以下の公式情報に従います。

まずは、アプリケーションのデータベースを更新します。新しいアプリケーションをインストールする前のおまじないのようなものです。
sudo apt-get update

sudo apt-get install ca-certificates curl gnupg lsb-release

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

ここで、Docker本体をインストールします。
sudo apt-get install docker-ce docker-ce-cli containerd.io

インストールが完了しました。Dockerを起動します。
sudo dockerd

この入力に使っていたウインドウは、Dockerのlogの表示に使用しますので、新しいUbuntuを起動します。
次にDocker上で動く、新しいOSをインストールします。
つまり、windowsと並列でUbuntuが動いていて、
そのUbuntuの中でDockerが動いていて、
そのDockerの中にまたUbuntuをインストールします。
…多階層の入れ子になっています。
複数の入れ子構造になっているので、新しい環境を作成したくなったときには、不要になったところから削除できます。可能な限りwindowsを再インストールしたくないので、windowsは汚さないようにしています。
Dockerに乗せるUbuntuですが、以下のものはいかがでしょうか。
以下のコマンドで、上記のイメージが起動します。ただし、初回起動時はイメージファイルをダウンロードするので、通信量とSSDやHDDの圧迫に注意してください。
sudo docker run -it -p 8888:8888 jupyter/scipy-notebook

これでインストールは終わりです。途中で上手くいかなくなった場合は、windowsを「再起動」するとエラーが消える可能性があります。
備考:
docker run コマンドは初回だけ使用します。
run コマンドを多用すると、どんどんOSのコピーが増えてしまいます。
そのため、2度目の起動では、start と exec の2つのコマンドを使用します。
まずは、
sudo docker ps -a
と入力し、コンテナの状況を確認します。使用したいコンテナが「Exited」になっている場合、眠っているコンテナを起こします。
sudo docker start コンテナID
コンテナID (CONTAINER ID)は ps のリストに記載されています。
目的のコンテナが起動したら、そのコンテナ内に入ります。
sudo docker exec -it -u root コンテナID bin/bash

これで無事に以前つくったOSのコンテナに潜り込むことができます。

コメント