eyecatch
Thu, Sep 15, 2016

Pcap4J on Nano Server on Hyper-V Containers on Windows 10 on VMware Playerにトライ

Pcap4Jが動くHyper-VコンテナをWindows 10上でビルドしようとしたけど3合目あたりで息絶えた話。 Hyper-V Containersとは Hyper-V Containersは、MicrosoftによるWindowsネイティブなコンテナ技術であるWindows Containersの一種で、これによるコンテナは、同じくWindows Containersの一種であるWindows Server Containersのものに比べて、より厳密に隔離されている分、起動コストが高い。 実体はDockerそのもので、コンテナイメージはDocker Hubからpullできるし、コンテナの操作や管理はdockerコマンドでやる。(昔はコンテナ操作用PowerShellコマンドレットもあったが、不評だったので廃止したようだ。) ソースもLinuxとWindowsで一本化されている。 Windows 10のAnniversary Updateで正式にリリースされたが、なんだかあまり注目されていない気がする。 Docker for Windowsとは全く別物なので注意。 Hyper-V Containersのインストール (on VMware Player) 自前のPCが5年前に買ったdynabookでWindows 10をサポートしていないので、VMware PlayerのVM上のWindows 10にHyper-V Containersをインストールしてみる。 VMは、Windows 7に入れたVMware Workstation 11.1.0 build-2496824に付属の VMware Player 7.1.0 build-2496824で作ったもの。 VMのバージョンは11.0。 2CPUでメモリは2.5GB。 ネットワークインターフェースはNAT。 このVMを、Hyper-Vが使えるように設定しておく。 この記事にしたがい、Windows 10の評価版をダウンロード。 今公開されている評価版はAnniversary Update適用済みのバージョン1607で、Hyper-V Containersをサポートしている。 これをさっき作ったVMにインストール。 Windows 10を起動し、以下、Windows Containers on Windows 10に従って進める。 containers機能有効化 PowerShellプロンプトを管理者権限でひらき、以下のコマンドでcontainers機能を有効化。 PS C:\Windows\system32>Enable-WindowsOptionalFeature -Online -FeatureName containers -All 1分程度経つと再起動を促されるので再起動。 Hyper-V機能有効化 再度PowerShellプロンプトを管理者権限で開いて、以下のコマンドでHyper-Vを有効化。 PS C:\Windows\system32>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All 1分程度経つと再起動を促されるので再起動。 OpLocks無効化 現在のHyper-Vコンテナは、安定性を上げるためにOpLocksという機能を無効にすべきらしい。 再度PowerShellプロンプトを管理者権限で開いて、以下のコマンドを実行する。 PS C:\Windows\system32>Set-ItemProperty -Path 'HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers' -Name VSmbDisableOplocks -Type DWord -Value 1 -Force Dockerインストール 同じPowerShellプロンプトで以下のコマンドを実行してDocker(EngineとClient)のアーカイブをダウンロード。 PS C:\Windows\system32>Invoke-WebRequest "https://master.dockerproject.org/windows/amd64/docker-1.13.0-dev.zip" -OutFile "$env:TEMP\docker-1.13.0-dev.zip" -UseBasicParsing ダウンロードしたアーカイブを解凍。 PS C:\Windows\system32>Expand-Archive -Path "$env:TEMP\docker-1.13.0-dev.zip" -DestinationPath $env:ProgramFiles ここまででDockerがC:\Program Files\docker\に入るので、このパスを環境変数PATHに追加。 PATHの変更を反映させるために再度PowerShellプロンプトを管理者権限で開いて、以下のコマンドでDockerデーモンをサービスに登録。 PS C:\Windows\system32>dockerd --register-service Dockerサービスを起動。 PS C:\Windows\system32>Start-Service Docker (Dockerサービスは自動起動に設定されているので、OS再起動時は上記Start-Serviceは不要。) これでDockerが使えるようになった。 PS C:\Windows\system32>docker version Client: Version: 1.13.0-dev API version: 1.25 Go version: go1.7.1 Git commit: 130db0a Built: Sat Sep 10 13:25:48 2016 OS/Arch: windows/amd64 Server: Version: 1.13.0-dev API version: 1.25 Go version: go1.7.1 Git commit: 130db0a Built: Sat Sep 10 13:25:48 2016 OS/Arch: windows/amd64 コンテナイメージダウンロード どうもDockerコマンドの実行には管理者権限が必要なようなので、このまま管理者権限のPowerShellプロンプトで続ける。 docker pullでNano Serverのコンテナイメージをダウンロード。 PS C:\Windows\system32>docker pull microsoft/nanoserver docker imagesで確認。 PS C:\Windows\system32>docker images REPOSITORY TAG IMAGE ID CREATED SIZE microsoft/nanoserver latest 3a703c6e97a2 12 weeks ago 970 MB 試しにコンテナ起動。 PS C:\Windows\system32>docker run -it microsoft/nanoserver cmd 起動はかなり遅い。1分近くかかった。ともあれちゃんと起動した。 Pcap4Jコンテナのビルド Pcap4Jコンテナを、docker buildでビルドしてみる。 Dockerfileはとりあえず以前のものをちょっと書き変えただけのものを試す。 # escape=` # # Dockerfile for Pcap4J on Windows Nano Server # FROM microsoft/nanoserver MAINTAINER Kaito Yamada <[email protected]> # Install Chocolatey.
eyecatch
Mon, Sep 12, 2016

