読者です 読者をやめる 読者になる 読者になる

素敵なおひげですね

主にWindowsな技術ブログ。最近はPowerShellなネタが多めです。

Windows 10のコンテナーとDockerを試す

Windows Docker PowerShell

Anniversary Update(1607)が来てWindows 10でもWindows Serverコンテナーの機能が使える様になったので早速試してみました。

手順

基本的にはMSDNのQuick Start*1の内容に従って試しています。

msdn.microsoft.com

ただし、後述の問題が発生したため一部の手順はGithub上のドキュメントの手順に差し替えています。

github.com

発生した問題

----【2016/08/06 追記】----
本日改めて日本語版Windows 10で試してみたらうまく動作しました。
どうやら最初にエラーが出た時の対応で何かミスをしていた様です...Orz

まずは日本語OS + Docker 1.13開発版で試してみて駄目であれば英語版で試すのが良いでしょう。
----【追記ここまで】----

日本語環境だとdocker run時にエラーが出てしまったため、英語版のWindows 10を一からセットアップして試しています。
(言語設定を変える、言語パックの追加、システムロケールの変更全部やりましたが駄目でした...)
いずれは日本語環境でも使える様になるでしょうが今のことろはダメな様です。

公式に提供されているDocker 1.12だとdocker run時にエラーが出てしまうため、Github上で公開されているDocker 1.13の開発版で試す必要があります。

エラーメッセージはこんな感じで、

Error response from daemon: container [コンテナID] encountered an error during CreateContainer failed in Win32: A connection could not be established with the Virtual Machine hosting the Container. (0xc0370108)

といったメッセージが出てしまいます。

