ポイント: コンテナはアプリケーションをカプセル化し、環境間での一貫したパフォーマンスを可能にし、特にDevOpsの実践においてエンタープライズ管理を向上させます。インフラストラクチャコストを削減し、開発効率を向上させ、継続的デプロイとバージョン管理をサポートします。
- コンテナは、ソフトウェア展開に対する多用途で資源に優しいアプローチを提供します。
- 従来の仮想化手法と比較して、セキュリティと隔離を向上させます。
コンテナを構築することは、Kubernetes (K8s)や類似のオプションを使用したい場合に必要です。Kubernetesは、サーバー上でコンテナのオーケストレーションを処理しますが、それを使用する唯一の方法は、コードをコンテナに入れることです。
幸いなことに、コードをコンテナにパッケージ化するための多くの支援があります。それは非常に重要です。では、コンテナとは正確には何でしょうか?この記事では、コンテナ化の紹介を行い、次の内容を含みます:
コンテナとは?
コンテナは、コードをパッケージ化し、任意のマシンで実行できる方法です。
コードは異なる言語で書かれている可能性があり、他のソフトウェアに依存し、インターネットリポジトリからパッケージをインストールし、正常に実行するために特定のシステム要件(メモリサイズなど)を必要とする場合があります。コンテナ化では、コンテナがプログラムを実行するために必要なすべての比喩的なナットとボルトを保持します。コンテナは、プログラムを実行可能にするために必要なものを含む独自のランタイム環境を指揮します。具体的には以下のようなものです:
- ファイル
- ライブラリ
- 環境変数
これは、各アプリケーションがサーバー上で実行するためにオペレーティングシステムまたは完全な仮想マシン(VM)を必要とする従来の仮想化アプローチとは異なります。コンテナは、以下のように機能するため柔軟です:
- ベアメタルサーバー
- クラウドサーバー
- サーバー上の単一の仮想マシン。
したがって、他の人のキッチンで料理をする代わりに、コンテナはコーダーがどこに行ってもサーバー上に自分のキッチンを作ることを可能にします。サーバーは、洗練されたデザインや使いやすいOSがないパーソナルコンピュータに過ぎません。製品のパフォーマンスの観点から、コンテナ化は以下を確保します:
- 信頼性
- 一貫性
コンテナはどのように機能するか
コンテナは、ソフトウェアを実行するために必要なすべての前提条件ファイルをインストールします。
あなたは、Fry’s Electronicsでソフトウェアを購入していたことを思い出しますか?(☹)箱の裏側には通常、このソフトウェアはMacまたはWindowsを実行するマシンでのみ動作するという仕様が書かれていました。その後、ソフトウェアが動作するためには512MBのRAMと2GBの空きハードドライブスペースが必要という仕様がありました。より複雑なアプリは、最低限のメモリを持つグラフィックカードを必要とするかもしれません。
ある意味で、ソフトウェアパッケージの裏側の仕様は、ソフトウェア開発者が、特に多くの異なるコンピュータシステムに広くアプリケーションを展開する際、ユーザーのデバイスでアプリが失敗するリスクを制限する方法でした。今日、アプリ開発者は:
- より正確になれる
- リモートコンピュータを使用できる
- ソフトウェアが動作するために必要なシステムの種類を正確に指示できる
実際、コンテナ化では、開発者は自分自身で構築してソフトウェアが動作し、失敗しないようにすることができます。
コンテナ化には、マシン上で必要なソフトウェアとマシンを実行するために必要なハードウェアを定義する2つの仕様ファイルがあります。それは:
- Dockerfileは、ランタイム環境と必要なパッケージのインストールを制御します。
- Yamlファイルは、ハードウェアとネットワークセキュリティ要件を制御します。
フレームワークを理解することに加えて、結果を理解する必要があります。コンテナが作成されると、それはイメージを形成します。イメージは、単一のコンテナ内のランタイムコンポーネントの完全なセットから生じます。コードがコンテナ化され、イメージが作成されると、それを選択したホストに展開できます。これらは次のようにできます:
- 各人のマシンでローカルに実行します。
- クラウドマシンに展開します。
コンテナ化とサーバー仮想化
人々がサーバー仮想化について話すとき、通常は仮想マシンのことを指しています。VMはオペレーティングシステム、アプリケーション、サービスとメモリ、ストレージなどの間にハイパーバイザーレイヤーを作成します。
このレイヤーは独自のVMとして機能し、単一のアプリケーションを実行するための自己完結型環境を作成します。仮想化された各アプリケーションは、自分のオペレーティングシステムのバージョンを消費します。仮想環境で開発するには、次のことが必要です:
- 利用可能なオペレーティングシステムのいくつかのバージョンを持つ
- 複数のライセンスを購入する
一方、コンテナは単一のVMで複数のアプリケーションを実行できます。これにより、エンタープライズ企業がコンテナ環境で開発するために投資しなければならないソフトウェアライセンスの数が制限されます。彼らは、独自のOSカーネルを必要とするのではなく、OSカーネルを共有することによってこれを行います。この理由から、コンテナでの開発は、エンタープライズソフトウェア開発において、財政的にも計算的にもより資源を有効活用するアプローチです。
(コンテナとVMの違いを理解してください。)
セキュリティ
YAMLファイル
コンテナ化の企業の利点
コンテナは、チームがコードを開発する際の多くの問題に対する答えです:
- 異なるコードベース
- 異なるシステム間でのコードの共有
- 異なるランタイム環境でのコードの共有
- セキュリティ
- バージョン管理
さあ、ソフトウェアをコンテナエンジンに展開する際の主要な利点を見てみましょう。
マルチクラウドプラットフォーム技術
コンテナ化を仮想化手法として使用する最も望ましい利点の1つは、クラウド上で動作できることです。多くのエンジンがマルチクラウドプラットフォームをサポートしているため、次のようなプラットフォーム内で実行できます:
- Amazon EC2インスタンス
- Google Compute Engineインスタンス
- Rackspaceサーバー
- VirtualBox
コンテナは、どのキャリアによっても出荷できるようにコードをパッケージ化します。誰が扱っているかは関係なく、顧客は異なるプロバイダーから選択する力を持ちます。
テストと継続的展開
コンテナ化は、企業ビジネスに、複数のサーバーに展開するためのイメージを構築、テスト、リリースする柔軟性を提供します。
環境間の一貫性は時には変動しますが、特に開発およびリリースサイクルに関しては、Dockerのようなコンテナプロバイダーは、展開するイメージがどの環境であっても一貫性を確保するのを容易にしています。そのため、コンテナ化はアプリケーション配信を加速するためにDevOpsを使用している組織にとって非常に良い選択肢です。
(継続的展開と継続的テストのDevOpsプラクティスを探求してください。)
バージョン管理
競争力を維持するために、コンテナプラットフォームはバージョン管理を確保する必要があります。
Dockerは、環境が壊れた場合に以前のイメージにロールバックするのを簡単にする簡略化されたバージョン管理を提供することで高い基準を設定しました。競合他社もそれに従い、この仮想化手法は、指先でバージョン管理が可能な開発者に適しています。
隔離
仮想化の重要な要素は、リソースを各アプリケーションに分離することです。コンテナエンジンは、隔離に関して仮想マシンよりも優れています。しかし、どちらを使用するかの選択は考慮が必要であり、使用ケースに依存します。
一般的に、VMと比較して、コンテナは:
- 起動時間が速い
- 冗長性が少ない
- リソースの分配が良い
Dockerが登場したとき、セキュリティは薄かった。しかし、時が経つにつれて、Dockerは、すべてのコンテナをルートフォルダーから実行するなどの主要な問題を多く修正してきました。
コンテナ化のプロバイダーは、セキュリティを確保するためのさまざまな方法を提供していますが、1つのことは一貫しています。もしあなたのコンテナの1つがハッキングされた場合、他のコンテナで実行されているアプリケーションは影響を受けません。
それでも、個々のコンテナは攻撃に対して脆弱ですが、それらを保護する方法が存在します。ベストプラクティスやサードパーティの監視サービスを通じて。
(Dockerのセキュリティベストプラクティスをフォローしてください。)
多用途で資源に優しい
ほとんどの開発者は、コンテナが多用途で資源に優しいアプローチであるため、好んで使用します。企業は、物理的、仮想的、またはクラウド上のサーバースペースを節約しながら、すべての開発と展開のニーズが満たされることを保証できます。
VMと比較して、コンテナは:
- 通常MBで測定されるより少ないスペースを使用します
- 最小限のリソース消費に制限されることができます
ポータビリティ
コンテナアプリケーションはクラウドサーバー上で実行できるため、他のアプリケーションよりも一般的にアクセスしやすいです。コンテナでプログラミングすることは、ポータブルなソフトウェア開発アプローチを提供します。
再現性
DevOpsはコンテナ化を好みます。特に再現性の利点があるためです。各コンテナのコンポーネントは、コードから展開まで静的で変わりません。彼らは他のコンテナで繰り返し再現できる1つのイメージを作成します。
コンテナはDevOps文化をサポートします
ポータビリティと柔軟性を必要とする開発環境にとって、DevOpsとコンテナは素晴らしい解決策を提供します。このますます広まる採用は、2つの主要なトレンドによって促進されています:
- ビジネスがクラウド技術を広く採用し続け、あなたが手のひらでオペレーションを実行できるようにします。
- サービス提供者の提供が継続的に成長し、クラウドサービスをパッケージ化してビジネスオペレーションを簡素化し、コストを削減します。
より多くのビジネスが、自社のクラウドリソースがカスタマイズされ、統合され、自動化され、機能していることを確認するという厄介な問題を乗り越える中で、資格のあるDevOps専門家の需要は急増しました。より多くのDevOps専門家がいると、文化の変化が生じます。ここで2つのことが起こります:
- アプリケーションがますますアクセスしやすくなります。
- 企業は急速な成長を緩和するための革新的な解決策を求めます。
最後に、リモートチームと従業員がポータビリティの需要を高めています。彼らはインターネット接続のあるリモートロケーションで働き、しばしば異なるタイムゾーンや設定された作業時間を超えて活動するため、いつでも貢献できます。
コンテナ化は、正に彼らが探しているものを提供します。ソフトウェアのパッケージを一緒に出荷します。貢献はいつでも行うことができます。コンテナは、タイムゾーンやデバイス間で一貫したパフォーマンスを提供します。
(コードとコンテナの管理についてもっと学んでください。).
コンテナシステム
多くのサービスが、クラウド上でコンテナをオーケストレーションするのを助けます。ここでは、いくつかの人気のあるオプションを簡単に見ていきましょう。
DockerとKubernetes
最も広く使用されているプラットフォームはDockerで、runCに基づくオープンソースのコンテナシステムです。Dockerイメージは、いくつかのサービスとしてのプラットフォームで動作し、競合他社よりも柔軟性があります。
Dockerの基本的な機能は次のようになります:
新たに浮上しているベストプラクティスは、DockerとKubernetesを一緒に使用することです。異なる技術ですが、K8sとDockerを統合することで、コンテナリソースをより効率的に増強するための隔離メカニズムが作成されます。
CoreOS (rkt)
Dockerの最大の競争相手であるCoreOSのrkt(コアOS「ロケット」と発音)は、システムを使用して基礎となるアプリケーションを作成するための低レベルのフレームワークです。Google Kubernetesを動かすためのコンテナエンジンとして設計されています。
Google Kubernetes (Cloud Run, GKE & GCE)
Google Kubernetesには独自のコンテナエンジンであるrktがありますが、他の人気のあるエンジンを実行できるコミュニティでもあります。アプリケーションのライブラリを共有または開発するためのオープンソースのホスト環境です。
Kubernetesは、どこでもアクセスできる完全なクラウドサーバーを提供するため、良いポータブルオプションです。
Amazon AWS
AWSは、コンテナをサービスとして提供する(CaaS)の提供を顧客に提供するBackend-as-a-Service(BaaS)を提供します。また、Dockerイメージを展開するための広く使用されているホストでもあります。Kubernetesと同様に、AWSはクラウドコンピューティングのポータビリティを提供します。
Cloud Foundry
Cloud FoundryのGardenは、Platform-as-a-Serviceのオプションの一部としてコンテナ化を提供するオープンソースのオプションです。Gardenはコンテナエンジンです。Cloud Foundryは、ポータブルアプリケーションをクラウドサーバー上で開発、テスト、展開するためのホストです。
コンテナの始め方
自分でコンテナを試してみたいですか?プロセスを案内します。
要件ファイル
デバイス上のすべてのインストール済みパッケージのリストを生成する方法のコマンドは次のとおりです。おそらく、コードは環境で書かれ、正常にコンパイルされます。
- ソフトウェアが依存しているすべてのインストール済みパッケージのリストを取得します。
- このファイルを別のマシンにコピーします。
- マシン上でパッケージをインストールして、実行に必要なすべてを揃えます。
以下は、パッケージのリストを取得し、別のマシンにリストをインストールするためのコマンドの例です。コンテナがサーバー上で起動されるとき、これらのコマンドを実行して、ちょうど着陸したサーバー上でソフトウェアをインストールする必要があります。
これらはRubyおよびPythonの例です。これらの手順は、任意のプログラミング言語について見つけて繰り返すことができます。
Rubyの場合
Pythonの場合
Get all python packages in your environment:
pip freeze > requirements.txt
Install python requirements on a machine:
pip3 install -r requirements.txt
Rubyの場合
Put lists of gems in a file:
xargs gem unpack < $LISTNAME
Build gems without internet connection:
xargs -I gemname gem build gemname/gemname.gemspec < $LISTNAME
Build gems with internet connection:
xargs gem install < $LISTNAME
(この優れたハウツーを参照して、RubyコードをDockerコンテナに配置してください。)
DockerおよびDockerfileコード
Dockerでは、Dockerfileは必須ですが、そのタイプはGoogleのContainer Registryなど他のコンテナレジストリでも繰り返されています。
Dockerを使用して学んだ重要なこと:
- 既存のDockerイメージを使用して開始し、その後修正する。
- Dockerイメージのサイズを確認する。
- すべてのパッケージをダウンロードする1つのDockerイメージを作成し、その後、そのイメージを別のイメージにコピーしてスペースを節約することが可能です。(時にはパッケージがダウンロードされてインストールされるとき、データが二重になることがあります。)
Dockerfileは、コンテナが構築時に何をすべきかを指示する命令のセットです。これは、デプロイされる直前に発生します。
Dockerfileは、FROM、RUN、WORKDIR、COPY、RUN、CMDコマンドとその後の通常のコマンドライン入力の組み合わせを使用します。以下はシンプルなDockerfileの例で、次のことを行います:
- 12-alpineイメージからコンテナを構築します。
- Pythonコマンドを実行します。
- ディレクトリからコンテナの/appディレクトリにすべてをコピーします。
- すべての要件をインストールします。
- アプリケーション自体に意味のあるnodeコマンドを実行します。
‘’’
FROM node:12-alpine
RUN apk add --no-cache python g++ make
WORKDIR /app
COPY . .
RUN pip3 install -r requirements.txt
CMD ["node", "src/index.js"]
‘’’
(Dockerのドキュメントを参照して、詳細を確認してください。)
YAMLファイルは、Kubernetesサーバーにコンテナの要件を正確に伝える設定ファイルです。K8sを使用したことがあれば、YAMLに馴染みがあるでしょう。
YAMLファイルは、コンテナが必要とするものを指定します:
- 256 MBまたは8 GBのメモリ
- データ用の添付ボリューム
- 実行できるプロセスの数
- セキュリティの要件
- そして、実際には、もっと多くのこと
「Yet Another Markup Language」または「YAML Ain't Markup Language」の略であるYAMLは、高い可読性を持つシリアル化言語です。データを保存するためにJSONのようなものです。多くの目的に使用できますが、コンテナ化コードの設定ファイルとして一般的に使用されます。
Nick ChaseとMarantisは、YAMLをさらに詳しく解説しています。ここでは、YAMLが最終的にどのように見えるかをコピーしただけです。
‘’’
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rss-site
labels:
app: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: rss-reader
image: nickchase/rss-php-nginx:v1
ports:
- containerPort: 88
‘’’
コンテナを使用するタイミング
コンテナは、信頼性、ポータビリティ、柔軟性、そして仮想環境における再現性を提供するソリューションを通じてデジタルエンタープライズ管理を強化しようとしている企業や組織に最適です。
DevOps文化に移行する企業は、コンテナを慎重に導入する必要があります。コンテナを導入する際には、次のステップをお勧めします:
- ビジネスニーズを評価します。小規模でコンテナを実行して、ビジネスモデルと文化にどのように適合するかを確認します。
- DevOpsチームと共にコンテナのパイロットを行います。
- 生産段階に移行し、インフラストラクチャにコンテナを展開します。
Kubernetesインフラストラクチャに参加するには、2つの基本的なスキルが必要です
- コードをコンテナ化すること
- Kubernetesを学ぶこと(kubectlを学ぶ必要があります。幸い、私たちのK8sガイドがカバーしています)
Kubernetesは、サーバー上でコンテナのデプロイをオーケストレーションしますが、他にもオプションがあります。コンテナがなければ、展開するものはありません。
クラウドサービス企業が存在する理由は、管理の観点からも機器の観点からも、サーバーの管理がコストがかかるからです。彼らはほとんどのクラウドの問題を処理しますが、コンテナを作成し、彼らのサービスにデプロイするのはあなた次第です。
関連する読み物
これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。