« Windows 10のコンテナ機能(Docker for Windowsじゃないよ)が動かない話と気になった点 | トップページ | 帰省メモ:伊予灘のこと »

2016年8月 4日 (木)

Windows 10のコンテナ機能とDocker for Windowsを共存させる上での問題点(追記あり)

覚え書き。

前回のエントリで書いたように、 Windows 10 Anniversary Update(version 1607)では二種類のコンテナツールを利用できます。 (Windows 10 コンテナはまだ動かせていないけど)

ツールコンテナで動かすイメージ提供者
Windows 10 コンテナWindowsイメージMicrosoft
Docker for WindowsLinuxイメージDocker

これらを共存させ、 dockerコマンドで操ることができれば、 Windows 10上でLinux環境もWindows環境もさくさく立ち上げることができて便利だと思うわけです。

で、両者が共存できるか試してみました。

結論から言えば、「両者を同時に動かすことはできない」なんですが、 試して分かった点について書き留めます。

【2016/09/28 追記】 Docker for Windowsのベータ26以降、Docker for WindowsでLinuxイメージもWindowsイメージも両方取り扱うことができるようになりました。 「Windows 10上のコンテナでLinuxイメージもWindowsイメージも同時に扱えるようになった」を参照。

コンテナ機能の構造

これらのツールを、ざっくり以下の二つの部分に分けます。

  • CLI部分(要するにdockerコマンド部分)
  • エンジン部分(Docker Engine)

エンジン部分は両者ともサービスとして稼働し、 Hyper-Vを間に挟んでコンテナを動かします。 Windows 10コンテナはWindowsのイメージを動かしますし、 Docker for WindowsはLinuxのイメージを動かします。

Windowsコンテナには本来のコンテナに近い形態の「Windows Server Containers」と、 コンテナホストとコンテナのカーネルをHyper-Vで分離する形態の「Hyper-V Containers」があり、 Windows 10コンテナでは「Hyper-V Containers」のみがサポートされています。

両エンジンのWindowsサービスとしての名前は以下の通り。

  • Windows 10コンテナ: Docker Engine(いかにも仮の名前っぽいので、そのうち変更されそう)
  • Docker for Windows: Docker for Windows Service

一方、 CLI部分は両者ほぼ同じです。 Windows 10コンテナの方が少し新しいぐらい。 実際、 CLI部分を両者交換しても、 動作に影響はありませんでした。

ちなみに、docker versionコマンドを実行すると、 以下のような結果になります。

Windows 10コンテナの場合。

PS C:\Temp> docker version
Client:
Version: 1.13.0-dev
API version: 1.25
Go version: go1.6.3
Git commit: 87e48ec
Built: Wed Aug 3 20:33:19 2016
OS/Arch: windows/amd64

Server:
Version: 1.13.0-dev
API version: 1.25
Go version: go1.6.3
Git commit: 87e48ec
Built: Wed Aug 3 20:33:19 2016
OS/Arch: windows/amd64

Docker for Windowsの場合。

PS C:\Temp> docker version
Client:
Version: 1.12.0
API version: 1.24
Go version: go1.6.3
Git commit: 8eab29e
Built: Thu Jul 28 21:15:28 2016
OS/Arch: windows/amd64

Server:
Version: 1.12.0
API version: 1.24
Go version: go1.6.3
Git commit: 8eab29e
Built: Thu Jul 28 21:15:28 2016
OS/Arch: linux/amd64

問題点

両者ともCLIとエンジンの間の通信は名前付きパイプを通して行っています。 この名前付きパイプの名前が"//./pipe/docker_engine"に固定されています。 ざっと見、この名前を変更できる設定を見つけることはできなかった。

なので、 一方のエンジンが稼働中に、 もう一方のエンジンを起動しようとすると、 「名前付きパイプのオープンに失敗した」エラーで起動失敗します。 イベントログを見てみると、 "fatal: open //./pipe/docker_engine: Access is denied." とか出てます。

ということで、 両者を同時に稼働させることができません。 私は、両方のサービスの起動方法を「手動」に設定して、 手動でエンジンを切り替えてます。

あと、 直接不具合は経験していないけど、 両者ともに作業フォルダとして%ProgramData%\Docker以下を使うことがあるようで、 両者の作業が干渉しないかちょっと心配。

今後どうなる?

うーん。

CLI側はdockerコマンドの-Hオプションに名前付きパイプの名前を指定すれば、 それと通信するようになるんじゃないかな。

とすると、どちらかのエンジンが使う名前付きパイプの名前を変更するのかなあ。 デフォルトはどっちになるんだとか、 面倒にならなければいいんだけど。

希望としては、 同一のdockerコマンドで、 LinuxイメージもWindowsイメージも、 どっちのエンジンとか気にせずに操れるようになればうれしいんだけれども。

« Windows 10のコンテナ機能(Docker for Windowsじゃないよ)が動かない話と気になった点 | トップページ | 帰省メモ:伊予灘のこと »

Windows」カテゴリの記事

覚え書き」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/595179/64013068

この記事へのトラックバック一覧です: Windows 10のコンテナ機能とDocker for Windowsを共存させる上での問題点(追記あり):

« Windows 10のコンテナ機能(Docker for Windowsじゃないよ)が動かない話と気になった点 | トップページ | 帰省メモ:伊予灘のこと »