PS C:\> docker run -it microsoft/nanoserver cmd
C:\Program Files\docker\docker.exe: Error response from daemon: container 7ea19efb3c9f31092d5a4fcd9dd0115a21839cecb0bfaf
3bc99406d46a38667f encountered an error during CreateContainer failed in Win32: A connection could not be established wi
th the Virtual Machine hosting the Container. (0xc0370108) extra info: {"SystemType":"Container","Name":"7ea19efb3c9f310
92d5a4fcd9dd0115a21839cecb0bfaf3bc99406d46a38667f","Owner":"docker","IsDummy":false,"VolumePath":"","IgnoreFlushesDuring
Boot":true,"LayerFolderPath":"C:\\ProgramData\\docker\\windowsfilter\\7ea19efb3c9f31092d5a4fcd9dd0115a21839cecb0bfaf3bc9
9406d46a38667f","Layers":[{"ID":"7e26e071-3393-5a50-9d0f-623ee586e644","Path":"C:\\ProgramData\\docker\\windowsfilter\\2
4dafad04655d4bd2338442ac12a5c4409883eed90e32af9e80abc3fbd79b833"}],"HostName":"7ea19efb3c9f","MappedDirectories":[],"San
dboxPath":"C:\\ProgramData\\docker\\windowsfilter","HvPartition":true,"EndpointList":["3b6b30c2-c474-4f12-8602-9abc55c0d
10e"],"HvRuntime":{"ImagePath":"C:\\ProgramData\\docker\\windowsfilter\\24dafad04655d4bd2338442ac12a5c4409883eed90e32af9
e80abc3fbd79b833\\UtilityVM"},"Servicing":false}.

StackOverflowに同様の問題が報告されており、今回こちらの内容を一部反映しています。

stackoverflow.com

検証環境

評価環境には英語版のWindows 10 Enterprise 評価版(1607 Build 14339)を使いました。
初期セットアップが終わって最低限のネットワーク設定済みの状態で試しています。

Windows 10コンテナーとDockerを試す

----【2016/08/06 追記】----
本日改めて日本語版Windows 10で試してみたらうまく動作しました。

以下の手順は英語版のものですが、日本語版でも全く同じ手順で大丈夫です。
----【追記ここまで】----

ここまでの情報を踏まえて早速試していきます。
以降の手順は基本的に要管理者権限です。

1. 機能の追加

最初にHyper-Vコンテナーの機能を追加します。
GUIからやっても良いですが、Quick Startの内容に従ってPowerShellから追加します。

# 機能の追加
Enable-WindowsOptionalFeature -Online -FeatureName Containers -All
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

# 普通にやると自動で再起動するので -NoRestart を付けた方が良いかもしれません。  
#Enable-WindowsOptionalFeature -Online -FeatureName Containers -All -NoRestart
#Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -NoRestart
#Restart-Computer -Force

Hyper-Vコンテナーを使わないのであればHyper-Vの機能は無くても良さそうなのですが、コンテナのネットワーク用に仮想スイッチを使ってるぽいため入れておいた方が無難です。

続けて既知の問題があるためレジストリの変更を行います。

# レジストリ変更
Set-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers' -Name VSmbDisableOplocks -Type DWord -Value 1 -Force

# 戻すときは以下
# Set-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers' -Name VSmbDisableOplocks -Type DWord -Value 0 -Force

2. Dockerのインストール

先述の問題に対応するため、Dockerは現在配布されているVer.1.12ではなく、Github上にあるVer.1.13の開発版をインストールする必要があります。
ここの手順はQuick StartではなくGithubのドキュメントの手順に従います。

PowerShellから以下のコマンドを実行し、インストールディレクトリ($env:ProgramFiles\docker\)の作成とdocker.exedockerd.exeの配置を行います。

# docker.exe、dockerd.exeの配置
New-Item -Type Directory -Path $env:ProgramFiles\docker\
Invoke-WebRequest https://master.dockerproject.org/windows/amd64/dockerd.exe -OutFile $env:ProgramFiles\docker\dockerd.exe
Invoke-WebRequest https://master.dockerproject.org/windows/amd64/docker.exe -OutFile $env:ProgramFiles\docker\docker.exe

配置後、$env:ProgramFiles\docker\をPATHに追加します。

# PATHの設定
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$env:ProgramFiles\docker\", [EnvironmentVariableTarget]::Machine)

ここで一旦コンソールを再起動して環境変数を更新します。
続けてdockerd.exeをサービスに登録し起動します。

# サービス登録
dockerd --register-service
# サービス起動
Start-Service docker

これでDockerのインストールは完了です。
バージョンを確認するとこんな感じになります。

f:id:stknohg:20160805224319p:plain

3. Dockerを試す(コンテナイメージのPull)

ここからはQuick Startの内容に従ってNano ServerのコンテナイメージをカスタマイズしてHello Worldまでやってみます。

最初にDocker Hubにあるmicrosoft/nanoserverをPullします。

docker pull microsoft/nanoserver

f:id:stknohg:20160805224634p:plain

Pullし終わったらdocker imagesでイメージを確認してみます。

docker images

結果はこんな感じになります。

f:id:stknohg:20160805224803p:plain

3. Dockerを試す(コンテナのデプロイ)

Pullしたmicrosoft/nanoserverイメージをrunしてコンテナを起動します。
docker runのオプションの-itは対話モード(interactive + tty)になります。

ここではQuick Startと少し内容を変えてcmd.exeでなくpowershell.exeを起動する様にしています。

docker run -it microsoft/nanoserver powershell

実行するとコンテナが起動し、PowerShellで対話できる様になります。

f:id:stknohg:20160805225323p:plain

f:id:stknohg:20160805225331p:plain

$PSVersionTableを確認してみるとちゃんとNano Serverであることがわかります。
ここから背景色がおかしくなってますが、まあ、そんなものでしょう...

f:id:stknohg:20160805225533p:plain

Hello Worldするためのスクリプトを仕込みます。
次のコマンドでC:\helloworld.ps1を作ります。

Add-Content C:\helloworld.ps1 'Write-Host "Hello World"'

結果以下の様になっていればOKです。

f:id:stknohg:20160805225604p:plain

最後はexitして終了します。

次にこの変更をCommitして新たなイメージを作ります。
docker ps -aで先ほどのコンテナを確認します。

docker ps -a

結果は以下の様になり、今回の場合はコンテナIDはc67181b2af2fです。

f:id:stknohg:20160805230442p:plain

docker commitで変更をコミットします。
コマンドの書式は以下となります。

docker commit <コンテナID> <新イメージ名>

今回はコンテナIDをdocker ps -lqで取得しています。
-lは前回実行したコンテナを取得、-qはIDのみ取得になります。

$Id = docker ps -lq
docker commit $Id helloworld

実行するとこんな感じになります。

f:id:stknohg:20160805231149p:plain

docker imagesで確認すると新しいイメージhelloworldができていることがわかります。

f:id:stknohg:20160805231246p:plain

4. Dockerを試す(コンテナの実行)

最後にイメージhelloworldを実行します。

docker run --rm helloworld powershell c:\helloworld.ps1

f:id:stknohg:20160805231447p:plain

ちゃんと新しいイメージからコンテナが実行されHello Worldが表示されました。

最後に

とりあえずこんな感じです。

WindowsコンテナーのイメージはDocker Hubで公開されていますので他のイメージを使って色々すると楽しいでしょう。

次はこのコンテナーの機能とDocker for Windowsが共存可能なのか調べていきたいと思います。

*1:日本語訳もあるのですが若干情報が古い様です...

広告を非表示にする