コンテナは手間をかける価値がありますか?
コンテナは、アプリケーションを必要なすべての依存関係と一緒にパッケージ化して、簡単に実行できるイメージとしてまとめることを可能にするUnixの概念です。これはDevOpsのワークフローに多大なメリットをもたらしますが、そのための追加の手間が本当に価値があるのでしょうか?
コンテナは開発環境と本番環境を同期させる
コンテナを使用すると、コードを実行するために必要なすべてを簡単に配布できるイメージにパッケージングするというアイデアです。つまり、イメージを実行するために必要なことは、それをダウンロードして実行するだけです。
docker run「私のマシンでは動きません」という日々は過ぎ去りました。コンテナを使えば---誰もが正しくDockerをインストールし、使い方を知っていれば---そのコンテナは他のすべての人のマシンとほぼ同じように動作するはずです。
さらに、これはあなたの本番環境にも当てはまります。開発ビルドではいくつかの開発機能を有効にすることがありますが、ほとんどの場合、コンテナはそのまま本番サーバーに送信できます。コンテナのホスティングに関して多くの問題は発生しないはずです。
コンテナは効率的なスケーリングを可能にします
コンテナを実行するのが非常に簡単なため、それを実行してくれるサービスがたくさんあります。これらは通常、オーケストレーションツールと呼ばれ、複数のサーバーにわたって複数のコンテナインスタンスを管理するためのツールです。
AWSはElastic Container Serviceを提供しており、これによりEC2インスタンスのフリートや独自のFargateサービス上でコンテナを実行して管理できます。Kubernetesはオープンソースであり、多くのクラウドプロバイダーがこれを使った統合を提供しています。
各オーケストレーションサービスは、インスタンスの健康状態を監視し、トラフィックが多いときには新しいインスタンスを立ち上げることができます。これにより効率的なスケーリングが可能になり、ホスティングコスト(AWSのオートスケーリングとスポットインスタンスを使用すると最大90%)を大幅に節約でき、インフラが足りなくなることをあまり心配する必要がなくなります。
さらに、コンテナはすべてのアプリのためにゲストOSを実行する必要がないため、仮想マシンを実行することで生じるパフォーマンスの低下を経験しません。これにより、コンテナホスティングは一般的に安価で、より効率的です。
そして、これらすべてはコンテナの特性のおかげで実現されており、余分な作業は必要ありません。同じことをAWSでカスタムAMIを使用して行うこともできますが、コンテナよりも管理がずっと難しく、結局ほとんど同じ作業を行うことになります。
コンテナ バージョン管理 あなたのシステム管理者
コンテナの最もクールな結果の1つは、サーバーの設定がすべて SysAdmin の頭の中から出てきて、
gitそれは管理され追跡されることができます。すべての新しいパッケージ、構成ファイル、インストールスクリプト、そして依存関係がコンテナのビルドフォルダ内に位置しているため、ソース管理に接続するのは簡単です。
コンテナは、DevOpsのワークフローの運用部分と特にうまく統合されます。それらは、サーバーアーキテクチャを管理するために置いているのと同じバージョン管理およびテストシステムを使用することを可能にします。そして、誰もが同じ環境を使用して開発、ビルド、テストを行っているため、プロセスは非常にスムーズに進むはずです。
さらに、Dockerは継続的インテグレーションシステムともうまく連携します。Dockerのビルドは自動化が容易で、特にAzure Pipelinesを使用している場合はそうです。Dockerイメージをサーバーの群にプッシュするのは、リポジトリ内のイメージを更新するのと同じくらい簡単です。新しいコンテナをサーバーの一部にデプロイして、その健康状態を監視し、全体の群にデプロイする前に確認することもできます。これは、コンテナを使用しなければ実装するのが困難なことです。
デメリット:頭痛は本当です
現実を見よう---コンテナは確かによりエレガントな解決策ですが、新しいLinuxボックスを立ち上げてソフトウェアをインストールするだけに比べて、セットアップや取り扱いがはるかに難しいです。誰もが後者を経験したことがありますが、前者は全体的にもっと時間を要します。(ただし、サーバーをたくさん運用している場合、Dockerは一度設定すれば済みます。)
もしあなたのタスクが特に複雑でなかったり、需要があまりなければ、コンテナを使用して実装するのは過剰かもしれません。コンテナ化する理由は本当にありません。
nginxと
nodeもしあなたがそれを一つのインスタンスで実行しているだけなら。
コンテナはアプリを実行する際に伴うすべての依存関係を管理するのを容易にしますが、アプリをテストしたいときにDockerを実行し、ポートをバインドするのは、単に行うのに比べてずっと面倒です。
npm startまたはプロジェクトディレクトリ内の似たようなもの。これは確かにスタートアップスクリプトで軽減できますが、macOSやWindowsを使用している場合、Webアプリを読み込むためにまるごと仮想マシンを実行していることになります。
結局、Dockerとその概念のファンであれば、個人プロジェクトに使用することを止めるものは何もありません。しかし、Dockerの利点は、より大きなチームで運用を始めると、頭痛を上回るようになり始めます。チーム環境では、アプリに関するすべてをバージョン管理システムやDevOpsワークフローに持ち込むことで、プロダクションの流れがスムーズになります。


