本稿の目的
「コンテナ全然わからん、単語しか知らん!」というインフラエンジニアの筆者が、
- コンテナとはなんぞや
- 使うことでどんなメリットがあるのか
- コンテナ関連のクラウドサービス
など、コンテナの「基本のき」をお勉強していきます
目次
1. コンテナとは
2. コンテナを使うメリット
3. コンテナを使うために必要なもの
4. コンテナ関連のクラウドサービス
① AWS
② Google Cloud
5. まとめと今後やりたいこと
本編
1. コンテナとは
コンテナとはそもそも何なのでしょうか
Dockerのサイトによると、以下のように説明されています
コンテナは、コードとそのすべての依存関係をパッケージ化するソフトウェアの標準ユニットであり、アプリケーションがあるコンピューティング環境から別のコンピューティング環境に迅速かつ確実に実行されるようにします。 Dockerコンテナイメージは、コード、ランタイム、システムツール、システムライブラリ、設定など、アプリケーションの実行に必要なすべてのものを含む、軽量でスタンドアロンの実行可能なソフトウェアパッケージです。
コンテナーを使用してアプリケーションを構築、共有、実行する
つまり、コンテナ=アプリを動かすためのツールセット、というイメージです
コードだけでなく設定などの基盤もセットになっているため、「Aさんの環境では動いたけど、Bさんの環境では動かない」などの事象を防ぐことができます
2. コンテナを使うメリット
では、コンテナを使うと具体的にはどのようなメリットがあるのでしょうか
様々なサイトでコンテナのメリットについて言及されていますが、ここではAWSの公式ドキュメントを参照してみます
ポータビリティ
コンテナ化を利用すると、アプリケーションを一度構築すれば複数の環境(WindowsとLinuxなど)で,
コードの書き直しをせずにデプロイが可能です
また、レガシーアプリケーションコードを最新バージョンにアップグレードすることも可能です
スケーラビリティ
コンテナは軽量かつ起動が高速のため、一つのマシン上で複数のコンテナを動かせます
なお、コンテナクラスター同士のオペレーションが干渉することはありません
耐障害性
コンテナ化されたマイクロサービスは分離されたユーザースペースで動作するため、1 つのコンテナで障害が発生しても、他のコンテナに影響が及ぶことはありません
俊敏性
コンテナ化されたアプリケーションは、分離されたコンピューティング環境で実行されるため、利用者はOSや他のサービスに影響を与えることなく、アプリケーションコードのトラブルシューティングや変更が容易に行える
これにより、ソフトウェアのリリースサイクルを短縮し、迅速な更新が可能になる
参考:コンテナ化とは?
まとめると、コンテナ化=それぞれの実行環境が一まとまりの環境として区切られていることで、相互干渉なしに各環境をいじったり、高速に動かせるよ〜というのがコンテナ化するメリット、と言えそうです
3. コンテナを使うために必要なもの
このように便利なコンテナですが、何もないところから使い始められるわけではありません
この章では、コンテナを使うにはどのような準備が必要か、概要を見ていきます
コンテナランタイム
コンテナの実行を担当するソフトウェアです
具体的には、コンテナの作成や実行、管理を行っています
サービスとしては、Docker EngineやCRI-Oが有名です
また、コンテナランタイムには高レベルコンテナランタイムと低レベルコンテナランタイムの2種類があります
詳しくは触れませんが、概要をかい摘むと、
高レベルコンテナランタイム:低レベルコンテナランタイムを抽象化し、イメージ管理、コンテナのスナップショット、ネットワーク管理などの機能を提供する
低レベルコンテナランタイム:コンテナの起動と停止の基本的な機能を提供する低レベルのランタイム
という役割分担になっています
イメージとしては、コンテナの実行を料理だとすれば、高レベルコンテナランタイムはキッチンを統括するシェフ、低レベルコンテナランタイムは切ったり煮たりするスタッフ、というイメージです
参考:A Tale of Two Runtimes: Understanding Docker’s Low-Level and High-Level Runtimes
コンテナイメージ
コンテナの実行に必要なすべてのライブラリ、依存関係、およびファイルが含まれた、コンテナのいわば設計図です
Docker Hub,やAmazon ECRなどの「コンテナイメージレジストリ」から取得したり、Dockerfileを使って自分で書くこともできます
コンテナオーケストレーションツール
プロビジョニングやスケジューリングからデプロイや削除までのライフサイクル全体を自動化し、コンテナインフラストラクチャの管理を簡素化するツールです
具体的には、Kubernetes (k8s)やAmazon ECSなどです
複数のコンテナを使用する場合、これらのツール(サービス)を使用して管理しましょう
4. コンテナ関連のクラウドサービス
私たちは、普段はAWSやGoogle Cloudなどパブリッククラウドサービスを用いて仕事をしています
3.でいくつか具体的なサービス名を挙げましたが、ここでは改めて、コンテナ関連でどのようなクラウドサービスがあるのか見ていくことにします
なお、各サービスについては、詳細や設定方法については深掘りせず、概要をまとめる形になりますので、料金や詳しい使用方法については公式ドキュメントを参照してください
① AWS
Amazon Elastic Container Registry(Amazon ECR)
安全性、スケーラビリティ、信頼性を備えた AWS マネージドコンテナイメージレジストリサービスです
ライフサイクルポリシーやイメージスキャンによる脆弱性診断、クロスリージョンおよびクロスアカウントレプリケーションなどが使用できます
参考:Amazon Elastic Container Registry とは
Amazon Elastic Container Service (Amazon ECS)
コンテナ化されたアプリケーションを簡単にデプロイ、管理、スケーリングできる、完全マネージド型のコンテナオーケストレーションサービスです。フルマネージドサービスなので、AWS の設定と運用に関するベストプラクティスにすでに則っていたり、ECRなどのAWSサービスはもちろん、Dockerなどサードパーティツールとの統合もされていて便利です
参考:Amazon Elastic Container Service とは
Amazon Elastic Kubernetes Service(Amazon EKS)
Kubernetes クラスターの構築、保護、および保守を簡素化するサービスです
Kubernetes クラスターとは、コンテナ化されたアプリケーションを実行するコンピューティングノードまたはワーカーマシンのグループのことです
コンテナを実行するための集合体、くらいに思っておけば良いです(多分)
参考:Kubernetes クラスターとは何ですか?
AWS Fargate
コンテナを実行するためには、サーバーやAmazon EC2インスタンスなどのインフラストラクチャが必要です
AWS Fargateを使うと、インフラストラクチャのプロビジョニング、設定、スケールをAWS側で行ってくれるので、ユーザーはコンテナ本体に注力できるので便利です
Amazon Elastic Container Service (ECS) および Amazon Elastic Kubernetes Service (EKS) の両方で利用できます
参考:Amazon ECS の AWS Fargate
AWS Copilot
ローカル開発環境から、Amazon ECS での本番稼働対応のコンテナ化されたアプリケーションの構築、リリース、および運用を簡素化するためのCLIコマンドです
Amazon ECS アプリケーションのデプロイに適しています
参考:AWS Copilot CLI を使用してサンプル Amazon ECS アプリケーションをデプロイする
② Google Cloud
Google Kubernetes Engine(GKE)
Google が管理する Kubernetes オープンソースのコンテナオーケストレーション プラットフォームです
AWSでいうAmazon ECSに近い役割
AutopilotとStandard の運用モードがあり、さまざまなレベルの柔軟性、責任範囲、制御に対応している
参考:GKE の概要
Artifact Registry
パッケージと Docker コンテナ イメージを 1 か所で保管し管理できる場所です
Cloud Build および他の CI/CD ツールとの統合や依存関係の管理もしてくれます
参考:Artifact Registry の概要
Cloud Run
Google のスケーラブルなインフラストラクチャ上でコンテナを直接実行できるマネージドコンピューティングプラットフォームです
従量課金制で、リソースを使わないときは自動でスケールインしてくれるため、無駄な料金が発生しづらいのがGood
参考:Cloud Run とは
AWSもGoogle Cloudも、上記以外にコンテナを設計・実行するためのサービスは多く提供されています
ここでは主にコンテナを書いて(設計して)動かしてみる、という最低限の機能を中心にまとめてみましたが、例えばコンテナを使用したCI/CDに使える機能なども提供されているので、次回以降はそういったサービスにも触れていきたいと考えています
5. まとめと今後やりたいこと
私はインフラエンジニアのため、コンテナを使って開発をしたり、アプリのデプロイをする、という場面はあまりなく、出てくる単語も資格勉強で見かけたぐらいの理解度でした
そこで、今回の記事で、コンテナとは何か、またコンテナを使うには何が必要か、という基礎的な部分について改めて整理することができました
インフラエンジニアとしてはここからCI/CDについて理解を深める必要があると感じたため、次回以降はコンテナを利用したCI/CDについて知見を深めていきたいと思います
以上です