Dockerを使用すべきでない7つのケース

Dockerはゲームチェンジャーです。しかし、それは万能の解決策ではありません。

Dockerには多くの良い点があります。アプリケーションを軽量でポータブルな自給自足のコンテナ化ツールとしてパック、出荷、実行します。Dockerは、あらゆる規模の企業に最適です。小さなチームでコードの一部に取り組んでいる場合、「しかし、それは私のマシンでは機能します」という問題が解消されます。一方、企業はDockerを使用してアジャイルソフトウェア配信パイプラインを構築し、新しい機能をより速く、より安全に出荷できます。

組み込みのコンテナ化システムを備えたDockerは、クラウドコンピューティングのための優れたツールです。次に、DockerSwarmはクラスター化と分散設計を進めます。良すぎると思いませんか?そうですね、Dockerを使用しない場合はまだいくつかあります。これが7つです。

dockerを使用しないでください

これらを1つずつ見ていきましょう。

速度を上げる必要がある場合はDockerを使用しないでください

Dockerコンテナーは、サーバーとデータベースを備えた仮想マシンよりも小さく、必要なリソースも少なくて済みます。同時に、Dockerはホストのカーネルスケジューラが許可する限り多くのシステムリソースを使用します。Dockerがアプリケーションを高速化することを期待するべきではありません。

さらに、Dockerはそれをさらに遅くする可能性があります。使用している場合は、コンテナが使用できるメモリ、CPU、またはブロックIOの量に制限を設定する必要があります。そうしないと、カーネルがホストマシンのメモリが不足しているために重要なシステム機能を実行できないことを検出すると、重要なプロセスを強制終了し始める可能性があります。間違ったプロセス(Docker自体を含む)が強制終了されると、システムが不安定になります。

残念ながら、Dockerのメモリ調整(Dockerデーモンのメモリ不足の優先順位)では、この問題は解決されません。対照的に、アプリケーションとオペレーティングシステムの間にレイヤーを追加すると、速度が低下する可能性もあります。しかし、この減少は重要ではありません。Dockerコンテナーは完全に分離されておらず、仮想マシンのような完全なオペレーティングシステムを含んでいません。

セキュリティを優先する場合はDockerを使用しないでください

Dockerのセキュリティの最大の利点は、アプリを小さな部分に分割することです。一部のセキュリティが危険にさらされても、残りの部分は影響を受けません。

ただし、コンテナ内の分離されたプロセスはセキュリティの向上を約束しますが、すべてのコンテナは単一のホストオペレーティングシステムへのアクセスを共有します。分離が不完全なDockerコンテナを実行するリスクがあります。悪意のあるコードは、コンピュータのメモリにアクセスする可能性があります。

単一の環境で多数のコンテナーを実行する一般的な方法があります。これは、リソースコンテナの機能を制限しない限り、アプリをリソース乱用タイプの攻撃の素因にする方法です。効率と分離を最大化するには、各コンテナが1つの特定の懸念事項に対処する必要があります。

もう1つの問題は、Dockerのデフォルト構成です。ユーザーには名前が付けられていません。名前空間を使用すると、ソフトウェアリソースは、特定の名前空間に属している場合にのみ他のリソースを使用できます。

Dockerでアプリケーションを実行することは、root権限でDockerデーモンを実行することを意味します。Dockerコンテナーから抜け出すプロセスはすべて、コンテナー内で行ったのと同じ特権をホスト上で持ちます。非特権ユーザーとしてコンテナー内でプロセスを実行しても、セキュリティは保証されません。追加または削除する機能によって異なります。Dockerコンテナーのブレークアウトのリスクを軽減するために、信頼できないソースからすぐに使用できるコンテナーをダウンロードしないでください。

デスクトップGUIアプリケーションを開発する場合は、Dockerを使用しないでください

Dockerは、リッチUIを必要とするアプリケーションには適していません。Dockerは主に、コンソールベースのアプリケーションを備えた分離されたコンテナーを対象としています。GUIベースのアプリケーションは優先事項ではなく、それらのサポートは特定のケースとアプリケーションに依存します。Windowsコンテナーは、NanoサーバーまたはCoreサーバーのいずれかに基づいています。ユーザーがDockerコンテナーでGUIベースのインターフェイスまたはDockerRDPサーバーを起動することはできません。

それでも、PythonとQTフレームワークで開発されたGUIベースのアプリケーションをLinuxコンテナーで実行できます。また、X11転送を使用することもできますが、この解決策はやや厄介です。

開発とデバッグを明るくしたい場合は、Dockerを使用しないでください

Dockerは、開発者によって開発者のために作成されました。環境の安定性を提供します。開発マシン上のコンテナーは、ステージング、本番、またはその他の環境でまったく同じように機能します。これにより、さまざまな環境でのさまざまなプログラムのバージョン管理の問題が解消されます。

Dockerの助けを借りて、アプリケーションに新しい依存関係を簡単に追加できます。チームの開発者は、自分のマシンでこの操作を繰り返す必要はありません。すべてがコンテナ内で稼働し、チーム全体に配布されます。

同時に、Dockerでアプリをコーディングするには、追加のセットアップを行う必要があります。さらに、Dockerデバッグでは、ログ出力を構成し、デバッグポートを設定する必要があります。また、アプリケーションとサービスのポートをコンテナーにマップする必要がある場合もあります。したがって、複雑で面倒なデプロイメントプロセスがある場合は、Dockerが大いに役立ちます。単純なアプリの場合、不必要な複雑さが追加されるだけです。

