WSL 2(Windows Subsystem for Linux 2)とDocker DesktopとDockerと

f:id:ts0818:20220130202053j:plain

forest.watch.impress.co.jp

 米Dockerは1月24日(現地時間)、「Docker Desktop 4.4.4」を公開した。脆弱性を修正したセキュリティアップデートとなっている。

「Docker Desktop」にシステム上の任意ファイルを移動できてしまう脆弱性 - 窓の杜

 本バージョンで修正された問題は、1件。システム上の任意ファイルを移動できてしまう脆弱性(CVE-2022-23774)が対処された。そのほかにも、「Docker Desktop 4.4.3」へアップデートするとWSL 2環境で「docker login」コマンドが機能しない問題が解決されている。

「Docker Desktop」にシステム上の任意ファイルを移動できてしまう脆弱性 - 窓の杜

⇧ う~む、脆弱性とな?自分の環境では確か、「Docker Desktop」をインストールしていたような...

stackoverflow.com

⇧ 上記サイト様が参考にバージョン確認してみました。

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | select DisplayName,DisplayVersion | where {$_.DisplayName -like "Docker*"}  

f:id:ts0818:20220130195346p:plain

⇧ これは...、本当かいな?

GUIで確認してみることに。

f:id:ts0818:20220130200012p:plain

f:id:ts0818:20220130200038p:plain

⇧ 本当でした...

とりあえず、アップデートしときます。「Download update...」を選択。

f:id:ts0818:20220130200227p:plain

「Download update」ボタンを押下。

f:id:ts0818:20220130200321p:plain

「Update and restart」を選択で。

f:id:ts0818:20220130200547p:plain

しばし時間がかかりますが、ダイアログが表示されたら、「I accept the terms」にチェックで「Accept」ボタンを押下。

f:id:ts0818:20220130201328p:plain

バージョンアップされたようです。

f:id:ts0818:20220130201720p:plain

というわけで、「Docker Desktop」などについての話とかです。

レッツトライ~。

Docker Desktopの有料化の条件がなかなか世知辛い...

去年(2021年)にアナウンスはあったけども、

www.publickey1.jp

Docker Desktopは個人利用など下記の条件では引き続き無料で利用可能。

Docker Desktop remains free for small businesses (fewer than 250 employees AND less than $10 million in annual revenue), personal use, education, and non-commercial open source projects.

Docker Desktopは、スモールビジネス(従業員数250名未満かつ年間売上高1000万ドル未満(訳注:1ドル110円換算で11億円))、個人利用、教育機関、非商用のオープンソースプロジェクトであれば、引き続き無料でご利用いただけます。

つまり250名以上もしくは11億円以上の企業でDocker Desktopを利用する場合には、有料となります。

Docker Desktopが有料化へ、ただし250人未満かつ年間売り上げ1000万ドル(約11億円)未満の組織や個人やオープンソースプロジェクトでは引き続き無料で利用可能 - Publickey

⇧ 従業員数250名未満ではない会社の開発案件だと有料になるって、話で、

finance.yahoo.co.jp

⇧ 上記サイト様の情報が正しいとして、日本だと2624社の企業が「従業員数」について250名を超えるらしいですと。

www.net-bizs.jp

⇧ 上記サイト様によりますと、250名未満の会社が圧倒的に多いとは言え、開発案件を発注してる企業さんが、

  • 従業員数250名以上
  • 年間売上1000万ドル(約11億円)以上

のいずれかの条件を満たしていた場合、有料でも問題ないから「Docker Desktop」を使っていくって話になるのかは気になるところですかね。

ちなみに、

www.publickey1.jp

この条件以外、つまり250名以上もしくは年間売り上げ1000万ドル以上の組織での利用は有料となりますが、無料版からの移行にかかる経過措置として、今日、2022年1月31日までは無料で使ってよい猶予期間とされていました。

Docker Desktop無料の猶予期間が今日で終了。250人以上もしくは年間売り上げ1000万ドル(約11億円)以上の組織は有料に - Publickey

⇧ 2022年2月1日(火)から有料化が始まるようですね...

Linux環境にDockerをインストールするという手があるらしい

「Docker Desktop」の有料化の条件に引っかかるけど、どうしても無料で使いたいってなってくると、「Docker Desktop」以外の選択肢を考える必要があり、Linux環境に「Docker」をインストールするしかないっぽいのだけど、

docs.docker.com

Server

Docker provides .deb and .rpm packages from the following Linux distributions and architectures:

f:id:ts0818:20220130164622p:plain

https://docs.docker.com/engine/install/

⇧「Debian」系か「Red Hat」系のパッケージマネージャーのものについて提供してるってことみたいね。

Ubuntuにインストールする場合の例を見てみると、

docs.docker.com

⇧ 「Docker Engine」だけじゃなくて「Docker CLI」とかもインストールしてるように思えるんだけど、「Install Docker Engine on Ubuntu」ってタイトルは譲らないってことですかね...。

WSL 2(Windows Subsystem for Linux 2)とDocker DesktopとDockerと

