Dockerは現在非常に人気があり、コンテナテクノロジーは全能のようですが、これは実際には誤解です。誇大広告に魅了されないでください。この記事では、誇大広告を捨てて、Javaプログラマーの観点からDockerの5つの現在の誤解を合理的にリストし、Dockerの利点と問題をよりよく理解するのに役立ちます。
メディアやメーカーからの誇大広告を別として、Dockerをより良く合理的に使用するにはどうすればよいですか?
Dockerは最近多くの注目を集めており、その理由は明らかです。コードを正常に配信する方法は、常にすべての人を悩ませてきました。従来のコンテナテクノロジーは、多くのニーズやテンプレートの中で混oticとしています。 Dockerは、簡単かつ繰り返しコンテナを作成できます。 Dockerを使用すると、他のコンテナよりも速く自然なコード配信が可能になります。 Duang、Dockerは人気があります!誤解や誤解もいくつかあります。 Dockerは使いやすいかどうかを他人に信用しないでください。 Dockerを自分で合理的かつ包括的に考えることは、あなたが本当にそれを必要とするかどうかを本当に理解するのに役立ちます。
この記事には、Javaの観点から5つの主要なDocker誤読がリストされています。しかし、最初にいくつかの背景知識を紹介します。 Dockerをよりよく理解するために、Dockerの豊富な経験を持ち、Devops Days Conferenceの主催者でもあるMusebytesのAvishai Ishシャロームに相談しました。私たちは彼とこれらの誤解をリストしました。
主な誤解
1. Dockerは軽量の仮想マシンです
これは、Dockerを初心者にするときの主な誤解です。この誤解は理解できますが、Dockerは仮想マシンのように見えます。 Docker WebサイトのDockerマシンと仮想マシンの違いを比較する人もいます。ただし、Dockerは実際には軽量仮想マシンではなく、改良されたLinuxコンテナ(LXC)です。 Dockerと仮想マシンは完全に異なります。 Dockerコンテナを軽量仮想マシンとして使用すると、多くの問題が発生します。
Dockerを使用する前に、Dockerコンテナと仮想マシンには多くの本質的な違いがあることを理解する必要があります。
リソースの分離:Dockerは、仮想マシンが提供できるリソース分離レベルに到達できません。仮想マシンのリソースは高度に隔離されており、Dockerは設立以来リソースを共有する必要があります。これらのリソースは、ページキャッシュやカーネルエントロピープールなど、Dockerによって分離および保護することはできません。 (注:カーネルエントロピープールは興味深いもので、システム操作によって生成されたランダムビットを収集および保存します。マシンは、パスワード関連など、ランダム化する必要があるときにこのプールを使用します。
オーバーヘッド:ほとんどの人は、仮想マシンのCPUとRAMが物理的なマシンのようなパフォーマンスを提供できることを知っていますが、追加のIOオーバーヘッドがあります。仮想マシンのゲストOSは放棄されているため、Dockerのパッケージは小さく、仮想マシンよりもストレージオーバーヘッドが少なくなります。しかし、これはDockerにオーバーヘッドの問題がないことを意味するものではありません。 DockerコンテナはまだIOオーバーヘッドに注意を払う必要がありますが、仮想マシンほど深刻ではありません。
カーネルの使用:Dockerコンテナと仮想マシンは、カーネルの使用量がまったく異なります。各仮想マシンは1つのカーネルを使用します。 Dockerコンテナは、すべてのコンテナ間でカーネルを共有します。共有カーネルは効率の向上をもたらしますが、高可用性と冗長性を犠牲にして。仮想マシンでカーネルのクラッシュが発生した場合、このカーネル上の仮想マシンのみが影響を受けます。 Dockerコンテナのカーネルがクラッシュすると、すべてのコンテナが影響を受けます。
2. Dockerはアプリケーションをスケーラブルにします
Dockerは非常に短い時間で複数のサーバーにコードを展開できるため、当然、Dockerはアプリケーション自体をスケーラブルにすることができると考える人もいます。残念ながら、これは間違っています。コードはアプリケーションの基礎であり、Dockerはコードを書き換えません。アプリケーションのスケーラビリティは、プログラマーに依存します。 Dockerを使用しても、コードが自動的に拡張しやすくなることはなく、サーバー全体に展開しやすくなります。
3. Dockerは、生産環境で広く使用されています
Dockerは本格的であるため、多くの人々は、Dockerを生産環境で大規模に使用できると考えています。実際、これは正しくありません。 Dockerはまだ非常に新しいテクノロジーであり、未熟で成長していることに注意してください。つまり、改善すべき厄介なバグや機能がまだたくさんあることを意味します。新しいテクノロジーに興味があることは事実ですが、正しい使用シナリオと注意が必要なものを把握することが最善です。現在、Dockerは開発環境に簡単に適用できます。 Dockerを使用すると、さまざまな環境を簡単に作成できます(少なくとも、人々はさまざまな環境を作成できると感じることができます)。これは、開発に非常に役立ちます。
生産環境では、Dockerの未熟さと不完全性も使用シナリオを制限しています。たとえば、Dockerは複数のマシンのネットワークとリソースの監視を直接サポートしていないため、生産環境で使用することはほとんど不可能です。もちろん、開発環境から生産環境に同じパッケージを直接展開するなど、多くの潜在的な領域があります。また、生産環境にも役立つDockerランタイム機能もいくつかあります。しかし、一般に、生産環境では、現在、利点よりも多くの利点はありません。これは、生産環境にうまく適用できないことを意味するものではありませんが、今では一度に成熟して完璧になるとは予想できません。
4. DockerはCross-OSです
もう1つの誤解は、Dockerがあらゆるオペレーティングシステムと環境で機能することです。これは、商品を積み込んだり降ろしたりするためのコンテナの類似性に起因する可能性がありますが、ソフトウェアとオペレーティングシステムの関係は、船の位置ほど単純で直接的ではありません。
実際、DockerはLinuxのテクノロジーです。さらに、Dockerは特定のカーネル機能に依存しており、最新バージョンのカーネルを持っている必要があります。異なるOSの違いに基づいて、OS間で最も低い一般的な機能を使用しない場合、多くの厄介な問題に遭遇します。これらの問題は発生率が1%しかないかもしれませんが、複数のサーバーに展開する場合、1%も致命的です。
DockerはLinuxでのみ実行されますが、OS XまたはWindowsでも使用できます。 Boot2Dockerを使用すると、OS XまたはWindowsマシンでLinux仮想マシンが実行されるため、Dockerはこの仮想マシンで実行できます。
5. Dockerはアプリケーションのセキュリティを強化します
また、Dockerがコードと配信プロセスのセキュリティを改善できることも誤解されています。これは、実際の容器とソフトウェア上のコンテナの違いでもあります。 Dockerは、オーケストレーション方法を追加するコンテナ化テクノロジーです。ただし、Linuxコンテナには、攻撃される可能性のあるセキュリティの脆弱性があります。 Dockerは、これらの脆弱性にセキュリティレイヤーやパッチを追加しません。アプリケーションを保護できるズボンのシャツではありません。
Javaの観点から
一部のJava開発者は、Dockerの使用を開始しています。 Dockerの機能のいくつかにより、スケーラブルなコンテキストを簡単に作成できます。 Uber-jarとは異なり、Dockerはすべての依存関係(JVMを含む)をすぐにリリースできる画像にパッケージ化するのに役立ちます。これは、開発者にとってDockerの最も魅力的なことでもあります。ただし、これはいくつかの隠された危険ももたらします。一般的に、プログラマーはさまざまな方法で監視し、インタラクティブにコードし、デバッグし、接続し、調整する必要があります... Dockerを使用する場合、これらには追加の作業が必要です。
たとえば、JMXがRMIを使用するためにネットワークが必要なため、JMX関数に依存するJConsoleを使用する必要があります。 Dockerを使用している場合、それほど直接的ではなく、必要なポートを開くにはスキルが必要です。当初、問題は、TakipiのDockerアプリケーションを構築したいとき、コンテナ内のJVMの外側でバックグラウンドプログラムを実行する必要があることを発見しました。 Githubの詳細なソリューション。
もう1つの深刻な問題は、Dockerコンテナのパフォーマンスチューニングが非常に困難であることです。コンテナを使用する場合、各コンテナがどのくらいのメモリが割り当てられるかわかりません。 20個の容器がある場合、メモリは不確実な方法でそれらに割り当てられます。パラメーター-XMXでヒープをチューニングする予定がある場合、Dockerコンテナ内のJVMの処理は、コンテナに割り当てられたメモリを自動的に取得する機能に依存するため、困難です。どのくらいのメモリが割り当てられているかわからない場合、パフォーマンスのチューニングはほとんど不可能です。
結論は
Dockerは非常に興味深いテクノロジーであり、実際の効果的な使用シナリオがあります。新興技術として、欠落している機能や既知のバグを解決するには多くの時間がかかります。しかし、現在、この分野には確かに多くの誇大広告があります。しかし、誇大広告は成功ではないことを忘れないでください〜
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!