Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンテナー、大事なことだけ

Avatar for Toru Makabe Toru Makabe
August 05, 2025
3

 コンテナー、大事なことだけ

思い出すシリーズ

Avatar for Toru Makabe

Toru Makabe

August 05, 2025
Tweet

More Decks by Toru Makabe

Transcript

  1. 自己紹介 { “名前” : “真壁 徹(まかべ とおる)”, “所属” : “日本マイクロソフト株式会社”,

    “役割” : “クラウド ソリューションアーキテクト”, “経歴” : “大和総研 → HP Enterprise”, “特技” : “インフラ & オープンソース”, “資格” : “CNCF Certified Kubernetes Admin.” }
  2. 博士の発明 カレー合成ロボ “Docurry Mk-II” • タンドリー社製CR-3型 高出力マイクロ波加熱 装置 • 具材や素材を瞬時に識

    別する非ノイマン型高 性能コンピューター • 初号機はコンテナー1年 戦争で活躍
  3. 冷蔵庫 即カレー環境の実現 冷蔵庫から パーソナライズされたカレーを 即提供 味も安定 辛さにこだわる 父カレー 魚介好き 母カレー

    牛好き 甘口 兄カレー 超超甘口 妹カレー テーブル docurry run 父カレー docurry run 妹カレー 辛旨! 甘旨!
  4. 父コンテナー 博士の工夫 その① レイヤー構造にすることで、共通化と多様性を両立 チキン 辛口スパイス ベースカレー ライス 母コンテナー 魚介

    中辛スパイス ベースカレー ライス 兄コンテナー ビーフ 甘口スパイス ベースカレー ライス 妹コンテナー チキン ベースカレー ライス
  5. 冷蔵庫 父コンテナー 博士の工夫 その② 保存時に冷蔵庫にすでに同じレイヤーがあれば、共有できるようにした チキン 辛口スパイス 母コンテナー 魚介 中辛スパイス

    ベースカレー ライス docurry push 母カレー 差分の 中辛スパイスと 魚介だけ送る ベースカレー ライス 同じ 冷蔵庫スペースの節約! 調理
  6. テーブル 父コンテナー 博士の工夫 その③ テーブルにすでに同じレイヤーがあれば、共有できるようにした チキン 辛口スパイス 母コンテナー 魚介 中辛スパイス

    ベースカレー ライス docurry run 父カレー 差分の 辛口スパイスと チキンだけ送る ベースカレー ライス 同じ ライスとベースカレーを送らなくていいので、 着席後に即カレー! (*)共有要素でも、あたかも自分専用に見える謎技術
  7. 仮想マシンとコンテナーの違い ハードウェア ハイパーバイザー (Hyper-V、vSphereなど) 仮想マシン 仮想マシン OSカーネル OSカーネル コンテナー コンテナー

    ランタイム/ライブラリー アプリ ランタイム/ ライブラリー ランタイム/ ライブラリー アプリ アプリ コンテナーイメージ
  8. Dockerとは ハードウェア ハイパーバイザー (e.g. Hyper-V) 仮想マシン OSカーネル コンテナー コンテナー ランタイム/

    ライブラリー ランタイム/ ライブラリー アプリ アプリ +周辺ツール • UNIX、BSD、Linuxの世界でコンテナー 技術は昔からあった • OSの各種リソース管理機能を活用して リソースを分離する • dotCloud(現Docker)社が自社PaaS向け に作ったコンテナーの仕組みをOSSにし てブレイク • 従来のコンテナー技術より、アプリ開 発者視点でうれしい機能、周辺ツール に力を入れている • イメージ作成、配布の仕組み • 差分イメージ形式 • 標準化の勢いでDockerの影響力は弱ま りつつあるが、広く普及している コンテナーイメージ
  9. レジストリーとは コンテナーイメージを格納するデータストア Docker Hub パブリックレジストリーの 代表格 Azure Container Registry(ACR) プライベートレジストリー

    実装例 様々な公式イメージ (ubuntu、nginx、etc) ユーザー作成イメージ ユーザー作成イメージ docker push/pull/run • レジストリーを指定しないと Docker Hubに接続 (デフォルト) • インターネット経由 • ユーザー個別にレジストリー を作成し、指定 • Azureネットワークに閉じた 運用が可能
  10. コンテナーを”Run”すればいい (早い、楽、再現性が高い) “仮想マシン、OS、ランタイム、ライブラリー、アプリの導入” vs “docker run” 依存関係地獄から解放される (混ざらない) ひとつのOSインスタンス上で複数種、バージョンのランタイムやライブラリーを分離できる 導入先のマシンに入っているランタイムに頼らず、自ら必要なものをコンテナーに含め、持ち込む

    開発のサクサク感が増し、運用を「強くする」手段も増える 時は金なり、人間の待ち時間はコストが高い 性能拡張したいときはコンテナーを複製して負荷分散できる 短時間で元の環境に戻せる、再現できる = 回復力(Resiliency)を得る うれしいこと
  11. レジストリー Container Image コンテナーのバリューチェーン Build/Ship/Run Build Ship Run .NET Core

    App Java App Dockerfile Dockerfile .NET Core App Runtime/Lib Container Image Java App Runtime/Lib 実行環境(VM上でも可) Container .NET Core App Runtime/Lib Container Java App Runtime/Lib Other Lang. Dockerfile
  12. Azure Azure Cloud Shellの仕組み フロントエンドはJavaScript ブラウザにXterm.jsがロードされる Ubuntuコンテナーを生成 ユーザーごとにひとつのコンテナー コンテナーイメージはユーザー共通 20分間無操作だと破棄される

    永続化領域はAzure Filesへ $HOMEの下が永続化される ブラウザ ブラウザ ユーザーコンテナー Azure Files Xterm.js Xterm.js コンテナーイメージ (Ubuntu 16.04 & Tools)
  13. 起動してすぐ、多様なCLIツールを使える インストールする必要なし Docker CLI/Docker Machine Kubectl Helm DC/OS CLI MySQL

    クライアント PostgreSql クライアント sqlcmd ユーティリティ mssql-scripter iPython クライアント Cloud Foundry CLI Terraform Ansible .NET Core (2.1.4) Go (1.9) Java (1.8) Node.js (8.9.4) PowerShell Core (6.0.1)
  14. 仮想マシンでも実現不可能ではないですが… Azure Cloud Shellに限らず 仮想マシンデプロイの一般的課題 カスタムVM Image アプリ、ライ ブラリ、ラン ライム

    セットアップ 物理サーバー VM デプロイ • カスタムVM Imageのサイズが大きく、デプロイに時 間がかかる 事前セットアップ方式 デプロイ時セットアップ方式 VM Image アプリ、ライ ブラリ、ラン ライム セットアップ (スクリプトなど) 物理サーバー VM デプロイ • セットアップが必要なのでデプロイが遅い • セットアップ後のテストが難しい (スクリプ トでアプリは期待通りに導入されたのか?設 定は間違ってないか?) (共通)すべてのVMに同じようなOS領 域、システムデータがあり、大部分 重複しているのが無駄
  15. Azure Cloud Shellとコンテナー 仮想マシンとカーネル、イメージを共有しているため、個々のコンテナーは軽量 仮想マシン OSカーネル コンテナーイメージ (Ubuntu 16.04、ライブラリー、ランタイム、ツール) 読み取りのみ

    ユーザー領域 書き込み可 ユーザー領域 書き込み可 ユーザー領域 書き込み可 ユーザーA コンテナー ユーザーB コンテナー ユーザーC コンテナー 1度コンテナーホスト にダウンロードされれ ば、あとは差分のみ取 得する ユーザー個別のリソー スを小さくすることで、 速い起動と低コストを 実現できた ツールが期待通り導入 されたことを検証済み のコンテナーイメージ を配布
  16. レジストリー Container Image どこが課題になりがちか Build/Shipのステップがあるから Run できるのですが… Build Ship Run

    .NET Core App Java App Dockerfile Dockerfile .NET Core App Runtime/Lib Container Image Java App Runtime/Lib 実行環境 Container .NET Core App Runtime/Lib Container Java App Runtime/Lib ここだけ注目する人が多い 「VMより軽いんでしょ?」 「じゃあ設備コストが下がる?」 準備が必要 Other Lang. Dockerfile
  17. 例: アプリの「プチ」モダナイゼーション VM コンテナーグループ コンテナー 新機能アプリ (HTTPS Proxy) ランタイム/ ライブラリ

    コンテナー 既存アプリ ランタイム/ ライブラリ コンテナーグループ コンテナー 新機能アプリ (API Adapter) ランタイム/ ライブラリ コンテナー 既存アプリ ランタイム/ ライブラリ
  18. コンテナーに取り組む時間を作る 向かなそうな他のシステムでは 何かを「やめる」 アジリティ 移行のインパクト 既存アプリ IaaS VMs Rehost Containers

    Refactor Microservices Rearchitect Serverless Rebuild New SaaS apps Replace App Modernization Lift & Shiftでもいい から「設備のお守 り」から解放される 自前で運用するシステ ムをなくしてしまう うまくいきそうなアプリを 選んで、小さくはじめる そして知見を得る 手段はコンテナーだけじゃない ことも意識する
  19. 博士の発明 カレーパーティー オーケストレーター “Keemanetes” • 複数テーブルのDocurry のまとめ役 • 需要に合わせてカレー の提供を指示

    • トラブル時はそのテー ブルにあったカレーと 同じものを他テーブル で提供 • カレーの味変や戻しも テーブル間の整合性を 保ちつつ実施 レストランから問い合わせが殺到 業界標準になりつつある
  20. Kubernetes (k8s) コンテナーオーケストレーターの事実上標準 オープンソースソフトウェア CNCF (Cloud Native Computing foundation)が開発を主導 マイクロソフトはCNCFのプラチナメンバー

    多くのベンダーがオープンソースをベースに製品・サービス化 Azure Kubernetes Serviceで採用 他Azureサービスでも内部基盤として使われている
  21. 主要機能 (スケジューリング) 必要なリソースやもろもろの条件を考慮し、コンテナーを最適なNodeに配置する Node 0 Master Node 1 Node 2

    Container A(Pod) Container A(Pod) Container B(Pod) Container B(Pod) • CPUはこのくらい • メモリはこのくらい • そのほか条件 マニフェスト (あるべき姿を宣言) Node 2が 最適
  22. 主要機能 (複製) コンテナーの複製を作成し、負荷分散や可用性向上 Node 0 Master Node 1 Node 2

    Container A(Pod) Container A(Pod) Container B(Pod) Container B(Pod) • CPUはこのくらい • メモリはこのくらい • 複製を2つ • そのほか条件 複製を作るぞ Container B(Pod) 複製に向けるトラフィックをまとめた り、散らす仕組みもあります (Service) マニフェスト (あるべき姿を宣言)
  23. 主要機能 (自己復旧) 障害時に残存Nodeでコンテナーを再作成 Node 0 Master Node 1 Node 2

    Container A(Pod) Container A(Pod) Container B(Pod) Container B(Pod) • CPUはこのくらい • メモリはこのくらい • 複製を2つ • そのほか条件 Node 2から活動報告がない Node 0でコンテナーを再作成だ Container B(Pod) Container B(Pod) マニフェスト (あるべき姿を宣言) 常にあるべき姿と現状の 突合せループを回している
  24. 主要機能 (バージョン管理) クラスター全体でコンテナーのバージョン整合性を保つ (戻しもできる) Node 0 Master Node 1 Node

    2 Container A(Pod) Container A(Pod) Container B v2(Pod) Container B(Pod) v2 • CPUはこのくらい • メモリはこのくらい • 複製を2つ • そのほか条件 コンテナーを新バージョン で入れ替えるぞ Container B v2(Pod) 再デプロイ マニフェスト (あるべき姿を宣言) じわじわローリングアップグレードす ることもできます
  25. Kubernetesクラスター作成に必要な作業 やること多すぎ etcdの起動 Kubernetes設定ファイルの作成と配布 Kubernetesコンポーネント(バイナリー) の配布 Kubernetesコンポーネントの起動 Kubernetesアドオンコンポーネントの作 成 などなど

    Node間ネットワークの作成 Masterサーバーの作成 Masterサーバー向けロードバランサーの 作成 Nodeサーバーの作成 Pod間ネットワークの作成 証明書の作成と配布 etcd設定ファイルの作成と配布
  26. Azure Kubernetes Service (AKS) API server Controller Manager Scheduler etcd

    Store Cloud Controller Self-managed master node(s) • Kubernetesは構築や維持の負担が 大きい • Azureはコントロールプレーン(マ スター)部分をマネージドサービス として提供 • アップストリームに追従 (独自の Kubernetesを作らない) • MasterノードはAzureがサービスと して管理しており、不可視 • 他Azureサービスとの連携や組み合 わせが容易(ロードバランサー、仮 想ネットワーク、Azure AD、Azure Monitor、etc) Customer VMs App/ workload definition User Docker Pods Docker Pods Docker Pods Docker Pods Docker Pods Schedule pods over private tunnel Kubernetes API endpoint Azure managed control plane
  27. AKS 物理/論理配置 Node Node Master (物理サーバー、仮想マシン) Node (物理サーバー、仮想マシン) API Server

    etcd ロードバランサー ロードバランサー Controller Manager Scheduler kubelet kube-proxy(*) Container Runtime アドオンコン ポーネント(**) (*) Nodeのネットワークを制御 (iptables操作など) (**) DNS、Metrics Serverなど (Podとして動く) 不可視 API エンドポイント (例: hogehoge.hcp.japaneast.azmk8s.io)
  28. Containers in Azure Choice of developer tools and clients Azure

    Container Registry Docker Hub App Service Azureの歴史ある PaaSサービス GitやVisual Studio に限らずDockerコ ンテナーでのデプ ロイにも対応 Service Fabric マイクロソフトの 開発する分散処理 基盤 .NETアプリケー ションとの相性が いい Kubernetes Service Container Instance コンテナーオーケスト レーターの事実上標準 Ecosystem パートナーとの 協業 コンテナー1つから 使えるマネージド サービス AKSの仮想ノードと しても利用可能
  29. Azureでコンテナーが使えるサービスの特徴 位置づけ 汎用/特化 課金リソース 特記事項 Container Instances シンプルなコンテ ナー実行基盤 汎用

    コンテナー利用 CPU・メモリ (秒) KubernetesのNodeと して利用可能 部分的にKubernetes マニフェストをサ ポート App Service (Web App for Containers) WebアプリPaaS 特化(Webアプリ) App Service Plan (秒) 部分的にKubernetes マニフェストをサ ポート Service Fabric 分散アプリ基盤 汎用 クラスター構成リ ソース(主にVM) (分) .NETアプリとの親和 性が高い Kubernetes Service コンテナーオーケス トレーター 汎用 クラスター構成リ ソース(主にVM) (分) 事実上の業界標準
  30. 誤解をおそれずに一言で 一言 Container Instances 使い捨てるコンテナーに (バッチや期間限定アプリ) App Service (Web App

    for Containers) シンプルなWebアプリならKubernetesより断然手軽 Service Fabric .NETで、がっつり分散アプリを作るなら Kubernetes Service 数多く、複数の種類のコンテナーを組み合わせて動かすなら
  31. レジストリー Container Image (再掲) どこが課題になりがちか Build/Shipのステップがあるから Run できるのですが… Build Ship

    Run .NET Core App Java App Dockerfile Dockerfile .NET Core App Runtime/Lib Container Image Java App Runtime/Lib 実行環境 Container .NET Core App Runtime/Lib Container Java App Runtime/Lib 準備が必要 Other Lang. Dockerfile
  32. コンテナーCI/CDパイプラインのイメージ AKSの場合 Source code control Helm chart Inner loop Azure

    Container Registry Azure Pipeline/ DevOps Project Auto- build Azure Monitor CI/CD Test Debug Azure DevSpaces AKS dev cluster AKS production cluster Pods ACI instances Pods
  33. 例: Azure DevOps CI/CDパイプライン あくまで実装例です 入れ替え、組み合わせられるツールは数多くあります Azure Repo Git互換リポジトリ Azure

    Pipeline パイプライン管理 Azure Container Registry プライベートコンテナーレジストリ Kubernetes 参考資料: チュートリアル: Azure DevOps プロジェクトを使用して ASP.NET Core アプリを Azure Kubernetes Service (AKS) にデプロイする GitHubも いいですね
  34. 2つの課題 ベースのコンテナーイメージサイズがまだ大きい (Nano Server 350MB, Server Core 4.2GB) 事実上標準であるKubernetes対応が遅れた (今週リリースされたKubernetes

    1.14で Windows Node がGA) 本格的な普及には至っていない 2つの課題を解決せねば サイズの問題はホストへのキャッシュを活かすのが短期的な解決策 既存アプリ(.NET Framework)への適用に期待する声が多い 新規であれば.NET Core on Linuxという手もあり、Windowsである必然性は小さい .NET Frameworkを動かすならServer Coreが必要 -> サイズ問題 Windowsコンテナーの現状
  35. 将来を見据えて 現在のおすすめアプローチ Windowsアプリのコンテナー実行基盤 代表的な選択肢 シングルコンテナーのWebアプリ -> Web App for Containers

    まだプレビュー段階ですが、ベースは実績あるAzure Web Apps 運用が楽です シングルコンテナーにおさまるASP .NETアプリであれば強くおすすめ マルチコンテナーアプリ -> AKS Engine からの AKS AKSのデプロイメントエンジン(AKS Engine)はOSSとして公開されており、Windowsに対応済み AKSのWindows Node対応はロードマップにありますが、急ぎであれば/いま検証して知見を得た い場合はAKS Engineを
  36. WindowsのGUIアプリをコンテナー化したい 残念ながらサポートされていません Does Docker for Windows Server 2016 support GUI-based

    applications? At this time, no, Docker for Windows Server 2016 does not support GUI-based applications. This is because Windows containers are based on either Nano or Core Server, which do not allow users to start up a GUI-based interface nor RDP into the container. https://success.docker.com/article/does-docker-for-windows-server-2016-support-gui-based-applications