ここで、Windows環境(ローカル環境)だと、Linux環境を準備するためには、

  • Virtual Boxなどの仮想化環境構築ツールを利用
  • WSL(Windows Subsystem for Linux)を利用
  • WSL 2(Windows Subsystem for Linux 2)を利用

のいずれかを利用していく感じになるとは思うのだけど、「WSL 2(Windows Subsystem for Linux 2)」の仕組みが未だによく分かりませんと。

同様の疑問を掲げてる方がおり、

⇧「Microsoft」のフォーラムに質問が飛んでたのだけど、結局たらい回しにされて回答が得られませんと。

まぁ、何て言うか、「Microsoft」がアーキテクト図みたいなものを公開してくれてれば、こんなカオスな状況にはなってないと思うんだけど...

stackoverflowによると、

stackoverflow.com


www.youtube.com

⇧「Microsoft」ちゃんと情報を公開してるのに、何故、ドキュメントにまとめないのか...

ちなみに、自分の環境では、

をインストールしているのですが、

f:id:ts0818:20220130171659p:plain

という感じで、「\\wsl$」で何か確認できるのですが、こやつらは一体何なのか?

news.line.me

 WSL$は、Plan 9のために開発された9Pというプロトコルを使っている。Plan 9は、Unixを開発したベル研究所で作られてきたOSで「Plan 9 from Bell Labs」というのが正式な名前である(この名前はカルト的な人気を誇る映画「Plan9 from Outer Space」が元ネタである)。

Win32側からWindows Subsystem for LinuxのVolFsへのアクセスが可能に (アスキー) - LINE NEWS

 そのソースコードの由来はともかく、マイクロソフトはWSLで9Pプロトコルを扱えるようにした。また、/initプロセスで9Pファイルサーバーを動作させるように改良した。これにより、WSL側は、VolFs(ルートディレクトリ以下)や/proc、/sysなどの特殊ファイルシステムを含めて、Win32側からアクセスを可能にした。

Win32側からWindows Subsystem for LinuxのVolFsへのアクセスが可能に (アスキー) - LINE NEWS

 利用面からいえば、これでWin32とWSLは、どちら側からもお互いのファイルシステムをアクセスできるようになった。

Win32側からWindows Subsystem for LinuxのVolFsへのアクセスが可能に (アスキー) - LINE NEWS

⇧ 上記サイト様によりますと、お互いのファイルシステムを繋げてるということらしい。

docs.microsoft.com

WSL 2 uses the latest and greatest in virtualization technology to run a Linux kernel inside of a lightweight utility virtual machine (VM). However, WSL 2 is not a traditional VM experience.

https://docs.microsoft.com/en-us/windows/wsl/compare-versions#whats-new-in-wsl-2

⇧ 上記の「Microsoft」のドキュメントと、公開していたYouTubeの動画などから「WSL 2(Windows Subsystem for Linux 2)」は、「a Linux kernel inside of a lightweight utility virtual machine (VM)」とあるように1つの軽量な「仮想マシン」で管理してるらしい。

「Docker Desktop」なんかのファイル群なんかも、「lightweight vm」で管理されてるところを見ると、「Docker」の特徴である(Linuxの標準的な機能)、

  • namespace
  • cgroup

みたいな仕組みを「lightweight vm」が実現してるってことなんかな?

なので、「Docker Desktop」についても、

forums.docker.com

⇧上図のような感じで、「lightweight vm」内の「Linux Kernel」で「Docker engine」が稼働して、「Docker Client」なんかは、「Windows」側のファイルとして管理されてるように見えるんだけども、「Docker Desktop」は「Linux Kernel」とか含んでないんかな?

「\\wsl$\docker-desktop\proc\sys\kernel」ってフォルダは存在するんですが、これは「Linux Kernel」とは別物なんですかね?

f:id:ts0818:20220131222938p:plain

このあたりが謎なんだけど、「Ubuntu」とかだと、

f:id:ts0818:20220130222654p:plain

⇧「Linux Kernel」を含んでるように見えるんで、「lightweight vm」の「Linux Kernel」とは別に「Linux Kernel」を利用してるんかなとか思ったんだけど、いまいち、このあたりの情報が曖昧な感じで把握できんのよね...

ちなみに、ファイルシステムについては、

Windows側のファイルシステム

f:id:ts0818:20220130180300p:plain

■lightweight vm側の各ディストリビューションファイルシステム(「Docker Desktop」の場合)

f:id:ts0818:20220130180434p:plain

って感じで、別れてるけども、どっちも「ホストOS(Windows)」のファイルシステムからアクセスできてますと。

もし、「Docker Desktop」の利用を止めて、「Docker」をLinux環境にインストールして使うってなった場合で、「WSL 2(Windows Subsystem for Linux 2)」とかで実現するってなった場合は、適当なLinuxディストリビューションのファイル群をインストールして、そこのエリアに「Docker CLI」や「Docker Engine」をインストールする感じになるんかな?

イメージ的には、以下みたいな感じになるってことかな?

