【Docker】Linuxコマンドを知らないエンジニアが滅びるかもしれない件【WSL2】

# はじめに

一番初めに、この記事が触れたい内容について述べます。つい先日マイクロソフトより、「[Announcing WSL 2](https://devblogs.microsoft.com/commandline/announcing-wsl-2/)」という告知がありました。Windowsで開発をしている人（かつWindows10を利用している人）であれば「WSL」という単語を聞いたことがあるかもしれません。この告知は、2019年夏に、その「WSL」のVersion2がリリースされるという告知です。このソフトウェアがどれほど革新的で、今後の環境構築界隈でどのように旋風を巻き起こしていくのかを取り上げたいと思います。

# Windowsって？Linuxって？
WindowsやLinuxについて分かっていないと記事の意味が分からないと思うので、さっくりと説明します。知ってる人は読み飛ばしてください。

- Windows
    - マイクロソフトによって開発・販売・管理されている有償のOS
        - VirtualBox等仮想OS用ソフトウェア向けのイメージは無償で配布されている
    - 標準では開発用のソフトウェアはほぼ何もインストールされていない
        - ここでいう開発用のソフトウェアとは、PythonやC言語コンパイル用のgccコマンドやgitコマンド等を指す
        - これが理由（の一部）で、開発者はLinuxやMacOSを利用する（MacOSについてはこの記事では触れない）
    - クライアント用OSとサーバ用OSは明確に分けられており、標準で利用しているようなWindowsはクライアント用の機能しか持ち合わせていない
    - 当然のことながらマイクロソフト製品のソフトウェアと相性がよく、ExcelやWord等を利用可能

- Linux
    - OSとしてWindowsと比較しているが、正確にはLinuxとはLinuxカーネルのこと
        - Windowsのカーネルは「NTカーネル」と呼ばれるが、NTカーネルを積んでいるOSはWindowsだけなのであまり知られてはいない
        - LinuxカーネルはC言語で書かれている
    - Linuxカーネル単体では動かず、Linuxカーネルを利用するためのソフトウェアを含めてOSと呼ぶことが多い
        - UbuntuやRHEL、Debian等がそれにあたり、これらソフトウェアを総称してLinuxの「ディストリビューション」と呼ぶ
        - ある意味WindowsはNTカーネルのディストリビューションとも言える
    - オープンソースとして開発され、無償で利用可能な場合が多い
        - RHEL（Red Hat Enterprise Linux）のように、独自でカスタマイズして有償化しているところもある
    - ディストリビューションには系譜があり、主にRedhat系譜とDebian系譜がメインで利用されている
        - [参考：【2019年】初心者にオススメなLinuxディストリビューション](http://note.kurodigi.com/linux-distro-2019/)
        - [参考：Ubuntu増加 - 1月Webサイト向けLinuxシェア](https://news.mynavi.jp/article/20190106-750441/)
    - クライアント用OSとサーバ用OSは明確に分けられておらず、標準機能としてサーバ用OSの機能が搭載されている
        - サーバ用OSの機能とは、簡単に言うと複数台同時にその端末に接続し、操作することが可能かどうかを言う
        - 例として、Linuxディストリビューションには複数人でTeratermからSSH接続をすることが可能
    - 標準インストール時点で開発用のコマンドがインストールされている場合が多い
        - Ubuntuの場合は、Pythonやgccコマンドが標準インストールされている
       

# WSL

## WSLとは
本題に入ります。WSLとは、「Windows Subsystem for Linux」の略称で、簡単に言うとWindowsからLinuxディストリビューションに触れることができるソフトウェアのことです。ただし仕組みとしては、LXCore（LinuxカーネルファンクションをNTカーネルファンクションに変換する仕組み）で成り立っていました[図1]。つまり、WSL上で実行したLinuxコマンドは、LXCoreによってNTカーネルファンクションに変換されています。ということは、実際のカーネルがNTカーネルなのは変わりなく、いわば「Linuxカーネルを操作しているかのように見せる仕組み」を実現していました。


図1：WSL1の仕組み
（ASCII.jp : Linuxカーネルをそのまま利用する「Windows Subsystem for Linux」の新バージョン 2019年05月12日）
![docker](https://drive.google.com/uc?export=view&id=1gp1MhEZWUNObkrrfkYXLtRDEQbopPq0S)

これはこれですごい技術ですが、かゆいところに手が届きませんでした。一般的なLinuxコマンドについては、このLXCoreがうまく変換していましたが、実際にLinuxカーネルを共有するソフトウェアである「Docker」等は、いまいちうまく動いてくれませんでした。（WSL上で動くと言われていましたが、実際不安定な動作でした）

## WSL2へのバージョンアップ
はじめにで触れたとおり、つい先日マイクロソフトより、「[Announcing WSL 2](https://devblogs.microsoft.com/commandline/announcing-wsl-2/)」という告知がありました。WSL1（これまでのWSLをWSL1と呼びます）と同じ方向性、つまりLinuxコマンドをNTカーネルファンクションに変換する仕組みで実装されるのかと思いきや、Linuxディストリビューションを搭載してしまいました[図2]。


図2：WSL2の仕組み
（ASCII.jp : Linuxカーネルをそのまま利用する「Windows Subsystem for Linux」の新バージョン 2019年05月12日）
![docker](https://drive.google.com/uc?export=view&id=1aNwTvaZBzD0jmtIQM_VnTQtA9vrV_DZz)
 

これが何を意味するのかというと、Linuxカーネルをダイレクトに利用するようなFUSEやDockerといったソフトウェアが、今後Windowsで利用可能になるということです。これまでWindows環境でDocker環境を構築したい場合は、「[Windows7環境なのにdocker入れて開発することになった話【①環境設定編】](https://qiita.com/Shunichirou/items/ce7cc3c69eef690e08a8)」
のようにLinux用の仮想OSを導入して利用する必要がありました。今後はこんな手間は必要なく、WSL2（Windows）上から、OS間の差異を意識することなく、Dockerに触れることができるようになりました。

#### WSL2についてのニュースは以下を参考

[参考：Linuxカーネルをそのまま利用する「Windows Subsystem for Linux」の新バージョン](https://ascii.jp/elem/000/001/857/1857246/)
[参考：Windows 10に本物のLinuxカーネル搭載へ。WSL 2用にカスタムし高速化](https://japanese.engadget.com/2019/05/07/windows-10-linux-wsl-2/)
[参考：［速報］Windows上でフル互換のLinuxシステムコールを実現する「WSL 2」発表、Dockerも実行可能に。Microsoft Build 2019](https://www.publickey1.jp/blog/19/windowslinuxwsl_2dockermicrosoft_build_2019.html)

#### Dockerやコンテナの詳細については以下を参考
[参考：Windows7環境なのにdocker入れて開発することになった話【③docker開発環境編】](https://qiita.com/Shunichirou/items/331845b20f37f6c875a2)


# 今後どうなっていくことが予想されるか

ここからは完全に個人的見解です。（意見いただけると助かります）

- Dockerがこれほど便利なのにいまいち普及していない理由は、Linux上でしか動作しなかったことが大きな理由である
    - 特に大規模開発では、サーバはLinuxでも個々人の端末はWindowsのことが多く、環境構築といえばTeratermでの開発サーバへのSSH接続 & ローカルでの様々なソフトウェア（IDEやエディタ、MySQL等）の導入であった

>**inductor様よりご意見いただき以下追記**
「Linux上でしか動作しなかったことが大きな理由である」という表現について誤解を招くため以下訂正です。

> LinuxコンテナとWindowsコンテナをごちゃ混ぜに書いてしまっていますが、Windowsのカーネルを利用するWindowsコンテナについては、Windows10ですでに利用可能になってます。（Windowsコンテナについての最新情報は勉強不足でした）([参考：開発者に朗報！　Windows 10でWindows Serverコンテナが実行可能に (1/2)](https://www.atmarkit.co.jp/ait/articles/1902/07/news024.html))

> 今回の記事では、Windows端末からLinuxカーネルを利用したLinuxコンテナの立ち上げについて述べています。これまでWindows端末からLinuxコンテナを立ち上げるためには、Docker Toolbox及びDocker for Windowsというソフトウェアがありました([参考：Windows でコンテナ使いたい時のまとめ 2017](https://qiita.com/tksarah/items/cf3ca3724532491a6861))。Docker ToolBoxについての動作はかなり不安定であったため、私はDocker for Windowsを利用していました。しかしHyper-Vインスタンス上でLinux OSコンテナ用のdocker daemonが動作するため、2重仮想化となっていました。これが影響で予期せぬpermissionエラーなどが生じることがあり、やはり使い勝手としては、Linuxディストリビューション上でLinuxコンテナを立ち上げた場合はかなり異なりました。

> 以上を踏まえると、「Linux上でしか動作しなかったことが大きな理由である」ではなく、「LinuxコンテナをWindows上で、Linux上で動作させる場合と同様に実行することはできなかった」が正しいです。
**追記ここまで　ご意見ありがとうございました**


- 今主流のクラウドサービスでは、コンテナのイメージアップロード機能（AWSでいうとECRやECS）が提供されている
    - コンテナのイメージを作成しておけば、クラウド上に一から本番環境サーバ構築するよりも、大幅に環境構築時間が短縮できる
    - 環境選定したり、環境構築手順書書いたり、実際にインストール作業したり...といった手間がすべてなくなる

>**inductor様よりご意見いただき以下追記**
今回AWSについて詳しく書くつもりはなかったため「コンテナのイメージアップロード機能（AWSでいうとECRやECS）」といった表記をしましたが、誤解を招くため以下訂正します。

> AWS上でコンテナを扱うサービスについてはECRとECSがあります。ECRについては、あくまでコンテナイメージを管理するためのレジストリです。またECSについては、そのレジストリからコンテナイメージを呼び出し、動作させるためのオーケストレーションサービスです。ECSでは、cron式を書いたり手動でコンテナイメージを押下することでコンテナイメージを動作させることができ、ECRに登録されているコンテナイメージを管理・実行することができます。
**追記ここまで　ご意見ありがとうございました**


- クラウドサービスではなくても、オンプレ本番環境サーバがLinuxのディストリビューションであれば、開発環境で利用していたコンテナのイメージを流用できる
    - WindowsサーバOS上でのWSL2の動作についてどうなるかは未だ発表されていません

- 今後WSL2によってWindows上から簡単にDockerが触れるようになれば、Docker（もしくはそれに代わるコンテナ管理アプリケーション）を用いた開発環境構築がデファクトになっていく可能性が高い

- WindowsでWSL2を実行する機会が増える

- WSL2を実行するにあたって、Linuxコマンドをたたける必要がある

上記を踏まえたうえでタイトルに結び付くわけですが、結論として、大袈裟に言うならば、「**Linuxコマンドを知らないエンジニアが滅びるかもしれない**」に繋がります。

# おわりに

ここまで読んでいただきありがとうございました。大げさなタイトルで、かつWSL2とDockerとLinuxコマンドを風桶理論で無理やりつなげた感はあります。私自身、Windows環境からDockerを触っていた身として、もっと便利に簡単にDockerを触れたらいいのにと日々感じていました。まだまだWSL2についての詳細は、これから逐次発表されていきます。Dockerだけがデファクトにならないとしても、Linuxコマンドを知らないエンジニアが滅びないにしても、開発環境構築を取り巻く手法に大きな変革が起きると信じ、今日もLinuxでDockerを触ります。