TechReport

技術者情報

ソリューション

2016年12月14日(水)公開

第204回

Windowsコンテナのインストールとコンテナ管理

コンテナ管理のためのコマンド Docker & PowerShell

Windows Server 2016が正式にリリースされました。WindowsコンテナはTechnical Preview 5までとは異なり、完全にDockerの仕様に沿ったコンテナとなりました。今回は、Windowsコンテナのインストール方法と、主だったコンテナ管理のためのDockerコマンド、さらには開発中のDocker-PowerShellについていち早く紹介します。

記事INDEX

Windowsコンテナのインストール

Windowsコンテナの機能は、サーバーマネージャーの「役割と機能の追加」から追加できるようになっていますが、これだけだと、Dockerエンジンのインストールまでは行われないので、追加の設定が必要となります。

まずは、PowerShellでコンテナの機能の有効化とDockerエンジンのインストールまでを実行します。

Dockerのモジュールをダウンロードしてインストールを行い、再起動します。

Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-Computer -Force

再起動後はDockerサービスが登録され、Dockerコマンドによってコンテナの操作管理ができる環境となっています。

Dockerのコマンドは「docker.exe」に引数を渡して実行します。コマンドの一覧を確認してみましょう。

docker -–help

Docker-PowerShellのインストール

WindowsコンテナをPowerShellで操作・管理するためのPowerShellコマンド群は、GitHub上でオープンソースとして「現在開発中」の状況となっています。現時点でバージョン0.1をダウンロードして利用することがきますので、実際にインストールしてみましょう。
Microsoft/Docker-PowerShell

Invoke-WebRequest "https://github.com/Microsoft/Docker-PowerShell/releases/download/v0.1.0/Docker.0.1.0.zip" -OutFile "$env:TEMP\dockerpowershell.zip" -UseBasicParsing
Expand-Archive -Path "$env:TEMP\dockerpowershell.zip" -DestinationPath $home\Documents\WindowsPowerShell\Modules\Docker
Register-PSRepository -Name DockerPS-Dev -SourceLocation https://ci.appveyor.com/nuget/docker-powershell-dev
Install-Module Docker -Repository DockerPS-Dev -Force
Update-Module Docker

インストールが完了したら、PowerShellのコマンドを確認してみましょう。現在利用できるPowerShellのコマンド一覧です。

Get-Command -Module Docker

主なコマンド
DockerコマンドとPowerShellのコマンドでは、基本的な機能についてはほぼ同じものとなっています。Dockerコマンドは「docker.exe」の実行結果を文字列として表示しているので、オブジェクトとして扱うことができません。PowerShellの場合は、オブジェクトととしての取り扱いや、パイプライン、変数、デバッグなどPowerShellとしての特徴的な機能はすべて利用することができます。

ここでは、Windowsコンテナを操作・管理するための基本的なコマンドについて、Dockerコマンド、PowerShellの両方を対比させた形で紹介します。(背景が黒はDockerコマンド、紺はPowerShellコマンドを表しています。)


▽コンテナイメージ一覧
ダウンロードすることができるコンテナイメージを検索して表示します。例では「microsoft」というキーワードで検索しています。この機能はDockerコマンドのみとなっています。

docker search microsoft

▽コンテナイメージのダウンロード

docker pull microsoft/windowsservercore

Pull-ContainerImage microsoft/nanoserver

▽コンテナイメージの確認

docker images

Get-ContainerImage

▽コンテナの作成
「-i」オプションは、ユーザーからの入力が無い場合でもコンテナを起動し続けるオプションスイッチです。
Hyper-Vコンテナを作成する場合は、最後に「–-isolation = HyperV」を追加します。

docker run -i --name CON01 microsoft/windowsservercore

「-Input」オプションは、ユーザーからの入力が無い場合でもコンテナを起動し続けるオプションスイッチです。
Hyper-Vコンテナを作成する場合は、最後に「-Isolation HyperV」を追加します。

Get-ContainerImage | Where-Object {$_.RepoTags -eq "microsoft/windowsservercore:latest"} | New-Container -Name CON01 -Input

▽コンテナの確認
「-a」スイッチを付けることで停止中のコンテナも表示します。

docker ps -a

Get-ContainerImage | Where-Object {$_.RepoTags -eq "microsoft/windowsservercore:latest"} | New-Container -Name CON01 -Input

▽コンテナの起動

docker start CON01

Start-Container CON01

▽コンテナの停止

docker stop CON01

Stop-Container CON01

▽コンテナの削除

docker rm CON01

Remove-Container CON01

▽コンテナの作成~起動~ポート設定~ファイヤーウォール設定
コンテナのネットワークは、コンテナホストサーバーとNATを経由して接続されています。コンテナにIISをインストールしてWebサイトを公開する場合、NATにポート経路を設定して、ファイヤーウォールでTCP80番の公開やPingを有効化する必要があります。

Dockerコマンドの場合、この一連の設定を「docker run」コマンドでコンテナを作成するときに、オプションスイッチを追加することで、一度に設定を完了させることができます。

一度「docker run」コマンドで作成したコンテナは、以後、Dockerコマンド、PowerShellどちらのコマンドでも、停止するときには、ポート設定とファイヤーウォール設定が削除され、再度起動する場合には、ポート設定とファイヤーウォール設定が追加されます。PowerShellではいまのところ、これらの設定はひとつずつコマンドを組み合わせて実行する必要があります。

docker run --name CON01 -t -d -p 80:80 microsoft/windowsservercore

「Get-NetNatStaticMapping」で追加されたNATの設定が確認できます。

追加されたファイヤーウォールの設定の一つ。TCP80が有効となっています。

