Technology Topics by Brains

ブレインズテクノロジーの研究開発機関「未来工場」で働くエンジニアが、先端オープン技術、機械学習×データ分析(異常検知、予兆検知)に関する取組みをご紹介します。

WindowsのDockerで慣れないこと

Neuron開発チームの木村です。

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は介さないかもしれません)
  • Windows OSコンテナとLinux OSコンテナを同時に操作できない
    • 操作したいコンテナに合わせて、「モードを切り替える」または「experimental機能の--platformオプションを指定する」必要がある

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のwinamd64microsoftをあたっていくと良いと思います(ただし、microsoftのほうはLinuxのイメージも多い)。

希望のイメージが見つからない場合は、以下のWindows Server 2016基底イメージを使ってDockerfileを書いてゆきましょう。

なお、Windows Server 2012など旧Windowsのイメージは存在しないと思われます。


DockerfileのRUN/CMDは、コマンドプロンプトで実行される

当然なのですが、DockerfileからWindowsのイメージをビルドする時、RUNCMDの内容は、Windows上で実行されます。 つまり、Linuxのshellコマンドをそのまま使うことはできません。

こればかりは、コマンドプロンプト(または、そこから呼び出すPowerShell)のコマンドに慣れてゆくしかありません…
さらに、パス区切りがややこしく、COPYなど/でよい命令と、WORKDIRなど\でなければならない命令が混在しています。

(bashのコマンドからWindowsのコマンドに変換する何かを、docker buildに挟みたい)


おわりに

今回は、dockerのインストールやdockerイメージの作成について、WindowsでDockerを使う際に慣れないことを紹介しました。
次回は、実際にコンテナを動かしていく際のことを紹介する予定です。 何事もなくすんなり使えればよいですが…

実践編に続きます。


ブレインズテクノロジーでは「共に成長できる仲間」を募集中です
採用ページはこちら

参考