Operations Lab.

Posts Tagged ‘Docker

Container SIG Meet-up 2016 Fall に参加しました

leave a comment »

10/7 (金)に Container SIG (Special Interest Group)の初イベントがありました。コンテナはインフラ観点でも Windows 観点でも Hot な Topic なので、一般の参加者として参加してきました。

会場は IIJ のセミナールームで、参加登録者(キャンセルした人を除く)はなんと 172 名と、初回のイベントにしてはかなり注目されているように感じました。

全体を通して

私はコンテナにそこまで詳しくないので、歴史を振り返るセッションから応用セッションまで楽しく聴講させていただきました。参加者の属性としては、コンテナに触ったことがある方がほとんどだけど、本番環境で運用している方は数名、という感じだった気がします。

セッション1:Linuxのコンテナ技術の変遷

IIJ 花高さんによる、Linuxのコンテナ技術の変遷について。コンテナ初心者かつ、普段最新情報を追いかけていない人にとっては、とても勉強になりました。なんとなく断片的に知っている内容も多いですが、改めて情報を整理できました。

セッション2:Dockerは2016年の秋現在、どのような状況なのか

さくらインターネットの前佛さん(@zembutsu)による、直近のコンテナ(主に Docker 周り)関連情報のまとめセッション。Docker はアップデートが早く、最新情報を追いかけるのも大変なので、大変助かります。最近は Docker がカバーする領域も広がってきていて、カオスですしね。

セッションスライドは SlideShare で、既に公開されています

ところで、Docker 日本語訳(Docker ドキュメント日本語化プロジェクト)って前佛さんの趣味個人プロジェクトだったのですね。

セッション3:Ansible Container – Container Automation with Ansible

Redhat 橋本さんによる Ansible を使ったコンテナの Automation に関するセッション。コンテナのデプロイを Ansible からコントロールするなど、Ansible ユーザー視点では順当な内容に思えました。本番環境でまじめにコンテナを運用管理するのであればアリかもしれません。既に Ansible で構成管理(Infrastructure as Code / Configuration as Code)を行っているところは多そうですし。

個人的には、Docker は Docker でコントロールする領域が増えてきているので、Ansible との連携がどの程度カバーしていけるか(追従していけるか)や、どのようにすみ分けていくか(ベストプラクティス的な意味でも)が気になります。

セッション4:Google Container Engineで五目並べアプリのAPIサーバーを作る

Google の中井さん(@enakai00)による、Google Container Engine を使用して五目並べのアプリケーションコンテナを起動し、サービスを提供する(API 経由でクライアントからのリクエストに応答する)というライブデモセッション。

やはり、ライブで構成(デプロイ、設定)するのはセッションとしてのインパクトが大きいですね。コンテナをステートレスにしておき、サービスをオンラインのまま、構成ファイルを書き換えてアプリをバージョンアップする(実際にはブルーグリーンデプロイメントによって本番環境がバックグラウンドで入れ替わっている)部分なども、普段からクラウドアプリケーションのバージョンアップを行っている人には当たり前ですが、レガシーアプリケーションが多い人には面白く映ったのではないかと思います。

セッションの内容は、Web で公開されています。また、デモで使用されていたコードも GitHub で公開いただいているようです。

セッション5:DDoS vs. DockerコンテナホスティングArukas

さくらインターネットの山田さん(現 Container SIG 会長)による、Arukas に DDoS を撃ち込まれた際のお話。Arukas はさくらインターネットさんが提供している Container ホスティングサービス(現在 Beta)ですが、オープンに(かつ日本で)利用可能な Docker のホスティングサービスはかなり珍しいので、お話を伺えるのは貴重な機会でした。

Arukas のユーザは 15000 人程度ということで、日本はそのうち 3000 ユーザ程度のようです。さくらさんのサービスは海外のユーザからもかなり利用されているんですね。Arukas が Beta で今のところは無償利用できる、というのと世界的にもコンテナホスティングはそれほど多くない、というのも要因としてあるとは思いますが。

DDoS のお話については、割と想像していた通りの内容でした。色々言ってしまって大丈夫なのか、心配になりました。まる。

アプリケーションエンジニアの方々におきましては、ぜひともコンテナのベースセキュリティ設定を見直していただきたく思います。インフラエンジニアは、もっと(今までインフラレイヤーの方々が OS などで培ってきた)情報を発信していかないといけないな、とも思っています。

次回

次回は半年後の予定(もしかしたらもう少し早いタイミングかも)ということなので、自分も Container への理解を深めつつ次回以降も参加していきたいと思いました。

広告

Written by kazu

2016/10/10 at 02:15