Dockerコマンドと同様の設定をPowerShellで組み合わせたものが以下となります。
コンテナ作成後に起動すると、「Invoke-Command」でコンテナのIPアドレスを取得しています。
「Add-NetNatStaticMapping」コマンドでNATの設定を、「New-NetFirewallRule」でファイヤーウォール設定を行っています。

$Image = Get-ContainerImage | Where-Object {$_.RepoTags -eq "microsoft/windowsservercore:latest"}
$Container = New-Container -Name CON01 -Image $Image -Input
Start-Container $Container
$IP = Invoke-Command -ContainerId $Container.ID -ScriptBlock {(Get-NetIPAddress | Where-Object {$_.IPAddress -like "172.*"}).IPAddress}
$Nat = Get-NetNat
Add-NetNatStaticMapping -NatName $Nat.Name -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress $IP -InternalPort 80 -ExternalPort 80
New-NetFirewallRule -Name "TCP80" -DisplayName "TCP/80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True

上記の「New-Container」コマンドでコンテナを作成した場合は、コンテナを停止する場合にNATのポート設定とファイヤーウォール設定を削除しておく必要があります。

Stop-Container CON01
$Nat = Get-NetNat
(Remove-NetNatStaticMapping -NatName $Nat.Name -StaticMappingID (Get-NetNatStaticMapping|? {$_.ExternalPort -eq 80}).StaticMappingId)
(Remove-NetFirewallRule -Name "TCP80")

IISを使ったWebサイトの公開など、ポート設定やファイヤーウォール設定が必要な場合は、今のところDockerコマンドを利用したほうが簡単なようです。


▽コンテナイメージの作成
作成したコンテナからオリジナルのテンプレートとなるコンテナイメージを作成して保存しておきましょう。オリジナルのコンテナイメージを使うことで、素早く必要な設定が完了しているコンテナを作成することができます。
コンテナイメージを作成する場合は、元となるコンテナは停止しておく必要があります。
また、コンテナイメージの名前はすべて小文字にする必要があります。

docker commit CON01 my/conimg01

$Container = Get-Container CON01
Commit-Container -Container $Container -Repository my/conimg01

オリジナルのコンテナイメージが追加されました。

▽Docker Hubにコンテナイメージを保存&ダウンロード
作成したオリジナルコンテナイメージは、パブリックのコンテナ保管場所である「Docker Hub」にアップロードして他者に公開したり、プライベートな保管場所として、どこからでもダウンロードして利用することがきます。Docker Hubを利用するには、あらかじめDocker Hubのアカウントを作成しておく必要があります。
Docker IDの取得:https://hub.docker.com

Docker Hubに保管するコンテナイメージには、/<コンテナイメージ名> となるように、すべて小文字で名前を付けておく必要があります。
例) dockerwin1/conimg01

docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:
Password:
Login Succeeded

docker push /conimg01

docker pull /conimg01

$DockerAuth = [Docker.DotNet.Models.AuthConfig]::new()
$DockerAuth.Username = ""
$DockerAuth.Password = ""
$Image = Get-ContainerImage /conimg01
Submit-ContainerImage -Image $Image -Authorization $DockerAuth

Pull-ContainerImage /conimg01

Docker Hubへのアプロードが完了すると、自身のポータルから確認することができます。

▽コンテナイメージの削除

docker rm CON01

Remove-ContainerImage CON01

▽コンテナにセッション接続
起動しているコンテナに対話型のセッション接続を行うことができます。Windowsコンテナは、基本的にはPowerShellの操作が主体となるので、今回はコンテナのPowerShellコンソールにセッション接続を行います。セッション接続後には、IISのインストールを行ったり、様々なカスタマイズを行うことができるようになります。セッション接続を終了する場合には、どちらも「exit」を入力します。

docker exec -it CON01 powershell

Dockerコマンドの場合、セッション接続後にPowerShellの通常コンソールとなります。

$Container = Get-Container CON01
Enter-PSSession -ContainerId $Container.ID –RunAsAdministrator

PowerShellの場合、セッション接続後に[コンテナID]の追加されたPowerShellのプロンプト画面となります。

▽コンテナにコマンドを実行させる
コンテナホストからは、コンテナ内部で直接コマンドを実行させることが可能です。セッション接続のように、持続的にセッションを維持している状態ではなく、コマンド実行ごとにコンテナに接続しています。今回の例では、コンテナに「ipconfig」のコマンドを実行させて、コンテナ自身のIPアドレスを表示しています。

docker exec CON01 ipconfig

$Container = Get-Container CON01
Invoke-Command -ContainerId $Container.ID -ScriptBlock {ipconfig}

以上、WindowsコンテナについてのDockerコマンドとPowerShellのコマンドを合わせて紹介しました。Dockerコマンドには、この他にもまだたくさんの便利なコマンドやオプションがあります。Docker-PowerShellについては、まだまだ開発が始まったばかりですが、慣れた方ならそれなりに使いこなせるレベルのものになっていると思います。

Windowsコンテナはようやくスタートしたばかりです。引き続き、新しい情報を紹介していきます。

樋口 勝一

GMOインターネット株式会社

1999年6月GMOインターネットに入社。Windowsを用いたホスティング事業の立ち上げの際、サービス開発からその後の保守・運用まで1人で担当。2010年には「お名前.comWindowsデスクトップ」をリリースし、マイクロソフト社と強い信頼関係を構築。2007年から連続で「マイクロソフトMVPアワード」を受賞し、Windowsのスペシャリストとして活躍。

執筆者一覧

初めてのWindows Azure Pack本が発売

Windows Azure Pack プライベートクラウド構築ガイド
GMOインターネット株式会社 樋口 勝一 著

本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。

詳細はこちら