Neuronは、ほとんどの場合Windowsにインストールされるため、テスト環境をWindows上に構築しています。 このテスト環境構築を効率化するため、Docker上でのWindows利用を模索し始めています。
今回は「Docker for Macを使っていた私が、WindowsでDockerを使う際に慣れないこと」を紹介します。
なお、利用しているWindowsのバージョンは
「Windows 10 Pro バージョン 1803 (Version 10.0.17134.48)」です。
以下、OSがWindowsであるコンテナを「Windows OSコンテナ」、OSがLinuxであるコンテナを「Linux OSコンテナ」と呼びます。
目次
どのDockerを使うべきか分からない
(この節は、Windows 10 Pro または Windows Server 2016 のバージョン 1709以上を前提とします。)
macでは、とりあえずDocker for Macをインストールすればよかったのですが、 WindowsでDockerを使用するには、以下の複数の方法があります。
- Docker Toolbox
- Docker for Windows
- Hyper-Vコンテナ + LCOW
- Windowsコンテナ
Docker Toolbox以外は、Windows OSコンテナもLinux OSコンテナも利用できますが、一体どれを使うべきなのでしょうか。
それぞれの特徴をまとめました。
Docker Toolbox
インストール方法
長所
- (強いて言えば、)Hyper-Vなしで利用できる
- 代わりに、VirtualBoxが使われる
短所
- Windows OSコンテナを利用できない
- 「Legacy desktop solution.」と説明されるなど、deprecated感がある
Docker for Windows
インストール方法
長所
- docker composeなどのツール群が一緒にインストールされる
短所
- Windows OSコンテナの実行にも、Hyper-Vによる仮想化が行われる
- Linux OSコンテナ用のdocker daemonが
MobyLinuxVM
というHyper-Vインスタンス上で動作するため、二段の仮想化となり、コンテナ実行時にファイルのpermissionに引っかかるなど面倒なことが起きる可能性がある- (experimental機能(LCOW利用)を有効にすれば、
MobyLinuxVM
は介さないかもしれません)
- (experimental機能(LCOW利用)を有効にすれば、
- Windows OSコンテナとLinux OSコンテナを同時に操作できない
- 操作したいコンテナに合わせて、「モードを切り替える」または「experimental機能の
--platform
オプションを指定する」必要がある
- 操作したいコンテナに合わせて、「モードを切り替える」または「experimental機能の
Hyper-Vコンテナ + LCOW
インストール方法
長所
- Windows OSコンテナとLinux OSコンテナを同時に操作できる
- 現段階では、
docker pull
には--platform
オプションが必要
- 現段階では、
短所
- Windows OSコンテナの実行にも、Hyper-Vによる仮想化が行われる
- LCOWは、現在experimental
- 上記のインストール方法では、docker clientにパスを通したり、docker daemonのサービス化は自身で行うこととなる
Windowsコンテナ
インストール方法
長所
- Windows OSコンテナについては、ホストOSのカーネルを使って実行されるため、Hyper-Vによる仮想化が行われない
短所
- Windows Server 2016が必要
- Windows OSコンテナについて、コンテナのWindowsバージョンとホストのWindowsバージョンが、ビルド番号まで一致している必要がある(バージョンが異なる場合、起動がブロックされる)
どれを使えばよいかは要件次第なので、今回は、
- Windows OSコンテナとLinux OSコンテナの両方を使いたい
- OSをなるべく意識せずに、dockerコマンドを実行したい
- テスト環境構築に使用するため、パフォーマンスは多少犠牲にしてもよい
- (experimentalでも使ってみたい)
といった理由から、「Hyper-Vコンテナ + LCOW」を使うこととしました。
Windowsのdockerイメージはどれなのか
まだDocker上でWindowsが動かなかった頃は、どのdockerイメージをpullしてもLinuxのイメージであり、話は単純でした。
さて、では現在、Windowsのイメージをどう見分けてpullするのでしょうか。
結論から言うと、「これはWindows、これはLinux」といった目印は見つけられませんでした。
Windowsのイメージを探す時は、dockerHubのwinamd64やmicrosoftをあたっていくと良いと思います(ただし、microsoftのほうはLinuxのイメージも多い)。
希望のイメージが見つからない場合は、以下のWindows Server 2016基底イメージを使ってDockerfileを書いてゆきましょう。
microsoft/windowsservercore
- Windows Server 2016からGUIを除いたもの
microsoft/nanoserver
microsoft/windowsservercore
からPowerShellなどいくつかの機能を除いたもの
なお、Windows Server 2012など旧Windowsのイメージは存在しないと思われます。
DockerfileのRUN/CMDは、コマンドプロンプトで実行される
当然なのですが、DockerfileからWindowsのイメージをビルドする時、RUN
やCMD
の内容は、Windows上で実行されます。 つまり、Linuxのshellコマンドをそのまま使うことはできません。
こればかりは、コマンドプロンプト(または、そこから呼び出すPowerShell)のコマンドに慣れてゆくしかありません…
(bashのコマンドからWindowsのコマンドに変換する何かを、docker buildに挟みたい)
おわりに
今回は、dockerのインストールやdockerイメージの作成について、WindowsでDockerを使う際に慣れないことを紹介しました。
次回は、実際にコンテナを動かしていく際のことを紹介する予定です。 何事もなくすんなり使えればよいですが…
→ 実践編に続きます。
参考
- Windows コンテナーに関するドキュメント
- Windows 上の Dockerfile
- Linux Containers on Windows (LCOW)を使う
- Windows Server 1709上でLinuxコンテナを動かす(lcow)
- linuxkit/lcow
- Windows上で稼働するLinux、動かしているのはどのテクノロジー?(その1) (1/2)
- 図解で理解できる(はず)Microsoftの仮想化技術――Windows上で稼働するLinux、動かしているのはどのテクノロジー?(その2) (1/2)
- 「Windows Serverコンテナ」「Hyper-Vコンテナ」「Linuxコンテナ」「Docker」の違いとは?
- はじめてのコンテナーDocker & Windows & Linux
- コンテナーなに使ってますか? Linux ですか? Windows も使ってもらっていいですか?