Dockerとは何ですか?
2012年のリリース以来、DockerはDevOpsおよびWeb開発で最も急速に成長しているテクノロジーの1つになりました。ただし、他の新しいテクノロジーと同様に、まだ開発中であり、いくつかの制限があり、すべてのプロジェクトに適しているわけではありません。このガイドでは、Dockerの長所と短所の概要を説明しているため、Dockerをプロジェクトに追加するのが適切かどうかを判断できます。
Dockerの概念と用語のより基本的な概要については、Dockerの概要ガイドを参照してください。
Dockerのメリット
-
再現性 :Java仮想マシンを実行できるすべてのデバイスでまったく同じように実行されるJavaアプリケーションと同様に、DockerコンテナはDockerを実行できるすべてのシステムで同一であることが保証されています。コンテナの正確な仕様はDockerfileに保存されます。このファイルをチームメンバーに配布することで、組織は同じDockerfileから作成されたすべてのイメージが同じように機能することを保証できます。さらに、一定で十分に文書化された環境を使用すると、アプリケーションの追跡と問題の特定が容易になります。
-
分離 :コンテナー内の依存関係または設定は、コンピューターまたは実行中の他のコンテナーのインストールまたは構成には影響しません。アプリケーションのコンポーネント(たとえば、Webサーバー、フロントエンド、Webサイトをホストするためのデータベース)ごとに個別のコンテナーを使用することで、依存関係の競合を回避できます。システムで競合が発生することを心配せずに、1台のサーバーに複数のプロジェクトを配置することもできます。
-
セキュリティ :重要な注意事項(以下で説明)を使用すると、大規模なアプリケーションのさまざまなコンポーネントをさまざまなコンテナに分離することで、セキュリティ上のメリットが得られます。1つのコンテナが危険にさらされても、他のコンテナは影響を受けません。
-
DockerHub :LAMPスタックなどの一般的または単純なユースケースの場合、イメージを保存してDocker Hubにプッシュする機能は、十分に管理されたイメージがすでに多数存在することを意味します。事前に作成されたイメージをすばやくプルしたり、公式に保守されているDockerfileからビルドしたりできるため、この種のセットアッププロセスは非常に高速で簡単になります。
-
環境管理 :Dockerを使用すると、たとえばnginxを使用するWebサイトのさまざまなバージョンを簡単に維持できます。同じLinodeでテスト、開発、本番用に個別のコンテナーを作成し、それぞれに簡単にデプロイできます。
-
継続的インテグレーション :Dockerは、Travis、Jenkins、Werckerなどのツールとの継続的インテグレーションパイプラインの一部として適切に機能します。ソースコードが更新されるたびに、これらのツールは新しいバージョンをDockerイメージとして保存し、バージョン番号をタグ付けしてDocker Hubにプッシュし、本番環境にデプロイできます。
いつDockerを使用するか
アプリケーションが次のカテゴリの1つ以上に当てはまる場合は、Dockerが適している可能性があります。
-
新しいテクノロジーを学ぶ :インストールと構成に時間を費やすことなく新しいツールを使い始めるために、Dockerは分離された使い捨ての環境を提供します。多くのプロジェクトは、アプリケーションがすでにインストールおよび構成された状態でDockerイメージを維持しています。たとえば、Zipkinのような分散トレースシステムをチェックアウトする場合は、次を実行するだけでローカルホストで動作するセットアップを行うことができます。
sudo docker run -d -p 9411:9411 openzipkin/zipkin
-
基本的な使用例 :アプリケーションがデフォルトのDockerイメージで動作するのに十分な基本または標準である場合は、DockerHubからイメージをプルすることも優れたソリューションです。 LAMPスタックを使用してウェブサイトをホストする、リバースプロキシを使用する、Minecraftサーバーをセットアップするなどの場合、DockerHubで公式または十分にサポートされているイメージを利用できることがよくあります。これらのイメージのデフォルト構成がニーズに適している場合は、イメージをプルすることで、環境のセットアップと必要なツールのインストールに費やされる時間を大幅に節約できます。
-
アプリの分離 :1つのサーバーで複数のアプリケーションを実行する場合は、各アプリケーションのコンポーネントを別々のコンテナーに保持することで、依存関係の管理に関する問題を防ぐことができます。
-
開発者チーム :開発者がさまざまなセットアップで作業している場合、Dockerは、リモートボックスにSSH接続することなく、本番環境に厳密に一致するローカル開発環境を作成するための便利な方法を提供します。
Dockerを使用しない場合
Dockerが最善のソリューションではない場合もあります。次にいくつかの例を示します。
-
アプリは複雑で、システム管理者がいない/いない。 大規模または複雑なアプリケーションの場合、事前に作成されたDockerfileを使用するか、既存のイメージをプルするだけでは不十分です。複数のサーバー上の複数のコンテナ間の通信の構築、編集、および管理は、時間のかかる作業です。
-
パフォーマンスはアプリケーションにとって重要です。 コンテナーはホストカーネルを共有し、完全なオペレーティングシステムをエミュレートしないため、パフォーマンスに関しては、Dockerは仮想マシンと比較して優れています。ただし、Dockerはパフォーマンスコストを課します。コンテナ内で実行されるプロセスは、ネイティブOSで実行されるプロセスほど高速ではありません。サーバーから可能な限り最高のパフォーマンスを引き出す必要がある場合は、Dockerを使用しないことをお勧めします。
-
アップグレードの手間は必要ありません。 Dockerは、まだ開発中の新しいテクノロジーです。新機能を入手するには、バージョンを頻繁に更新する必要があり、以前のバージョンとの下位互換性は保証されません。
-
セキュリティはアプリケーションにとって重要です。 上記のように、アプリケーションのさまざまなコンポーネントを別々のコンテナに保持すると、1つのコンテナでの侵害がシステムの他の部分に簡単に影響を与えることがないため、セキュリティ上の利点がいくつかあります。ただし、Dockerのコンテナ化アプローチは、特により複雑なアプリケーションの場合、独自のセキュリティ上の課題を引き起こします。これらの問題は解決可能ですが、経験豊富なセキュリティエンジニアの注意が必要です。 (これらの問題の議論へのリンクについては、「詳細情報」セクションを参照してください)。
-
複数のオペレーティングシステム。 Dockerコンテナーはホストコンピューターのオペレーティングシステムを共有するため、異なるオペレーティングシステムで同じアプリケーションを実行またはテストする場合は、Dockerの代わりに仮想マシンを使用する必要があります。
-
クラスター。 別々のサーバー上のDockerコンテナーを組み合わせて、DockerSwarmを使用してクラスターを形成できます。ただし、Dockerは、Ansible、SaltStack、Chefなどのプロビジョニングまたは自動化ツールの代わりにはなりません。さらに、Dockerは最近Kubernetesのサポートを発表しました。これは、DockerSwarmがスタンドアロンのクラスターマネージャーとして十分ではない可能性があることを示唆しています。
Dockerコンテナを使用する必要がありますか?
Dockerは、コンテナーを使用してサーバー環境を構成、保存、および共有するための非常に一般的な方法になりました。このため、アプリケーションや大規模なスタックのインストールは、多くの場合、docker pull
を実行するのと同じくらい簡単です。 またはdocker run
。アプリケーション機能を異なるコンテナに分離することは、セキュリティと依存関係の管理にも利点をもたらします。
ただし、Dockerはシステムエンジニアリングや構成管理に代わるものではなく、そのアプローチには欠点があります。開発者は、Dockerが人気がありユーザーフレンドリーなソリューションであるという理由だけで、作成するすべてのアプリケーションをコンテナー化する誘惑に抵抗する必要があります。他のツールと同様に、Dockerを使用するかどうかを決定する前に、プロジェクトの要件を注意深く調査する必要があります。
詳細情報
このトピックの詳細については、次のリソースを参照してください。これらは有用であることを期待して提供されていますが、外部でホストされている資料の正確性や適時性を保証することはできません。
- Docker
- DockerHub
- Dockerを使用しない場合
- Dockerを使用する際の5つのセキュリティ上の懸念
- 生きるための8つのDockerセキュリティルール
- あなたのソフトウェアはDockerコンテナでより安全です