Docker はコンテナそのものではない(はず…)

leave a comment »

最近、あまりにも Docker という言葉が曖昧なコンテキストで使われているので、少しまとめてみます。

おことわり

  • 旧来の Docker について記載します。(Docker ファミリーはどんどん進化(領域拡大)しているので、将来的にはこのポストの内容が誤りになるかもしれません。)
  • 2016 年 9 月時点の情報をベースにしています。
  • 分かりやすさを優先するため、厳密には正しくない記載(割り切った記載)が含まれます。
  • 誤りがあれば、ぜひご指摘ください。(特に有識者の方)

初めに

Docker コンテナそのものを実現する(実行する)仕組み(機能)

乱暴に言うと、Docker はコンテナそのものではありません。仮想マシンに例えて言うなら、Windows Hyper-V における Hyper-V (ハイパーバイザ)そのものではありません。

Docker (または Docker コンテナとは)

ざっくり言うと、以下の 3 つ(のどれか)です。

  1. コンテナイメージのフォーマット(の一種)
  2. コンテナを管理・制御するためのサービスおよびツール群(dockerd および docker cli)
  3. コンテナイメージを管理、再利用するためのレポジトリ (Docker Hub, Docker Registry)

これらを含めて Docker エコシステムが形成されています。

結局 Docker は何をしてくれているのか

コンテナそのものは、(Linux であれば)Linux Containers (各種ネームスペースや cgroups などの、Linux kernel の機能)により実現されています。Windows Server 2016 の場合は、「Containers」の機能(Windows Containers / Hyper-V Containers)によって実現されています。

Docker はコンテナを実現する仕組みをうまくコントロールし、管理を行うためのサービスやユーザーインタフェースを提供してくれています。

乱暴な言い方をすると、Hyper-V の世界でいうところの、System Center Virtual Machine Manager (SCVMM) や、Hyper-V Manager、Virtual Machine Management Services (vmms)のようなものを提供してくれています。

参考資料

Written by kazu

2016/09/17 at 15:43

カテゴリー: Containers, Linux, Windows Server

Tagged with ,

Windows 10 with Hyper-V で NAT を使用する

leave a comment »

※ このポストで取り扱っている NAT は、内部ネットワークから外部へ通信を行う際の Source NAT(SNAT)です。実際はポート変換も実行されるため、SNAPT (Source Network Address/Port Translation)になります。

Windows 10 Anniversary Update (Version 1607)で、Hyper-V 上の仮想マシンが外部へ通信する際に NAT を行うことが(標準の機能のみで)できるようになりました。

いままでは

Hyper-V の機能、または仮想スイッチの機能としては NAT を行うことができなかったため、仮想マシンが外部と通信を行う場合は、以下何れかの方法で外部通信を実現していました。

  • 外部(External)仮想スイッチで直接外部に接続する
  • Hyper-V ホストで、「インターネット接続共有」(クライアント OS の場合)または「ルーティングとリモートアクセス」の役割(サーバー OS の場合)を構成する
  • (NAT 用の VM を作成して、NAT を適用する)
    ※この方法は、結局他の方法で NAT VM を外部接続させる必要があります。

ノート PC などで、Hyper-V ホストの外部インターネットアクセスが無線 LAN アダプターとなっているような環境では、External スイッチへ VM を直接接続しても正しく通信が行えない(※)ため、ホスト側で「インターネット接続共有」を有効化して使用していた方も多いと思います。

※ External 仮想スイッチの場合、VM の MAC アドレスは変換されない(VM の仮想 NIC に付与された MAC アドレスで通信を行う)ため、無線アクセスポイントとの通信が正しく行えません。

今回の機能(Hyper-V 仮想スイッチでの NAT)により、無線 LAN 環境下であっても、インターネット接続共有や RRAS を使用せず外部へ通信できるようになります。

利用するには

Hyper-V の機能が有効化された Windows 10 Build 14295 が必要です。Windows 10 Anniversary Update は Build 10393 なので利用することができます。Windows Server 2016 でも(リリースされれば)利用できると思われます。(サーバー OS に無線 LAN アダプターを接続する人は少ないと思いますので、直接的な恩恵は少ないと思いますが。)

注:後述の通り、NAT スイッチには制限があるため、サーバー(システム)環境で多数のセグメントを収容し、NAT を行いたい場合は、今まで通り RRAS を使うか NAT 用の VM (仮想アプライアンス)を使用したほうが良いと思います。

設定方法