異なるオペレーティングシステムまたはカーネルを使用する必要がある場合は、Dockerを使用しないでください

仮想マシンを使用すると、ハイパーバイザーはデバイス全体を抽象化できます。Microsoft Azureを使用して、WindowsServerとLinuxServerの両方のインスタンスを同時に実行できます。ただし、Dockerイメージには、作成されたものと同じオペレーティングシステムが必要です。

Dockerコンテナイメージの大規模なデータベース– DockerHubがあります。ただし、イメージがLinux Ubuntuで作成された場合、まったく同じUbuntuでのみ実行されます。

アプリがWindowsで開発されているが、本番環境がLinuxで実行されている場合、Dockerを効果的に使用することはできません。複数の静的アプリがある場合は、サーバーをセットアップする方が簡単な場合があります。

保存する貴重なデータがたくさんある場合は、Dockerを使用しないでください

設計上、すべてのDockerファイルはコンテナー内に作成され、書き込み可能なコンテナーレイヤーに格納されます。別のプロセスで必要な場合、コンテナからデータを取得するのは難しい場合があります。また、コンテナーの書き込み可能レイヤーは、コンテナーが実行されているホストマシンに接続されます。データを別の場所に移動する必要がある場合、それを簡単に行うことはできません。それ以上に、コンテナがシャットダウンすると、コンテナ内に保存されているすべてのデータは永久に失われます。

まず、データを別の場所に保存する方法を考える必要があります。Dockerでデータを安全に保つには、追加のツールであるDocker DataVolumesを使用する必要があります。それでも、このソリューションはまだかなり不器用であり、改善する必要があります。

管理が最も簡単なテクノロジーを探している場合は、Dockerを使用しないでください

2012年に導入されたDockerは、まだ新しいテクノロジーです。開発者は、Dockerのバージョンを定期的に更新する必要があるかもしれません。残念ながら、下位互換性は保証されていません。さらに、ドキュメントはテクノロジーの進歩に遅れをとっています。開発者として、あなたは自分でいくつかのことを理解する必要があります。

さらに、Dockerが提供する監視オプションは非常に貧弱です。あなたはいくつかの簡単な統計への素早い洞察を得ることができます。ただし、高度な監視機能を確認したい場合、Dockerには何もありません。

また、大規模で複雑なアプリケーションの場合、Dockerの実装にはコストがかかります。多数のサーバー上の多数のコンテナー間の通信を構築および維持するには、多くの時間と労力がかかります。それでも、マルチコンテナーDockerアプリの操作を簡単にする便利なツールであるDockerComposeがあります。Docker Composeは、サービス、ネットワーク、ボリュームを単一のYAMLファイルで定義します。

それにもかかわらず、Dockerエコシステムはかなり壊れています。すべてのサポートコンテナー製品が互いにうまく機能するわけではありません。各製品は、特定の企業またはコミュニティによって支援されています。これらの間の激しい競争は、製品の非互換性をもたらします。

まとめる

KeenEthicsの専門家は、Dockerでの作業を楽しんでおり、アプリ開発に使用することがよくあります。いくつかの欠点はありますが、これを使用して、分離されたコンテナーでアプリを並べて実行および管理することが簡単にできます。

アプリのインストールは、1つのコマンドを実行するのと同じくらい簡単です–。Dockerは、各テストにクリーンで独自の分離環境も提供するため、自動化テストにとって重要で便利なツールになります。

Dockerの機能は、依存関係の管理とセキュリティの面でメリットがあります。Docker Hub、Docker Swarm、Docker Composeなどの便利なツールで強化されたDockerは、人気がありユーザーフレンドリーなソリューションです。

Dockerにはすべての利点がありますが、開発するすべてのアプリケーションをコンテナー化するためにDockerを使用しないでください。

注意:Dockerはゲームチェンジャーです。しかし、それは万能の解決策ではありません。

市場に出回っているそのようなツールはDockerだけではありません。Dockerの代替は、「rocket」、Linux Containers、またはOpenVZと発音されるrktです。これらの長所と短所はそれぞれ、Dockerと非常によく似ています。Dockerの人気と使用率の高まりは、Dockerを採用するという企業の決定によってのみ引き起こされます。

Dockerを使用するかどうかについて結論にジャンプする前に、プロジェクトの要件を調べてください。チームメイトや同僚と話し合い、Dockerをいつ使用するか、いつコンテナーを使用しないか、Dockerのユースケースの1つであるかどうかを判断できるようにします。

好むと好まざるとにかかわらず、このテクノロジーには未来があります。Dockerを嫌い、進行中のすべてのプロジェクトからDockerを排除しようとする開発者や開発機関がいくつかあります。同時に、Dockerを万能薬と見なしているため、可能な限りすべてをコンテナ化するスペシャリストがいます。おそらく、どちらのキャンプにも参加すべきではありません。公平を保ち、客観を保ち、特定の状況に応じて決定を下します。

Dockerプロジェクトのアイデアはありますか?

私の会社のKeenEthicsは、経験豊富なWebアプリケーション開発者のチームです。同様のプロジェクトの無料見積もりが必要な場合は、お気軽にご連絡ください

あなたは私のキーンブログで同様の記事をもっと読むことができます。コードをリファクタリングする理由をお読みになることをお勧めします。またはソフトウェア開発モデルの説明:アウトソーシングと人員配置、固定価格と時間と材料?

PS

また、この記事を共著してくれたAlex Pletnovと、最後まで読んでくれた読者に「ありがとう」と言いたいです。

KeenEthicsブログに投稿された元の記事はここにあります:Dockerを使用しない7つのケース。