Anniversary Update(1607)が来てWindows 10でもHyper-Vコンテナーの機能が使える様になったので早速試してみました。
注意事項
本エントリは2016/08/05に公開後、2016/09/28に最新の情報に基づいて全面的に書き直しています。
2016/10/18 追記
Docker for Windows 1.12.2 Bata26以降で、Docker for Windowsにdockerd.exe
が同梱される様になりました。
(現時点ではまだBeta Channelのみの配信ですが...)
Docker for Windowsとの併用を考えているのであればこちらをインストールしてしまう方が楽かもしれません。
以降の手順は、Docker for Windowsを使わない、Hyper-Vコンテナーの機能を単体で使う場合のものとなります。
手順
基本的にはMSDNのQuick Start*1の内容に従って試しています。
このQuick StartではGithubからDocker 1.13の開発版をダウンロードしていますが、開発版は日々更新され不安定なビルドもあるため(実際この書き直しをする際のビルドではdocker run
するとハングする事象に遭遇してしまいました...)今のところ確実に利用できるDocker 1.12.1を使う様にしています。
エントリ公開当時に発生した問題
公式に提供されているDocker 1.12だとdocker run
時にエラーが出てしまいます。
エラーメッセージはこんな感じで、
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 14393)を使いました。
初期セットアップが終わって最低限のネットワーク設定済みの状態で試しています。
Windows 10のコンテナーとDockerを試す
以降の手順は基本的に要管理者権限です。
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
Windows 10 は Hyper-V コンテナーにのみ対応しているためHyper-Vも有効にする必要があります。
以前にDockerを試してレジストリの変更をした場合は以下のコマンドでもとに戻しておく必要があります。
(今回が初回の場合は何もしなくてOKです)
# 以前の問題に対応するためのレジストリの変更の取り消し Set-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers' -Name VSmbDisableOplocks -Type DWord -Value 0 -Force # 以下のレジストリ変更をした場合に戻す必要があります #Set-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers' -Name VSmbDisableOplocks -Type DWord -Value 1 -Force
2. Dockerのインストール
最初に述べた通りDockerはVer.1.13の開発版ではなく、GitHub上にあるVer.1.12.1をインストールします。
PowerShellから以下のコマンドを実行し、$env:ProgramFiles\docker\
にdocker.exe
、dockerd.exe
、docker-proxy.exe
を配置します。
# ダウンロード Invoke-WebRequest "https://get.docker.com/builds/Windows/x86_64/docker-1.12.1.zip" -OutFile "$env:TEMP\docker-1.12.1.zip" -UseBasicParsing # 解凍 Expand-Archive -Path "$env:TEMP\docker-1.12.1.zip" -DestinationPath $env:ProgramFiles
【2017/03/17追記】
現在の最新バージョンは17.03
です。
各バージョンはGitHubのReleaseで公開されていますので、ここから必要なバージョンをダウンロードするのがよさそうです。
# 64Bit版をダウンロードする例 Invoke-WebRequest -Uri "https://get.docker.com/builds/Windows/x86_64/docker-17.03.0-ce.zip" -OutFile "$env:TEMP\docker-17.03.0-ce.zip" -UseBasicParsing Expand-Archive -Path "$env:TEMP\docker-17.03.0-ce.zip" -DestinationPath $env:ProgramFiles
【追記ここまで】
配置後、$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は1258d515295e
です。
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:日本語訳もあるのですが若干情報が古い様です...