以下の流れで設定します。

  1. Hyper-V ホスト側に外部通信可能なインタフェースを用意し、IP アドレスを設定する(ホストが外部通信できる状態にする)
  2. 「内部」の(Internal タイプの)仮想スイッチを作成する
  3. ホスト OS 上に作成された(Internal 仮想スイッチに接続された)仮想 NIC (vEthernet)に IP アドレスを設定する
  4. (仮想 NIC に設定した IP アドレスをレンジに含む)NAT ネットワークを設定する

ホスト側の外部通信可能なインタフェース

これは、通常通りホスト上で IP アドレスをアサインし、ホストが外部通信可能であれば OK です。外部通信用の NIC を仮想スイッチにバインドする必要はありません。

Internel vSwitch の作成

Hyper-V マネージャーまたは PowerShell で仮想スイッチを作成します。このとき、SwitchType に Internal (内部)を指定します。

※ PowerShell で作業を行う場合は「管理者として実行」します。(以下同様)

下記の例では、「Internal」という名前の内部(Internal タイプの)仮想スイッチを作成しています。(名前は他の仮想スイッチと重複しなければ何でも OK 。)

PS C:\> New-VMSwitch -Name Internal -SwitchType Internal

Name      SwitchType NetAdapterInterfaceDescription
----      ---------- ------------------------------
Internal  Internal

PS C:\> Get-VMSwitch -Name Internal | fl *

Name                                : Internal
Id                                  : c51a5bd2-c53c-48f0-af9d-742f477fbfec
Notes                               :
Extensions                          : {Microsoft Windows フィルタリング プラットフォーム, Microsoft NDIS キャプチャ}
BandwidthReservationMode            : Absolute
PacketDirectEnabled                 : False
EmbeddedTeamingEnabled              : False
IovEnabled                          : False
SwitchType                          : Internal
AllowManagementOS                   : True
NetAdapterInterfaceDescription      :
NetAdapterInterfaceDescriptions     :
IovSupport                          : False
IovSupportReasons                   :
AvailableIPSecSA                    : 0
NumberIPSecSAAllocated              : 0
AvailableVMQueues                   : 0
NumberVmqAllocated                  : 0
IovQueuePairCount                   : 0
IovQueuePairsInUse                  : 0
IovVirtualFunctionCount             : 0
IovVirtualFunctionsInUse            : 0
PacketDirectInUse                   : False
DefaultQueueVrssEnabledRequested    : True
DefaultQueueVrssEnabled             : False
DefaultQueueVmmqEnabledRequested    : False
DefaultQueueVmmqEnabled             : False
DefaultQueueVmmqQueuePairsRequested : 16
DefaultQueueVmmqQueuePairs          : 0
BandwidthPercentage                 : 0
DefaultFlowMinimumBandwidthAbsolute : 0
DefaultFlowMinimumBandwidthWeight   : 0
CimSession                          : CimSession: .
ComputerName                        : TAKAI02
IsDeleted                           : False

PS C:\>

Internal vSwitch のホスト側仮想インタフェース(vEthernet)に IP を設定

コントロールパネル(ネットワーク接続)または PowerShell で、ホスト側に作成された仮想 NIC に IP アドレスを設定します。ここで指定した IP アドレスが、VM から見た時の GW アドレスになります。

※ 上記ホスト側仮想 NIC にはデフォルトゲートウェイを設定する必要はありません。

下記の例では、192.168.137.1/24 をホスト側の仮想 NIC へアサインしています。(192.168.137.0/24 はインターネット接続共有で使用される IP アドレスレンジなので、競合する場合は他のレンジを使用したほうが良いでしょう。)

PS C:\> Get-NetAdapter | ft Name,ifIndex,InterfaceDescription,Status

Name                       ifIndex InterfaceDescription                     Status
----                       ------- --------------------                     ------
Bluetooth ネットワーク接続      20 Bluetooth Device (Personal Area Network) Disconnected
vEthernet (Internal)            12 Hyper-V Virtual Ethernet Adapter         Up
Wi-Fi                            3 Intel(R) Dual Band Wireless-AC 7260      Up

PS C:\> New-NetIPAddress -InterfaceIndex 12 -AddressFamily IPv4 -IPAddress 192.168.137.1 -PrefixLength 24

IPAddress         : 192.168.137.1
InterfaceIndex    : 12
InterfaceAlias    : vEthernet (Internal)
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Tentative
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

IPAddress         : 192.168.137.1
InterfaceIndex    : 12
InterfaceAlias    : vEthernet (Internal)
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Invalid
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : PersistentStore

PS C:\> Get-NetIPAddress -InterfaceIndex 12

IPAddress         : fe80::103e:d542:892c:f48c%12
InterfaceIndex    : 12
InterfaceAlias    : vEthernet (Internal)
AddressFamily     : IPv6
Type              : Unicast
PrefixLength      : 64
PrefixOrigin      : WellKnown
SuffixOrigin      : Link
AddressState      : Preferred
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