Hyper-Vコンテナ(Nano Server)でunzipしたいならjarを使え

Nano Serverでunzipしたかっただけだったのに、妙に苦労した話。 Nano Serverとは Nano Serverは、Windows Server 2016で追加されるWindows Serverの新たなインストール形式で、Server Coreよりさらに機能を絞り、リモートで管理するクラウドホストやWebサーバ向けにに特化したもの。 Server Coreが数GBくらいなのに対し、Nano Serverは数百MBととても軽量で、それゆえ起動が速くセキュア。 unzipとは unzipとは、zipファイルを解凍する、ただそれだけのこと。 ただそれだけのことで、基本的な機能だと思うのだが、Windowsはこれをコマンドラインで実行する方法をつい最近まで正式に提供していなかった。 Nano Serverでunzip Windows 10のHyper-V Containersの上でPcap4JのビルドとテストをするDockerイメージをビルドしたくて、そのための依存ライブラリなどをインストールする処理をDockerfileに書いていて、ADDでzipをダウンロードしたところまではいいんだけど、このzipどうやって解凍してやろうかとなった。 (Dockerホストに置いたものをコンテナにADDするのはなんか格好悪いから無しで。Dockerfile裸一貫で実現したい。) Windows 10のHyper-V Containersは、現時点でNano Serverしかサポートしていないのが厳しい点。Server Coreだったら楽だったのに。 以下、いろいろ試したことを書く。 正攻法: Expand-Archive PowerShellの v5 で実装されたExpand-Archiveというコマンドレットでzipを解凍できる。 Nano ServerのPowerShellのバージョンを確認したら 5.1 だったのでこれでいけるかと思った。 C:\>powershell -command "$PSVersionTable.PSVersion" Major Minor Build Revision ----- ----- ----- -------- 5 1 14284 1000 したらこのエラー。 Add-Type : Cannot find path 'C:\System.IO.Compression.FileSystem.dll' because it does not exist. At C:\windows\system32\windowspowershell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:914 char:5 + Add-Type -AssemblyName System.IO.Compression.FileSystem + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (C:\System.IO.Compression.FileSystem.dll:String) [Add-Type], ItemNotFoun dException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.AddTypeCommand どうもPowerShellの 5.1 以降には、.NET FrameworkベースのDesktop Editionと、そこから機能を絞った.NET CoreベースのCore Editionがあり、Nano ServerのはCore Editionなんだそうな。 Expand-ArchiveはSystem.IO.Compression.FileSystem.dllの中のZipFileクラスに依存しているんだけど、.NET CoreにはSystem.IO.Compression.FileSystem.dllが含まれていないっぽい。 ShellオブジェクトのCopyHere PowerShellでのunzip方法を調べたらStack Overflowにいくつか載っていた。 Expand-Archiveと、System.IO.Compression.ZipFileを直接使う方法と、Shellオブジェクト(COMオブジェクト)のCopyHereメソッドを使う方法。 最初の2つはCore Editionでは使えないことが分かっているので、3つめにトライ。 こんなの↓ $shell = New-Object -ComObject shell.application $zip = $shell.NameSpace("C:\a.zip") MkDir("C:\a") foreach ($item in $zip.items()) { $shell.Namespace("C:\a").CopyHere($item) } 調べたらこの方法はMicrosoftから非推奨にされていることが分かったんだけど、一応やってみる。 したら以下のエラー。 new-object : Retrieving the COM class factory for component with CLSID {00000000-0000-0000-0000-000000000000} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
eyecatch
Sun, Jul 31, 2016