f:id:ts0818:20220130183153p:plain

おそらく、「lightweight vm」にインストールしたLinuxディストリビューションが「Ubuntu」以外にも存在する場合は、そちらにも「Docker」をインストールする感じになるのかな?(「Docker」使いたいのであれば)

どうしても「lightweight vm」に関する情報が判然としないというね...

ただ、

levelup.gitconnected.com

These days there are several Linux distributions available that you can install on WSL2, even several at the same time. You can make one of them the default. And you can switch between as you see fit. The following picture shows this setup. Note that multiple Linux instances are run within the same Linux VM.

https://levelup.gitconnected.com/docker-desktop-on-wsl2-the-problem-with-mixing-file-systems-a8b5dcd79b22

⇧ 上記サイト様でも、1つの「lightweight vm」しか持てないって言ってるように見えるので、「WSL 2(Windows Subsystem for Linux 2)」においては、大枠の「仮想マシン」は1つであるって考えは合ってそうな気はする。

ちなみに、自分の環境で「wsl.exe」の場所を検索したら、5件ヒットしました。

f:id:ts0818:20220130194215j:plain

ディストリビューションなんかのファイル群の配置場所は、


www.youtube.com

⇧ 上記のYouTubeで確認はできるんだけども、肝心の「lightweight vm」本体に関するファイル群がWindowsのどこに配置されてるのかは依然として謎に包まれたままという...

Vue.jsとかのデプロイ先の環境構築をしようと、「WSL 2(Windows Subsystem for Linux 2)」について調べてみたものの、相変わらずブラックボックスの要素が多くて困ったもんですね...

とりあえず、「Docker Desktop」でVue.jsを動かしてみる

jp.vuejs.org

⇧ 上記ドキュメントを参考にトライしてみる。

「Vue.js」のプロジェクトは、

ts0818.hatenablog.com

⇧ 上記の記事で作成していたものを利用しています。

まずは、「Vue.js」のプロジェクトのフォルダ直下に「Dockerfile」を作成。

f:id:ts0818:20220130210651p:plain

ファイルの中身は、以下のようになりました。

# ビルド環境
FROM node:lts-alpine as build-stage
WORKDIR /my-typescript-project
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 本番環境
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /my-typescript-project/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]    

で、docker imageの作成で。

f:id:ts0818:20220130211341p:plain

「Docker image」が作成されました。

f:id:ts0818:20220130212432p:plain

「Dockerコンテナ」を作成・起動で。

docs.docker.jp

⇧「run」のオプションについては、上記のドキュメントで要確認。

f:id:ts0818:20220130212743p:plain

ブラウザにアクセスすると、

f:id:ts0818:20220130212849p:plain

f:id:ts0818:20220130212917p:plain

⇧「Dockerコンテナ」にアクセスできているようです。

「Ctrl キー」+ 「C キー」でコンテナの停止・削除。

f:id:ts0818:20220130213026p:plain

とりあえず、「Docker image」は残ってるので、再度、docker runすれば「Dockerコンテナ」は起動できるかと。

f:id:ts0818:20220130213544p:plain

ちなみに、「Docker image」については、「\\wsl$\docker-desktop-data\version-pack-data\community\docker\image\overlay2\repositories.json」に記録されてるらしく、

f:id:ts0818:20220130215644p:plain

自分の環境では、ファイルの中身が、

{"Repositories":{"ml_db":{"ml_db:latest":"sha256:6fef7236b9dcf8416b84c9d39de0a32fbf40163b33b91c93ad2500020ef26e72"},"ml_servlet":{"ml_servlet:latest":"sha256:3829fb707b9617598437b1ea7dad3d4d78141719b7fb26140d2f435e6509e0dd"},"nginx":{"nginx:1.19.10":"sha256:62d49f9bab67f7c70ac3395855bf01389eb3175b374e621f6f191bf31b54cd5b","nginx@sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412":"sha256:62d49f9bab67f7c70ac3395855bf01389eb3175b374e621f6f191bf31b54cd5b"},"vuejs-cookbook/dockerize-vuejs-app":{"vuejs-cookbook/dockerize-vuejs-app:latest":"sha256:71f57e8dbf9a6cb8c4c3d4ec10a8a209ae2790d17421bf8880783d5fbdfb707b"}}}    

⇧ となっており、「docker images」コマンドで表示されるDocker  imageの数と一致はしておりましたが、実際に「Docker image」はどこに保存されてるんかな?

「Vue.js」側で変更があれば、再度、「Docker image」の作成し直しする感じになるんかな?

とりあえず、次回は、「Vue.js」のビルド後の静的ファイルが配置された「Dockerコンテナ(Nginx )」から、「Spring Boot」にアクセスするのとかを試していきたいところですかね。

なので「Vue.js」に「axios」とかをインストールしてコーディングとかして、「Spring Boot」と通信できる状態にしてから、再度、「Docker image」を作ってとかする感じになってきますかね。

毎度モヤモヤ感が半端ない...

今回はこのへんで。