2015年8月にリリースされたWindows Server 2016 Technical Preview 3(TP3)で初めてサポートされた注目すべき新機能、Windows Server コンテナ(Windows Server Container)。Windows Serverが提供するコンテナサービスは、Windows Server 2016 Technical Preview 4(TP4)がリリースされ、アップデートされたことにより、さらに注目されているHyper-Vコンテナが利用できるようになりました。現時点ではWindows Server コンテナはPowerShellを使って管理することができます。
PowerShellを使ってコンテナの基盤となるコンテナホストを構築して、実際に動くコンテナとしてIISをインストールし、Webサイトを公開するまでの手順を追って紹介します。
※IISコンテナを作成する場合、TP4の時点では日本語版にまだ不具合があるようなので、英語版を使用して紹介します。
目次
コンテナホストの作成
今回はHyper-Vコンテナではなく、Windows Serverコンテナを使っていきます。
Windows Server 2012 R2 Hyper-Vの仮想マシンとして、コンテナホストを作成します。まずはTP4(英語版)をダウンロードします。
Windows Server 2016 TP4のダウンロードサイト
作成する仮想マシンは、分かりやすいようにGUI付きをインストールしています。
コンテナホストを構築するには、コンテナイメージやセットアップスクリプトをダウンロードする必要があるので、作成した仮想マシンがインターネットに接続できるようにネットワークの設定を行っておきます。
インターネットに接続できる状態になったら、スタートメニューからPowerShellを管理者権限で実行し、以下のコマンドで「ContainerSetup.ps1」をダウンロードして実行します。
wget -uri https://aka.ms/tp4/Install-ContainerHost -OutFile C:\Install-ContainerHost.ps1
.\ContainerSetup.ps1
C:\Install-ContainerHost.ps1
スクリプトの実行後、しばらく待つと再起動となります。
ログイン後、自動的にコンテナサービスの設定が行われ、コンテナのベースとなるイメージファイルが C:\Windows\system32\ContainerBaseImage.wim にダウンロードされます。ダウンロード完了までしばらく時間がかかりますので、このままの状態で待ちます。ダウンロードが完了すると、コンテナOSイメージが「WindowsServerCore」という名前でインストールされます。このコンテナイメージを元に、コンテナを作成したり、新しいコンテナイメージを作成していきます。
続いて、サードパーティツールのNSSM(https://nssm.cc/usage)を利用して、Docker Daemonのインストールが行われています。Docker Daemonサービスを介して、Windows ServerコンテナをDockerのコマンドからも操作することが可能となります。
すべてのインストールが完了すると、コンテナホストとなる仮想マシンに新たにネットワークアダプターが追加されています。この追加されたネットワークを使用して、コンテナとの通信を行います。
コンテナホストのサービス一覧を見てみると、Hyper-V関連のサービスがいくつか追加されています。コンテナサービスはHyper-Vのテクノロジーを利用して実現しているようです。
以上でコンテナホストの構築が完了しました。
コンテナの作成
コンテナホストの構築が完了したので、実際にコンテナを作成していきます。コンテナ関連の操作はPowerShell、Dockerコマンドどちらでも可能ですが、今回はPowerShellを使っていきます。コンテナは、元となるコンテナイメージから作成していきますので、まずはコンテナ関連のPowerShellのコマンドを確認しておきます。
Get-Command -Module Containers
Windows Server コンテナの大本となるコンテナOSイメージは、「WidowsServerCore」となり、コマンドベースのWindows Serverとなっています。C:\ProgramData\Microsoft\Windows\Images に格納されていますので、コンテナイメージを確認しておきます。
Get-ContainerImage
コンテナを作成します。
New-Container -Name "MyContainer" -ContainerImageName “WindowsServerCore” -SwitchName "Virtual Switch"
-Name:コンテナ名
-ContainerImageName:テンプレートとなるコンテナイメージ
-SwitchName:コンテナが接続する仮想スイッチ、“Get-VMSwitch”で確認
コマンドが実行されると、作成されたコンテナが表示されます。コンテナの一覧は“Get-Container”コマンドを使っても表示することができます。作成されたコンテナは、C:\ProgramData\Microsoft\Windows\Hyper-V\Containers に保存されます。
コンテナの操作
作成したコンテナをPowerShellで操作してみましょう。
まずはコンテナを起動します。
“Get-Container”コマンドで確認すると「State」が“Running”に変わっています。
Start-Container -Name "MyContainer"
起動したコンテナを管理するには、PowerShellをリモートから実行することで可能となります。PowerShellをリモートで実行するには、“Invoke-Command”コマンド、もしくは“Enter-PSSession”コマンドを利用します。
(1) Enter-PSSession
初めに“Enter-PSSession”の例です。
Start-Container -Name "MyContainer"
コンテナにPowerShellのセッションが張られると、
[xxxxxxxx-xxx]: PS C:\Windows\system32>
のようなプロンプトとなります。これはコンテナIDの頭11桁となります。以後のコマンドはコンテナ内で実行されることになります。
続いて、“ipconfig”コマンドでコンテナのネットワーク設定を確認します。コンテナにIPアドレスが割り当てられているのが確認できます。
コンテナホストがインターネットに接続できる状態であれば、コンテナ内からもインターネットに接続できる状態になっています。
試しに“ping”コマンドを実行しましょう。インターネットに接続できているようです。DNSは“ipconfig /all”で見てみると、コンテナホストのDNSをそのまま利用しています。
コンテナのPowerShellセッションの接続を終了するには、“exit”コマンドを実行します。
(2)Invoke-Command
“Invoke-Command”コマンドを使用しても、同様の結果が取得できます。
“Invoke-Command”の場合は、コンテナ内で実行したいコマンドを-ScriptBlock { }で指定する方法なので、コンテナにPowerShellのセッションを張る必要はありません。
$Container = Get-Container -Name "MyContainer"
Invoke-Command -ContainerId $Container.ContainerId -ScriptBlock {ipconfig}
以上で、コンテナ自体を操作る2つの方法を紹介しました。最後にコンテナを停止して、削除するには、以下となります。
Stop-Container -Name "MyContainer"
Get-Container -Name "MyContainer" | Remove-Container –Force
コンテナイメージの作成
一通りコンテナの操作ができるようになったところで、次はテンプレートとなるコンテナイメージを作成してみましょう。コンテナイメージは、自身が作成したコンテナから作成することができます。「WindowsServerCore」のコンテナイメージから作成したコンテナを、新しいコンテナイメージとして保存します。さらに、保存した新しいコンテナイメージからコンテナを作成し、別のコンテナイメージを作成…、というように、コンテナイメージはHyper-Vのチェックポイントのように、少しずつ変更を加えながら、次々と作り出すことができます。
新しくコンテナイメージを作成します。
New-ContainerImage -ContainerName “MyContainer” -Publisher “WIN1” -Name “MyContainerImage01” -Version 1.0
-ContainerName:先ほど作成したコンテナ名を指定します。このコンテナを元にコンテナイメージを作成します。コンテナは停止しておく必要があります。
-Publisher:コンテナイメージの作成者の名前
-Name:コンテナイメージ名
-Version:任意のバージョン
作成したコンテナイメージをエクスポートしてAPPXファイルとし、他のコンテナホストにインポートすることで、コンテナイメージを配布することも可能です。
エクスポート
$image = Get-ContainerImage -Name “MyContainerImage01”
Export-ContainerImage -Image $image -Path "C:\"
インポート
Import-ContainerImage -Path "C:\CN=WIN1_ MyContainerImage01_1.0.0.0.APPX"
コンテナイメージを削除する場合は、“Remove-ContainerImage”コマンドで削除します。
Get-ContainerImage -Name “MyContainerImage01”| Remove-ContainerImage –Force
IISコンテナイメージの作成と展開
一通りコンテナの操作ができるようになったところで、実際にアプリケーションがインストールされたコンテナイメージを作成して、利用してみましょう。今回は、コンテナにWebサーバーとしてIISをインストールして、コンテナイメージを作成します。コンテナとして簡単にIISのコンテナを展開して利用できることを確認します。
●コンテナのイメージの作成
TP4の現時点では、IISコンテナイメージを作成するには日本語版では不具合があるようなので、英語版のTP4を利用しています。
IISをインストールするコンテナを作成します。
$Container = New-Container -Name "IIS Container" -ContainerImageName “WindowsServerCore” -SwitchName "Virtual Switch"
コンテナを起動します。
Start-Container $Container
コンテナにPowerShellセッションを接続します。
Enter-PSSession -ContainerId $Container.ContainerId –RunAsAdministrator
コンテナにIISをインストールします。
Install-WindowsFeature Web-Server
PowerShellのセッションの接続を閉じて、コンテナを停止します。
Exit
Stop-Container $Container
IISコンテナを元に、コンテナイメージを作成します。
New-ContainerImage -ContainerName $container.Name -Publisher "WIN1" -Name "IISContainerImage" -Version 1.0
IISをインストールしたコンテナをコンテナイメージとして保存しておくことで、何度でもコピーして使い回すことができるようになりました。また、コンテナイメージをエクスポートして、このコンテナホストにインポートすることで、コンテナイメージを配布することも可能です。
●IISコンテナの公開
続いて、IISコンテナのWebサイトの公開方法です。先ほど作成したIISコンテナを使って、Webサイトを参照できるようにしてみましょう。コンテナは、コンテナホストとNATを使って接続されています。コンテナホストのNATにポートフォワードの設定を行うことで、コンテナのWebサイトを公開できるようになります。
コンテナのネットワーク情報を確認します。コンテナのIPアドレスは自動的に割り当てられた“172.16.0.2”となっています。
$Container = Get-Container -Name "IIS Container"
Start-Container $Container
Invoke-Command -ContainerId $Container.ContainerId -ScriptBlock {ipconfig}
コンテナのNATの設定を確認します。NATの名前を確認すると、“ContainerNAT”と定義されています。
Get-NetNat
NATにポートフォワードの設定を追加します。
Add-NetNatStaticMapping -NatName "ContainerNAT" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.16.0.2 -InternalPort 80 -ExternalPort 80
-NatName:NAT名
-Protocol :HTTPの公開なのでTCP
-ExternalIPAddress:0.0.0.0
-InternalIPAddress:IISコンテナのIPアドレス
-InternalPort:コンテナのWebサイトのポート番号
-ExternalPort :公開するポート番号
Webを公開するので、コンテナホストのファイアウォールのTCP80番ポートを開きます。GUIの「Windowsファイアウォール」でも設定可能です。
if (!(Get-NetFirewallRule | where {$_.Name -eq "TCP80"})) {New-NetFirewallRule -Name "TCP80" -DisplayName "HTTP on TCP/80" -Protocol tcp -LocalPort 80 -Action Allow -Enabled True}
以上の設定で、Webサイトが参照できる状態となりました。ブラウザで確認してみましょう。
NATの接続状況は、“Get-NetNatSession”コマンドで確認することができます。
Get-NetNatSession
以上で、実際にIISのコンテナを作成し、コンテナイメージとして保存、公開して、Webサイトを参照するところまでが完了しました。コンテナは、この繰り返しで次々に作成~展開まで行うことができます。
IISだけではなく、今後様々なアプリケーションがインストールされたコンテナイメージを作成して、素早く環境を展開できるようになります。コンテナ技術による、さらなる効率アップが期待できそうです。
著書の紹介欄
Hyper-Vで本格的なサーバー仮想環境を構築。仮想環境を設定・操作できる!
できるPRO Windows Server 2016 Hyper-V
◇Hyper-Vのさまざまな機能がわかる ◇インストールからの操作手順を解説 ◇チェックポイントやレプリカも活用できる Windows Server 2016 Hyper-Vは、仮想化ソフトウェア基盤を提供する機能であり、クラウドの実現に不可欠のものです。 本書では、仮想化の基礎知識から、Hyper-Vでの仮想マシンや仮想スイッチの設定・操作、プライベートクラウドの構築、Azureとの連携などを解説します。
初めてのWindows Azure Pack本が発売
Windows Azure Pack プライベートクラウド構築ガイド
本書は、Windows Azure PackとHyper-Vを利用し、企業内IaaS(仮想マシン提供サービス)を構成するための、IT管理者に向けた手引書です。試用したサーバーは、最小限度の物理サーバーと仮想マシンで構成しています。Windows Azure Packに必要なコンポーネントのダウンロード、実際にプライベートクラウド構築する過程を、手順を追って解説しています。これからプライベートクラウドの構築を検討するうえで、作業負担の軽減に役立つ一冊です。
ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(408)
-
イベント(147)
-
カルチャー(35)
-
デザイン(13)
TAG
- 5G
- Adam byGMO
- AI
- AWX
- BIT VALLEY
- blockchain
- ChatGPT
- cloudnative
- CloudStack
- CM
- CNDO
- CNDT
- CODEGYM Academy
- ConoHa
- CS
- CSS
- CTF
- DC
- Designship
- DevSecOpsThon
- Docker
- DTF
- GitLab
- GMO Developers Day
- GMO Developers Night
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOイエラエ
- GMOグローバルサイン
- GMOデジキッズ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOリサーチ
- Go
- GTB
- Hardning
- Harvester
- HCI
- iOS
- IoT
- ISUCON
- JapanDrone
- Java
- JJUG
- K8s
- Kids VALLEY
- MetaMask
- MySQL
- NFT
- OpenStack
- Perl
- PHP
- PHPcon
- PHPerKaigi
- QUIC
- Rancher
- RPA
- Ruby
- Selenium
- splunk
- SRE
- SSL
- Terraform
- TLS
- TypeScript
- UI/UX
- VLAN
- VS Code
- インターンシップ
- オブジェクト指向
- オンボーディング
- お名前.com
- カルチャー
- コンテナ
- スクラム
- スペシャリスト
- ソフトウェアテスト
- チームビルディング
- ドローン
- ネットワーク
- プログラミング教育
- ブロックチェーン
- ゆめみらいワーク
- リモートワーク
- 基礎
- 多拠点開発
- 大学授業
- 宮崎オフィス
- 応用
- 技育プロジェクト
- 新卒
- 暗号
- 機械学習
- 決済
PICKUP