fbpx

[和訳] 2017年Dockerブログ記事トップ5: Windows Serverバージョン1709にDocker向け新機能が追加 #docker

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本稿は Top 5 blogs of 2017: Exciting new things for Docker with Windows Server 1709 (2017/12/26) の和訳です。

2017年の人気ブログ記事トップ5を振り返るシリーズです。今回ご紹介するのは第2位にランクインした、Windows Serverバージョン1709に加わった Docker向け新機能をご紹介した記事です。

2016年、Dockerには大きな変化がありました。9月にMicrosoft社とDocker社は共同でWidows Server 2016用のDocker Enterprise Edition (Docker EE)を発表しました。Docker EEは多種多様なインフラストラクチャ上でさまざまなアプリケーションを安全に管理するためのContainers-as-a-Service (CaaS) プラットフォームです。それ以来、Microsoft社とDocker社は協力関係を続け、Windows Server バージョン1709ではDockerユーザ向けの機能強化を含むに至りました。

Docker EEプレビュー版

DockerとWindowsの新機能を試すには、Dockerのプレビュー版ビルドが必要です。Windows Serverバージョン1709にDocker EEのプレビュー版をインストールする方法は次の通りです(これはInsiderビルドでも使用できます):


Install-Module DockerProvider Install-Package Docker -ProviderName
DockerProvider -RequiredVersion preview

Docker WindowsコンテナをWindows Serverのお好きなバージョン上の本番環境で実行するには、Docker EEのバージョンは必ず17.06をご利用ください。

Windows上で実行するDocker Linuxコンテナ

Windows Serverバージョン1709のもっとも重要な点は、Window上でのLinuxコンテナに対するサポートです。 LinuxKitプロジェクトを使って、どのようにWindows上でLinuxコンテナをサポートしているか につきましては、以前ブログでもご紹介しました。

Windows Serverバージョン1709上でLinuxコンテナを試用するには、プレビュー版Dockerパッケージをインストールしてこの機能を有効にします。プレビュー版Docker EEパッケージは、Docker Linuxコンテナの実行に必要なLinuxKitシステムのすべて(たった13MB!)を有しています。

[Environment]::SetEnvironmentVariable("LCOW_SUPPORTED", "1", "Machine")
Restart-Service Docker

無効にしたい場合は環境変数を削除します:

[Environment]::SetEnvironmentVariable("LCOW_SUPPORTED", $null, "Machine")
Restart-Service Docker

Windows上で実行するDocker Linuxコンテナはプレビュー版で、Microsoft社とDocker社が共同で開発中のものです。Linuxコンテナは、Windows 10バージョン1709 ("クリエイターズアップデート 2")でもご利用いただけます。お試しいただくには こちら のDocker for Windowsプレビュー版をインストールしてください。

Windows用DockerのIngressモードでサービスを公開する

Windowsユーザは、Linux版のサービス公開機能と同等のオプションを切望していました。Windows Serverバージョン1709では、 Ingressモードを使用したサービスの公開 に対応しました。これによりDockerの ルーティングメッシュ が使用可能となりました。これはSwarm内の当該サービスタスクをどのノードで実行しているかに関わらず、Swarm内のどのノードの外部エンドポイントに対してアクセスしてもサービスに到達可能とするものです。

これらのネットワーク機能の改良により、 オーバーレイネットワークを使用する際のVIPベースのサービスディスカバリ も使えるようになりました。これによりWindowsにおけるDNSラウンドロビンの制限がなくなりました。

この改良の詳細 につきましては、Microsoft社の仮想化に関するブログ記事をご参照ください。

Windowsコンテナにおける名前付きパイプ

Dockerにおける一般的でパワフルな使用例は、コンテナ実行中のホストのDocker APIを使用する、Dockerコンテナを実行することです。例えば、より多くのDockerコンテナを起動したり、Dockerホスト上のコンテナやネットワークおよびボリュームを可視化したりすることです。この例では、Dockerで実行中のものを管理または可視化するソフトウェアをコンテナに含めて出荷できます。これは Docker Universal Control Plane (UCP) のようなソフトウェアを構築する際に最適です。

Linux上でDockerを実行する場合、Docker APIは通常、Unixドメインソケット上でホストしています。これらはファイルシステムの名前空間にあるため、簡単にソケットをコンテナにバインドマウントできます。Windowsでは、名前付きパイプでDocker APIを使うことができます。これまで名前付きパイプはDocker Windowsコンテナにバインドマウントできませんでしたが、Windows 10およびWindows Server 1709以降で可能となりました。

