連載
» 2015年10月07日 05時00分 公開

vNextに備えよ! 次期Windows Serverのココに注目(29):WindowsコンテナーをDockerから操作するには?――あなたの知らないコンテナーの世界(その4) (2/3)

[山市良,テクニカルライター]

Dockerコマンドによるコンテナーのローカル管理

 Windows版のDockerバイナリは、コンテナーホストとして構成したWindows Server 2016 TP3の「C:¥Windows¥System32¥Docker.exe」にインストールされます。このバイナリはDocker Daemonと共通ですが、コマンドプロンプトやPowerShellのシェルプロンプトから実行することで、ローカルのコンテナーホストを操作できます。

 PowerShellの「Get-ContainerImage」コマンドレットを実行すると、Windows ServerコンテナーのベースOSイメージである「WindowsServerCore」を確認できます。Dockerコマンドの場合、同様の操作は「docker image」コマンドになります。Dockerコマンドからは二つの「windowsservercore」が存在するように見えますが、これは同じイメージに「10.0.10514.0(バージョン番号)」と「latest(最新)」の二つでタグ付けされているからです。

 PowerShellの「Get-Container」コマンドレットを実行すると、作成済みのコンテナーとその状態を確認できます。Dockerの場合、実行中のコンテナーは「docker ps」コマンド、停止中のコンテナーは「docker ps -a」コマンドで確認できます。ところが、PowerShellの「Get-Container」コマンドレットで参照できるコンテナーが、Dockerコマンドでは全く見えません(画面2)。先に触れましたが、PowerShellによる管理と、Dockerコマンドによる管理は現状、統合されていないからです。

画面2 画面2 PowerShellで作成したコンテナー「MyCont01」は、Dockerコマンドからは全く見えない。これは、Windows Server 2016 TP3の仕様であり、将来的には統合される可能性がある

DockerコマンドによるWindows Serverコンテナーの作成

 LinuxベースのDockerで次のコマンドを実行すると、Docker HubからUbuntuイメージをダウンロードし、コンテナーを作成して、Ubuntuのシェル環境(/bin/bash)に対話的に接続できます。

1 docker pull ubuntu

2 docker run -t -i --name myubuntu ubuntu /bin/bash


 Windows Serverコンテナーの場合は「docker pull」コマンドを実行しなくても、すでに「windowsservercore」イメージがあります。次のように、LinuxベースのDockerと同じように「docker run」コマンドでWindows Serverコンテナーを作成し、コンテナーのコマンドプロンプト(cmd.exe)に対話的に接続することができます(画面3画面4)。イメージ名「windowsservercore」は、全て小文字で入力しなければならないことに注意してください。

docker run -t -i --name mywincont01 windowsservercore cmd


画面3 画面3 Windows Serverコンテナーを作成、実行し、コマンドプロンプト(cmd.exe)に接続する
画面4 画面4 1回目のコマンドの実行が失敗することがあるのは、Windows Server 2016 TP3の既知の問題

 コマンドラインパラメーターの詳しい説明はしません。ここで重要なのは、Dockerコマンドと同じ構文でWindows Serverコンテナーを実行できることです。

 コンテナーのコマンドプロンプトに接続したら、Windows Serverの役割や機能を有効化したり、アプリケーションをインストールしたりすることができます。

 本連載第27回で説明したように、PowerShellの「New-Container」コマンドレットで作成したコンテナーは、ベースOSイメージとの差分が「C:¥ProgramData¥Microsoft¥Windows¥Hyper-V¥Containers」フォルダー下に、VHDX形式のディスクイメージとレジストリファイルで保存されます。

 一方、「docker run」コマンドで作成したコンテナーの差分データは、「C:¥ProgramData¥docker¥windowsfilter」フォルダー下に書き込まれます。現状、このような実装になっているため、PowerShellとDockerコマンドで同じコンテナーを相互に参照や管理することができないというわけです。

 対話的に実行したWindows Serverコンテナーは「exit」コマンドでコマンドプロンプトを終了すると同時に、コンテナーも終了します。カスタマイズしたコンテナーは、「docker commit」コマンドでカスタムイメージとしてローカルリポジトリに保存できます。コンテナーの削除は「docker rm <コンテナー名>」コマンド、カスタムイメージの削除は「docker rmi <イメージ名>」コマンドです。この辺りの管理操作も、LinuxベースのDockerと全く変わりません(画面5)。

画面5 画面5 「docker commit」コマンド、「docker rm <コンテナー名>」コマンド、「docker rmi <イメージ名>」コマンドも、LinuxベースのDockerと同じエクスペリエンスを提供する

 なお、「docker commit」コマンドで保存したイメージは、「C:¥ProgramData¥docker¥windowsfilter」フォルダー下にフラットな形式として保存されます。保存したイメージの見掛け上のファイルサイズはベースOSイメージよりも大きくなりますが、ベースOSイメージと差分をマージしたものが保存されるわけではなく、ベースOSイメージとの差分だけが保存されるようになっています。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。