Docker for Windowsがコレジャナかった

7/28にDocker for Winodws(とDocker for Mac)の正式版リリースのアナウンスがあったので試してみたけど、期待していたものと違ったしなんだか上手く動かなかった話。 Docker for Windowsとは Docker for WindowsはDocker Toolboxの後継製品。(多分。) Docker ToolboxはWindowsやMacでDockerを使うための製品で、以下のコンポーネントからなる。 Docker Engine コンテナランタイム。 Docker Compose 複数のコンテナを組み合わせたアプリケーション/サービスの構築/管理ツール。 Docker Machine Docker仮想ホストのプロビジョニング/管理ツール。 Kitematic Dockerコンテナを管理するGUIを提供する製品。 Docker Machineと連携してローカルマシンへのDocker仮想ホストのプロビジョニングもしてくれる。 Docker Toolboxを使うと、VirtualBoxのLinux VMをWindows/Mac上にプロビジョニングして、そのVMにDockerをインストールして、Windows/Macから利用できる。 Docker for Windowsもだいたい同じで、Docker EngineとDocker ComposeとDocker MachineをWinodwsで利用するための製品。 ElectronベースでOracleのVirtualBox依存なKitematicの代わりに、ネイティブなインストーラがWindows内蔵のHyper-Vを使ってDockerをセットアップしてくれる。 Hyper-Vを使うため、VirtualBoxより速くて高信頼らしい。 KitematicはDocker for Windowsには付属しないが、別途ダウンロードすればコンテナ管理に使える。Docker for WindowsとDocker Toolboxとは共存はできない。 私は勝手にDocker for WindowsはHyper-V ContainersのデスクトップOS版のようなものかと勘違いしていて、Windowsのコンテナが使えるようになったのかと期待したが違った。 Docker for Windowsは単にDocker ToolboxのVirtualBoxがHyper-Vになっただけのもので、結局Linux VMの中でDockerを使うだけのものだということにセットアップ中に気付いた。 コレジャナイ感がすごかった。 ともあれ、やった作業を以下に記す。 Docker for Windows on VMware Player 現時点ではDocker for WindowsはホストとしてWindows 10 x64 Pro/Enterprise/Education (Version 1511 Build 10586 以降)しかサポートしていない。 自前のPCが5年前に買ったdynabookでWindows 10をサポートしていないので、VMware PlayerのVM上のWindows 10にDocker for Windowsをインストールしてみる。 VMware PlayerのVMでHyper-Vを使うための設定 VMware PlayerのVMでは通常Hyper-Vは使えないので、How to Install Hyper-V on vmware Workstation 10 ?を参考にしてVMの設定をいじる。 この記事はVMware Workstationについてのものだが、VMware Playerでも全く同じ方法でいける。 いじるのは、dynabookのWindows 7に入れたVMware Workstation 11.1.0 build-2496824に付属の VMware Player 7.1.0 build-2496824で作ったWindows 10 Pro x64 (Version 1511 Build 10586.494)のVM。 VMのバージョンは11.0。2CPUでメモリは2GB。ネットワークインターフェースはNAT。 このVMの.vmxファイルをテキストエディタで開いて以下を追記。意味は不明。 hypervisor.cpuid.v0 = "FALSE" mce.enable = "TRUE" vhu.enable = "TRUE" 次いで、VMware PlayerのGUIからVMのCPU設定を開き、Intel VT-x/EPTまたはAMD-V/RVIを仮想化とCPUパフォーマンスカウンタを仮想化にチェックを付ける。意味はなんとなくしかわからない。 これだけ。 Hyper-VはDocker for Windowsのインストーラが有効化してくれるのでここでは何もしなくていい。 Docker for Windowsインストール VMを起動して、Getting Started with Docker for Windowsに従ってDocker for Windowsをインストールする。 まず、上記サイト内のリンクからインストーラをダウンロード。stableの方。 ダウンロードしたInstallDocker.msiをVM上で実行してウィザードに従えばインストール完了。 ウィザードの最後でLaunch Dockerにチェックが付いた状態でFinishするとDockerを起動してくれる。 この起動中にHyper-Vを有効化してくれる。(OS再起動有り。) OS再起動後、「Failed to create Switch “DockerNAT”: Hyper-V was unable to find a virtual switch with name “DockerNAT”」というエラー出た。DockerNATが見つからない?
eyecatch
Mon, Jul 11, 2016

Windows Server 2016 TP5でWindows Containersにリトライ

