はじめてのコンテナー Docker & Windows & Linux かめがわ かずし(kkamegawa)
はじめてのコンテナー Docker & Windows & Linuxかめがわ かずし(kkamegawa)
AgendaWhy container?
Container in Windows(which choice)
How to use Windows Container
DevOps and Container
Self-intrductionKAMEGAWA Kazushi / Engineer
Microsoft MVP for Visual Studio and Development Tools (2012/7~)Twitter : @kkamegawa
Facebook : https://www.facebook.com/kkamegawa/Blog : http://kkamegawa.hatenablog.jpSlideShare : https://www.slideshare.net/kkamegawa/
出版などアジャイルでやってみた。
http://www.shuwasystem.co.jp/products/7980html/4740.htmlBuild InsiderでWindows Subsystem for Linux掲載中
http://www.buildinsider.net/enterprise/wsl Team Foundation Server 2017コンプリートガイド
https://www.amazon.co.jp/Foundation-Server-コンプリート-セットアップ編-2017コンプリートガイド-ebook/dp/B073YCLHTC/
This contents based on 2017/11/18
Why Container?
今までの環境構築完璧な手順書でダブルチェックしながら一台ずつ物理環境に温かみのある手作業構築
VMWare/Hyper-Vなどの仮想環境を使ってイメージ展開
PowerShell DSC/Ansible/Puppet/Chefなどを使ってInfrastructure as a Codeで自動構築
今までの問題点完璧な手順書作成大変。複数人での指差しチェックはコストがかかる
OSの展開にはライセンスが絡む場合があるOSイメージはでかい(Windows Serverミニマムで10GB以上)
IasCだと出来上がるまでちょっと時間がかかる
アプリ実行に必要なものだけをまとめれば?コンテナーというアイディア
FreeBSD : JailSolaris : ZoneLinux : Linux Containers
Docker→Now!
サーバー仮想化とコンテナーの違い
Infrastructure Infrastructure
Host Operating System
Hypervisor
Guest OS
Bins/Libs
App 1
Guest OS
Bins/Libs
App 2
Guest OS
Bins/Libs
App 3
Bins/Libs
App/Svc 1
Bins/Libs
App/Svc 2
Bins/Libs
App/Svc 3
Container Engine
Operating System
コンテナーごとにネットワークの分離コンテナーごとにリソースの分離
Dockerが受けた理由(私見)コンテナーイメージ運用がGitライク / Docker Hub
主要なディストリビューションで対応(macOS/Windows)
オーケストレーションもOSSで対応(Kubernetes/Swarmなど)
クラウドベンダーもサポートAmazon, Google, Microsoft…etc.
Windows におけるコンテナー変遷Insider PreviewでPowerShellコマンドレットを使ったコンテナーが開始。でも、dockerコマンドに移行(Anniversary Updateで正式版)
DockerCon 16でWindows Server 2016のサポートがアナウンス
Docker for WindowsとWindowsコンテナーがFall Creators Updateおよび、Windows Server Version 1709でWindows Subsystem for Linuxをサポート
Windowsで今使えるコンテナーDocker for Windows
Hyper-Vコンテナー
Windowsコンテナー
Hyper-VコンテナーでのWindows Subsystem for Linux
Container in Windows
Windows 10 でのコンテナー(Docker)Windows 10 Anniversary Update以降の64bit, Professional/Enterprise Editionを使う
Docker for Windowsをインストール※:Windows 10ではHyper-Vを使うためHomeエディション、32bit OS不可https://docs.docker.com/docker-for-windows/install/#download-docker-for-windowsEdge:頻繁に更新(最低月一度)Stable:3か月に一度
Hyper-Vを使うため、IntelやGoogleのAndroidエミュレーターとの共存不可
Windows でのコンテナーは悩ましいLinuxイメージをHyper-Vの仮想マシンで動かす(標準)
Windowsイメージを動かすHyper-VコンテナーWindowsコンテナー(※:Windows Serverのみ)
Hyper-VコンテナーでLinuxを動かす※:Edgeチャンネルのプレビューかつ、Fall Creators Update必要
どれを選べばいいの?(主観です)本番がLinuxコンテナー、開発はWindowsDocker for Windowsデフォルト
開発、本番がWindowsコンテナーで軽量にWindowsコンテナー(でも運用大変)
コンテナ間のリソース制御したい。バージョンHellを避けたいHyper-Vコンテナー
LinuxのコンテナーをWindowsで使いたいLinuxコンテナー(でもまだプレビュー)
Windowsコンテナー
Docker for Windows
(デフォルト)
Docker for Windowsの既定Hyper-Vで一台のMobyLinux仮想マシンが動作Windowsコンテナーに変更可
動かすのはLinuxのDockerイメージ
WindowsコンテナーWindows Server のみで使用可能なプロセス分離タスクマネージャーにプロセスがそのまま表示※:なので、このままタスクマネージャーから落とせるコンテナーはsuspendedなので、再度docker start可物理OSとベースイメージがパッチレベルで同一でなくてはならない
Hyper-VコンテナーWindows 10とWindows Serverで使用可能
※:Serverでは --isolatation=hyperv オプションdocker run -it --isolatation=hyperv microsoft/windowsservercore cmd
Hyper-Vのハイパーバイザーでコンテナーを分離メモリ、CPUなどを制御しやすいサービス事業者で無関係な組織のコンテナーを一台で動かす場合に向いているWindowsベースイメージに依存しないのでこちらがおすすめ
Linux コンテナー(Windows Subsystem for Linux)Hyper-VコンテナーでWindows Subsystem for Linux経由でLinuxコンテナーを動かす。注: Fall Creators Update /Windows Server, Version 1709以降必須
UbuntuなどのLinuxベースイメージを使う
Linuxコンテナーを使う1. PowerShellを起動
Install-Module DockerProvider2. Install-Package Docker -ProviderName DockerProvider -RequiredVersion preview3. [Environment]::SetEnvironmentVariable("LCOW_SUPPORTED", "1", "Machine")4. restart-computer5. docker run -it ubuntu bash
How to use Container
WindowsでのDockerエンジンインストールWindows 10Docker for Windowsをインストールする
Windows Server 2016https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/quick-start/quick-start-windows-server
Windows Server Version 1709https://docs.docker.com/engine/installation/windows/docker-ee/
docker hubからベースイメージの取得WindowsコンテナーではWindowsのベースイメージはホストバージョ
ンと合わせる(後述)
microsoft/nanoserver(1GBくらい) (ほぼ).NET Coreアプリ実行用
microsoft/windowsservercore(10GBくらい) サービスなどのGUIなしアプリ用→GUIアプリは不可※:SQL Serverなどはこちら
ubuntuLinuxコンテナーで使うベースイメージ場合によっては自分で作る
https://knowledge.sakura.ad.jp/2226/
Windowsでの注意事項コンテナホストOSとコンテナベースイメージのバージョンをそろえる毎月のパッチ更新でベースイメージも更新される
https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility
固定したい場合、pull もしくはdockerfileのタグ指定docker pull microsoft/nanoserver:1709_KB4043961docker pull microsoft/windowsservercore:10.0.14393.1770
公開されているOSイメージはデフォルト英語版(タグでja-jpを指定すれば日本語版)
公開済みコンテナーを使うDocker Hub(既定), Azure Container Registry, EC2 Container Registry, Google Container Registry等にログイン。
無指定ならdocker hubから。とってくるだけなら無料。※:どれもGB単位なので、ネットワークには気を付けて
docker pull イメージ名:タグ例:docker pull microsoft/dotnet-samples:latest慣例的に最新版イメージにはlatestタグをつける。無指定ならlatestが取得される
コンテナーを実行するときよく使うオプションdocker run(初回)
-it(正確には -t -i): 標準入力をフォアグラウンドに返す-p : ネットワークのポートをマッピングする-v : コンテナから物理ドライブをマウントする-e : コンテナに環境変数を渡す--rm : 終了時コンテナーを削除-d : バックグラウンドでの実行継続(サービス/デーモン)-h : ホスト名を指定する(外部接続するなら必須)-n : コンテナーの名前を指定するhttps://docs.docker.com/edge/engine/reference/commandline/run/
docker start(コンテナー再開)-a : 既存のコンテナーに接続するhttps://docs.docker.com/edge/engine/reference/commandline/start/
自分のコンテナーを作るDockerfileを用意する
https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/manage-docker/manage-windows-dockerfilehttps://docs.docker.com/engine/reference/builder/
アプリをインストールする手順通りに書くビルドする※:Visual Studioなどでは支援機能もあるレジストリ(Docker Hub他)にアップロード
docker hubには公開されているdockerfileへのGitHubレポジトリへのリンクがあるので大いに参考にする
DevOps and Container
Docker開発ツールDocker CLI
https://docs.docker.com/engine/reference/commandline/cli/
Azure CLI,SSHhttps://azure.github.io/projects/clis/
Visual Studio Code & Docker拡張機能https://marketplace.visualstudio.com/items?itemName=formulahendry.docker-extension-pack
Visual Studio 2017コンテナーサポートhttps://docs.microsoft.com/ja-jp/aspnet/core/publishing/visual-studio-tools-for-docker
コンテナー開発ライフサイクル例
Azure開発環境
git pushpull, clone
docker push
CD (Webhook)
docker push
デプロイ先仮想マシンAzure VM, EC2等マシンの管理面倒
コンテナのマネージドサービスAzure Kubernetes Serviceなど
Azure App Service for LinuxKubernetesほど管理が不要な環境にはお勧め※:現在はLinuxコンテナーのみ
まとめWindowsのコンテナーは用途に応じて適切に選びましょう。
Windowsのベースイメージの扱いに気を付けて。Hyper-Vコンテナー使うほうがたぶん楽。
Windowsだとコンテナーは.NET Core動かすためのものかな…
資料探そうとしても…コンテナーの移り変わりは早い
一年前でも古い情報が多い
検索するときは必ず期間指定を!
参考リソースWindows Containers on Windows Serverhttps://docs.microsoft.com/ja-jp/virtualization/windowscontainers/quick-start/quick-start-windows-server
Preview Docker for Windows Server 1709 and Windows 10 Fall Creators Updatehttps://docs.docker.com/engine/installation/windows/ee-preview/
Windows Server Version 1709 で Docker と Windows Containers を使ってみるhttp://blog.shibayan.jp/entry/20171107/1509988437
その他Anti-virus optimization for Windows Containers
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/ifs/anti-virus-optimization-for-windows-containers
インフラ野郎Azureチームコンテナー祭https://www.slideshare.net/Microsoft_TechSummit_2017/japan-tech-summit-2017-dep-005
コンテナーなに使ってますか?Linuxですか?Windowsも使ってもらっていいですか?https://speakerdeck.com/shibayan/kontenananishi-tutemasuka-linux-desuka-windows-moshi-tutemoratuteiidesuka