Anniversary Update(1607)が来てWindows 10でもWindows Serverコンテナーの機能が使える様になったので早速試してみました。
手順
基本的にはMSDNのQuick Start*1の内容に従って試しています。
ただし、後述の問題が発生したため一部の手順はGithub上のドキュメントの手順に差し替えています。
発生した問題
----【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に同様の問題が報告されており、今回こちらの内容を一部反映しています。
検証環境
評価環境には英語版の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.exe
、dockerd.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のインストールは完了です。
バージョンを確認するとこんな感じになります。
3. Dockerを試す(コンテナイメージのPull)
ここからはQuick Startの内容に従ってNano ServerのコンテナイメージをカスタマイズしてHello Worldまでやってみます。
最初にDocker Hubにあるmicrosoft/nanoserverをPullします。
docker pull microsoft/nanoserver
Pullし終わったらdocker images
でイメージを確認してみます。
docker images
結果はこんな感じになります。
3. Dockerを試す(コンテナのデプロイ)
Pullしたmicrosoft/nanoserver
イメージをrun
してコンテナを起動します。
docker run
のオプションの-it
は対話モード(interactive + tty)になります。
ここではQuick Startと少し内容を変えてcmd.exe
でなくpowershell.exe
を起動する様にしています。
docker run -it microsoft/nanoserver powershell
実行するとコンテナが起動し、PowerShellで対話できる様になります。
$PSVersionTable
を確認してみるとちゃんとNano Serverであることがわかります。
ここから背景色がおかしくなってますが、まあ、そんなものでしょう...
Hello Worldするためのスクリプトを仕込みます。
次のコマンドでC:\helloworld.ps1
を作ります。
Add-Content C:\helloworld.ps1 'Write-Host "Hello World"'
結果以下の様になっていればOKです。
最後はexit
して終了します。
次にこの変更をCommitして新たなイメージを作ります。
docker ps -a
で先ほどのコンテナを確認します。
docker ps -a
結果は以下の様になり、今回の場合はコンテナIDはc67181b2af2f
です。
docker commit
で変更をコミットします。
コマンドの書式は以下となります。
docker commit <コンテナID> <新イメージ名>
今回はコンテナIDをdocker ps -lq
で取得しています。
-l
は前回実行したコンテナを取得、-q
はIDのみ取得になります。
$Id = docker ps -lq docker commit $Id helloworld
実行するとこんな感じになります。
docker images
で確認すると新しいイメージhelloworld
ができていることがわかります。
4. Dockerを試す(コンテナの実行)
最後にイメージhelloworld
を実行します。
docker run --rm helloworld powershell c:\helloworld.ps1
ちゃんと新しいイメージからコンテナが実行されHello World
が表示されました。
最後に
とりあえずこんな感じです。
WindowsコンテナーのイメージはDocker Hubで公開されていますので他のイメージを使って色々すると楽しいでしょう。
次はこのコンテナーの機能とDocker for Windowsが共存可能なのか調べていきたいと思います。
*1:日本語訳もあるのですが若干情報が古い様です...