IPAddress         : 192.168.137.1
InterfaceIndex    : 12
InterfaceAlias    : vEthernet (Internal)
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 24
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Preferred
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

PS C:\>

NAT ネットワークの設定

ホスト側で PowerShell を使用し、NAT ネットワークを作成します。New-NetNat コマンドに Name (ネットワーク識別名)と InternalIPInterfaceAddressPrefix (NAT 対象となるネットワークプレフィックス)を指定するだけです。

下記の例では、「VMNatNetwork」という名前の NAT ネットワーク(設定)を作成しています。InternalIPInterfaceAddressPrefix に指定した 192.168.137.0/24 からの通信が NAT 対象となります。

PS C:\> New-NetNat -Name VMNatNetwork -InternalIPInterfaceAddressPrefix 192.168.137.0/24

Name                             : VMNatNetwork
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.137.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : True

PS C:\> Get-NetNat | fl *

Store                            : Local
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpInboundRefresh                : False
Active                           : True
Caption                          :
Description                      :
ElementName                      :
InstanceID                       : VMNatNetwork;0
ExternalIPInterfaceAddressPrefix :
IcmpQueryTimeout                 : 30
InternalIPInterfaceAddressPrefix : 192.168.137.0/24
InternalRoutingDomainId          : {00000000-0000-0000-0000-000000000000}
Name                             : VMNatNetwork
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
UdpIdleSessionTimeout            : 120
PSComputerName                   :
CimClass                         : root/StandardCimv2:MSFT_NetNat
CimInstanceProperties            : {Caption, Description, ElementName, InstanceID...}
CimSystemProperties              : Microsoft.Management.Infrastructure.CimSystemProperties

PS C:\>

InternalIPInterfaceAddressPrefix は、Internal vSwitch に接続されたホスト側の仮想 NIC にアサインした IPアドレスを含んでいる必要があります。例えば、ホスト側の仮想 NIC に 192.168.0.1/24 を設定した場合、InternalIPInterfaceAddressPrefix には 192.168.0.0/24 などを指定します。

※ NAT 先の IP アドレス(所謂、External IP Address)は指定しません。動的に決定されます。

制限事項

何れも現時点においての制限事項です。(将来どうなるかは不明です。)

  • NAT ネットワークは複数作成できません。複数作成すると意図しない動作をする可能性があります。
  • Windows Container (docker)を使用すると、NAT タイプのネットワークが自動的に作成されます。コンテナと併用する場合は、自動的に作成された NetNat を流用するか、一度 NAT 定義を削除した後両方をカバー可能な広いレンジの NAT ネットワークを定義してください。
  • NAT を行うインタフェースは指定できません。IP アドレスから動的に解決されます。

参考

Windows Server 2016 TP5 をコンテナーホストとしてセットアップ

leave a comment »

Windows Server 2016 TP5 ではコンテナーの役割が追加されています。機能をインストールするとコンテナーが利用できるようになりますが、実際にコンテナーの操作を行うためには、別途 docker のインストールが必要となります。

Docker のインストール

必要な手順は、以下の 3 つです。

  1. Docker 公式サイトから Windows 向けの docker をダウンロードして展開
  2. 環境変数 Path に、展開したパス(=インストールパス)を追加
  3. dockerd をサービスとして登録

インストール・スクリプト

上記の流れをスクリプトにしただけです。後半は、MSDN のサイトに記載されている First Step を、一部記述しています。(スクリプトの実行時、次に何をすればよいかのコマンドリストが表示されます。)

#Requires -Version 5.1
#Requires -RunAsAdministrator

# For Windows Server 2016 TP5

Write-Output "Docker Host 構成スクリプト"

Invoke-WebRequest "https://get.docker.com/builds/Windows/x86_64/docker-1.12.0.zip" -OutFile "$env:TEMP\docker-1.12.0.zip" -UseBasicParsing
Expand-Archive -Path "$env:TEMP\docker-1.12.0.zip" -DestinationPath $env:ProgramFiles
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Docker", [EnvironmentVariableTarget]::Machine)
& $env:ProgramFiles\docker\dockerd.exe --register-service
Start-Service Docker

Write-Output "docker image を取得してください"

$s = @'
docker pull microsoft/windowsservercore
docker images

docker search microsoft
docker pull microsoft/iis:windowsservercore
docker images
docker run -d -p 80:80 microsoft/iis:windowsservercore ping -t localhost
docker ps
'@

Write-Output $s

Written by kazu

2016/05/15 at 16:26