これはCIツールであるJenkinsなどで有用でしょう。DockerとWindows Serverバージョン1709によって可能になったことは次の通りです:

  1. Docker WindowsコンテナでJenkinsを実行できます(もはやCIマシン上でJavaをはじめGitおよびJenkinsを手動でインストールしたりメンテナンスしたりする必要はありません)。
  2. JenkinsコンテナがDockerイメージを作成するのと 同じホスト上で、 Docker CI/CDジョブを実行できます。

名前付きパイプを使う新しいマウント機能を使用する Jenkinsのサンプルイメージ (Windows Server バージョン1709が必要)を作成しました。これを実行するには、コンテナを起動し、初期パスワードを取得し8080番ポートにアクセスするだけです。Jenkinsのプラグインや追加ユーザを設定する必要はありません:

docker run -d -p 8080:8080 -v \\.\pipe\docker_engine:\.\pipe\docker_engine friism/jenkins
docker exec 3c cmd /c type c:\.jenkins\secrets\initialAdminPassword パスワード

次に簡単なフリースタイルプロジェクトを作成し、"Windowsバッチコマンド"のビルドステップを使用します。Jenkins Dockerプロジェクトのフォークを作成します:

git clone --depth 1 --single-branch --branch add-windows-dockerfile https://github.com/friism/docker-3 %BUILD_NUMBER%
cd %BUILD_NUMBER%
docker build -f Dockerfile-windows -t jenkins-%BUILD_NUMBER% .
cd ..
rd /s /q %BUILD_NUMBER%

“Build Now”ボタンを押し、(コンテナ内で実行している)Jenkinsが自らが稼動しているまさにそのホスト上で、コンテナイメージを作成するCIジョブを構築する様子をご覧ください。

より小さなWindowsベースイメージ

2016年にDocker社およびMicrosoft社で、Windowsコンテナを開発し始めた際、Windowsコンテナのベースイメージは、Linuxコンテナのベースイメージほど小さくないということに気づいた方もいたでしょう。Microsoft社はベースイメージの精査に尽力し、Windows Serverバージョン1709においてはNanoserverは約70MB (ファイルシステム上では200MBになる)でダウンロードできるようになりました。

Nanoserver Dockerイメージから削除したものの1つはPowerShellです。これはDockerfileを作成する際の難問となりえます。しかし、 マルチステージビルド を活用することで、Windows Server Coreイメージですべてのコンポーネントのビルドを一続きに行って、結果のみをnanoserverイメージにコピーするだけでよいのです。次はDocker CLIを含む最小のDockerイメージの構築方法の一例です:

# escape=`
FROM microsoft/windowsservercore as builder
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
RUN Invoke-WebRequest -Uri https://download.docker.com/win/static/test/x86_64/docker-17.09.0-ce-rc1.zip -OutFile 'docker.zip'
RUN Expand-Archive -Path docker.zip -DestinationPath .

FROM microsoft/nanoserver
COPY --from=builder ["docker\\docker.exe", "C:\\Program Files\\docker\\docker.exe"]
RUN setx PATH "%PATH%;C:\Program Files\docker"
ENTRYPOINT ["docker"]

これで相反するように見える2つの最善の環境を手にいれることができます。1つは、使いやすく、すべての機能を兼ね備えた構築環境です。そしてもう1つは、素早いデプロイと起動が可能で、エクスプロイトの及ぶ領域を最小に抑えている、とても小さく最低限のランタイムイメージです。他の現実的な好例としては、Microsoft社の.NETチームがメンテナンスする .NET Coreのベースイメージ があるでしょう。

まとめ

Windows Server 2016およびWindows 10で実行できるDocker Windowsコンテナを一般公開したのがたった1年前であるとはにわかに信じ難いかもしれません。この1年間で、Dockerコミュニティでは採用したという声が多く挙がり、Dockerユーザおよびパートナーの皆さまによる多数の取り組みがありました。最新のリリースでは、より円滑なユーザエクスペリエンスのための機能のみを追加しました。つまりWindowsオーバーレイネットワークはLinuxの標準レベルに達し、より小さなコンテナイメージと、名前付きパイプをコンテナにバインドマウントする機能をサポートしました。

DockerによるITソリューションをもっと知りたい方は:

新規CTA