Windows Server 2016のTechnical Preview 5(TP5)が公開されていたので、 TP4でバグに阻まれて挫折した、Windows ContainersでPcap4Jを使ってパケットキャプチャする試みにリトライした話。 OSセットアップ TP4のときと同じ環境。 以降はWindows Server Containersのクイックスタートガイドに沿ってセットアップを進める。 TP4からは大分変わっていて、単一のPowershellスクリプトを実行する形式から、Powershellのコマンドレットを逐次手動実行する形式になっている。 面倒だけど何やってるかわかりやすくて好き。 コンテナ機能のインストール 管理者権限のパワーシェルウィンドウを開く コマンドプロンプトから以下のコマンドを実行。 powershell start-process powershell -Verb runas コンテナ機能のインストール 開いた青いパワーシェルウィンドウで以下のコマンドを実行するとコンテナ機能がインストールされる。 Install-WindowsFeature containers 数分で終わる。 インストールされたのはHyper-V ContainersじゃなくてWindows Server Containersの方。 クイックスタートガイドをみると、前者がWindows 10向け、後者がWindows Server向けというように住み分けされているっぽい。TP4では両方ともWindows Serverで使えたんだけど。 再起動 変更を有効にするために再起動が必要。 Restart-Computer -Force Dockerインストール Dockerは、コンテナイメージの管理やコンテナの起動などもろもろの機能を提供するDockerデーモンと、その機能を利用するためのCLIを提供するDockerクライアントからなる。この節ではそれら両方をインストールする。 Dockerインストールフォルダ作成 管理者権限のパワーシェルウィンドウを開いて、以下のコマンドでDockerインストールフォルダを作成。 New-Item -Type Directory -Path 'C:\Program Files\docker\' Dockerデーモンインストール まずはデーモンの方をインストール。 Invoke-WebRequest https://aka.ms/tp5/b/dockerd -OutFile $env:ProgramFiles\docker\dockerd.exe -UseBasicParsing 数分。 Dockerクライアントインストール 次にクライアント。 Invoke-WebRequest https://aka.ms/tp5/b/docker -OutFile $env:ProgramFiles\docker\docker.exe -UseBasicParsing 数十秒。 パスの設定 さっき作ったDockerインストールフォルダにパスを通す。 [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Docker", [EnvironmentVariableTarget]::Machine) Dockerデーモンをサービスに登録 パスの設定を反映するためにいったんパワーシェルウィンドウとコマンドプロンプトを閉じて、 また管理者権限でパワーシェルウィンドウ開いて、以下のコマンドでDockerデーモンをサービスに登録する。 dockerd --register-service Dockerデーモン起動 Dockerデーモンは以下のコマンドで起動できる。 Start-Service docker 数秒で立ち上がる。 デフォルトではOS再起動時にはDockerデーモンは自動起動しないので、そのつどこのコマンドを実行する必要がある。 これでDockerインストール完了。 この時点ではコンテナイメージは何もない。 C:\Users\Administrator>docker images REPOSITORY TAG IMAGE ID CREATED SIZE 因みにインストールされたDockerのバージョンは1.12開発版。現時点での最新版だ。 C:\Users\Administrator>docker -v Docker version 1.12.0-dev, build 8e92415 コンテナイメージのインストール 次に、コンテナイメージをインストールする。 コンテナイメージのパッケージプロバイダをインストール いまいち何なのかはよくわからないが、 コンテナイメージのパッケージプロバイダというのをインストールする。 Install-PackageProvider ContainerImage -Force 数十秒。 Windows Server Coreのイメージをインストール Install-ContainerImage -Name WindowsServerCore 9GB以上もあるファイルをダウンロードして処理するのでかなり時間がかかる。 50分くらいかかった。 Dockerデーモン再起動 Restart-Service docker 無事Windows Server Coreイメージがインストールされた。 PS C:\Users\Administrator> docker images REPOSITORY TAG IMAGE ID CREATED SIZE windowsservercore 10.0.14300.1000 5bc36a335344 8 weeks ago 9.354 GB Pcap4Jコンテナイメージのビルド 以下をC:\Users\Administrator\Desktop\pcap4j\Dockerfileに書いて、cd C:\Users\Administrator\Desktop\pcap4jして、docker build -t pcap4j .を実行。 (Notepad使ったので、拡張子を表示する設定にしてDockerfileの.txtを消さないといけない罠があった。) # # Dockerfile for Pcap4J on Windows # FROM windowsservercore:10.0.14300.1000 MAINTAINER Kaito Yamada <[email protected]> # Install Chocolatey.