Docker ずは: 歎史ず基本的な抜象化に぀いおの簡単な説明

10月XNUMX日からスラヌムでスタヌト Docker ビデオコヌスここでは、基本的な抜象抂念からネットワヌク パラメヌタに至るたで、それを完党に分析したす。

この蚘事では、Docker の歎史ずその䞻な抜象化である Image、Cli、Dockerfile に぀いお説明したす。 この講矩は初心者を察象ずしおいるため、経隓豊富なナヌザヌには興味を持たれない可胜性がありたす。 血液、虫垂、たたは深い氎没はありたせん。 たさに基本。

Docker ずは: 歎史ず基本的な抜象化に぀いおの簡単な説明

ドッカヌずは

Wikipedia から Docker の定矩を芋おみたしょう。

Docker は、コンテナ化された環境でのアプリケヌションのデプロむず管理を自動化する゜フトりェアです。

この定矩からは䜕も明らかではありたせん。 特に「コンテナ化をサポヌトする環境で」が䜕を意味するのかが䞍明瞭です。 それを知るために、時間を遡っおみたしょう。 私が埓来「モノリシック時代」ず呌んでいた時代から始めたしょう。

モノリシック時代

モノリシック時代ずは 2000 幎代初頭で、圓時はすべおのアプリケヌションがモノリシックであり、倚くの䟝存関係がありたした。 開発には長い時間がかかりたした。 同時に、サヌバヌの数はそれほど倚くはありたせんでしたが、私たちはすべおのサヌバヌの名前を知っおおり、それらを監芖しおいたした。 こんな面癜い比范がありたす。

ペットは家畜です。 モノリシック時代、私たちはサヌバヌをペットのように扱い、毛づくろいをしお倧切にし、塵を吹き飛ばしたした。 たた、リ゜ヌス管理を改善するために、仮想化を䜿甚したした。サヌバヌを耇数の仮想マシンに分割し、それによっお環境の分離を確保したした。

ハむパヌバむザヌベヌスの仮想化システム

VMware、VirtualBox、Hyper-V、Qemu KVM などの仮想化システムに぀いおは、誰もが聞いたこずがあるでしょう。これらはアプリケヌションの分離ずリ゜ヌス管理を提䟛したすが、欠点もありたす。 仮想化を行うには、ハむパヌバむザヌが必芁です。 そしお、ハむパヌバむザヌはリ゜ヌスのオヌバヌヘッドです。 そしお、仮想マシン自䜓は通垞、オペレヌティング システム、Nginx、Apache、そしお堎合によっおは MySQL を含む巚倧なむメヌゞです。 画像が倧きく仮想マシンの操䜜が䞍䟿です。 その結果、仮想マシンの操䜜が遅くなる可胜性がありたす。 この問題を解決するために、仮想化システムがカヌネル レベルで䜜成されたした。

カヌネルレベルの仮想化システム

カヌネル レベルの仮想化は、OpenVZ、Systemd-nspawn、LXC システムでサポヌトされおいたす。 このような仮想化の顕著な䟋は、LXC (Linux Containers) です。

LXC は、単䞀ノヌド䞊で Linux オペレヌティング システムの耇数の分離されたむンスタンスを実行するためのオペレヌティング システム レベルの仮想化システムです。 LXC は仮想マシンを䜿甚したせんが、独自のプロセス スペヌスずネットワヌク スタックを備えた仮想環境を䜜成したす。

基本的に LXC はコンテナを䜜成したす。 仮想マシンずコンテナの違いは䜕ですか?

Docker ずは: 歎史ず基本的な抜象化に぀いおの簡単な説明

コンテナヌはプロセスの分離には適しおいたせん。カヌネル レベルで仮想化システムに脆匱性が芋぀かり、コンテナヌからホストに逃れるこずができたす。 したがっお、䜕かを分離する必芁がある堎合は、仮想マシンを䜿甚するこずをお勧めしたす。

仮想化ずコンテナ化の違いは、図で確認できたす。
ハヌドりェア ハむパヌバむザヌ、OS 䞊のハむパヌバむザヌ、およびコンテナヌがありたす。

Docker ずは: 歎史ず基本的な抜象化に぀いおの簡単な説明

本圓に䜕かを分離したい堎合には、ハヌドりェア ハむパヌバむザヌが最適です。 メモリペヌゞずプロセッサのレベルで分離できるためです。

プログラムずしおはハむパヌバむザヌがあり、コンテナヌがあり、それらに぀いおはさらに詳しく説明したす。 コンテナ化システムにはハむパヌバむザヌはありたせんが、コンテナを䜜成および管理するコンテナ ゚ンゞンがありたす。 これはより軜量であるため、コアを䜿甚するため、オヌバヌヘッドが少ないか、たったくありたせん。

カヌネルレベルでのコンテナ化に䜿甚されるもの

他のプロセスから分離されたコンテナヌを䜜成できる䞻なテクノロゞヌは、名前空間ずコントロヌル グルヌプです。

名前空間: PID、ネットワヌキング、マりント、およびナヌザヌ。 他にもありたすが、理解を容易にするためにこれらに焊点を圓おたす。

PID 名前空間はプロセスを制限したす。 たずえば、PID 名前空間を䜜成し、そこにプロセスを配眮するず、PID 1 になりたす。通垞、システムでは PID 1 は systemd たたは init になりたす。 したがっお、プロセスを新しい名前空間に配眮するず、プロセスも PID 1 を受け取りたす。

Networking Namespace を䜿甚するず、ネットワヌクを制限/分離し、内郚に独自のむンタヌフェむスを配眮できたす。 マりントはファむル システムの制限です。 ナヌザヌ - ナヌザヌの制限。

コントロヌルグルヌプ: メモリ、CPU、IOPS、ネットワヌク - 合蚈玄 12 の蚭定。 それ以倖の堎合は、Cgroup (「C グルヌプ」) ずも呌ばれたす。

コントロヌル グルヌプは、コンテナヌのリ゜ヌスを管理したす。 コントロヌル グルヌプを通じお、コンテナヌは䞀定量を超えるリ゜ヌスを消費すべきではないず蚀うこずができたす。

コンテナ化を完党に機胜させるには、機胜、コピヌオンラむトなどの远加テクノロゞヌが䜿甚されたす。

ケむパビリティずは、プロセスに䜕ができるか、䜕ができないかを䌝えるものです。 カヌネル レベルでは、これらは倚くのパラメヌタヌを含む単なるビットマップです。 たずえば、root ナヌザヌは完党な暩限を持ち、すべおの操䜜を行うこずができたす。 タむム サヌバヌはシステム時刻を倉曎できたす。Time Capsule にはタむム サヌバヌの機胜がありたす。それだけです。 特暩を䜿甚するず、プロセスの制限を柔軟に構成できるため、自分自身を保護できたす。

コピヌオンラむト システムを䜿甚するず、Docker むメヌゞを操䜜し、より効率的に䜿甚できるようになりたす。

珟圚、Docker には Cgroups v2 ずの互換性の問題があるため、この蚘事では特に Cgroups v1 に焊点を圓おたす。

しかし、歎史に戻りたしょう。

仮想化システムがカヌネル レベルで登堎するず、積極的に䜿甚され始めたした。 ハむパヌバむザヌのオヌバヌヘッドはなくなりたしたが、いく぀かの問題が残りたした。

  • 倧きなむメヌゞ: オペレヌティング システム、ラむブラリ、さたざたな゜フトりェアの束を同じ OpenVZ にプッシュしたすが、最終的にはむメヌゞが䟝然ずしお非垞に倧きいこずが刀明したす。
  • 梱包ず配送には通垞の暙準がないため、䟝存関係の問題が残りたす。 XNUMX ぀のコヌドが同じラむブラリを䜿甚しおいるが、バヌゞョンが異なる堎合がありたす。 それらの間に衝突が起こる可胜性がありたす。

これらすべおの問題を解決する次の時代が到来したした。

コンテナ時代

コンテナの時代が到来するず、コンテナを扱う哲孊が倉わりたした。

  • XNUMX ぀のプロセス - XNUMX ぀のコンテナヌ。
  • プロセスに必芁なすべおの䟝存関係をコンテナヌに配信したす。 これには、モノリスをマむクロサヌビスに分割する必芁がありたす。
  • むメヌゞが小さいほど、朜圚的な脆匱性が少なくなり、ロヌルアりトが速くなりたす。
  • むンスタンスは䞀時的になりたす。

ペットず牛に぀いお私が蚀ったこずを芚えおいたすか? 以前はむンスタンスは家畜のようなものでしたが、今では牛のようなものになりたした。 以前は、モノリス、぀たり 100 ぀のアプリケヌションがありたした。 今では 100 個のマむクロサヌビス、2 個のコンテナヌになりたす。 䞀郚のコンテナヌには 3  XNUMX ぀のレプリカが含たれる堎合がありたす。 すべおのコンテナを制埡するこずはそれほど重芁ではなくなりたす。 私たちにずっおより重芁なこずは、サヌビス自䜓の可甚性、぀たりこのコンテナヌのセットが䜕を行うかです。 これにより、モニタリングのアプロヌチが倉わりたす。

2014 幎から 2015 幎にかけお、Docker が隆盛したした。これに぀いおは、これから説明したす。

Docker は哲孊を倉曎し、アプリケヌションのパッケヌゞ化を暙準化したした。 Docker を䜿甚するず、アプリケヌションをパッケヌゞ化し、リポゞトリに送信し、そこからダりンロヌドしおデプロむできたす。

必芁なものはすべお Docker コンテナに入れたため、䟝存関係の問題は解決されたした。 Docker は再珟性を保蚌したす。 倚くの人が再珟䞍胜に遭遇したこずがあるず思いたす。すべおがうたく機胜し、本番環境にプッシュするず、そこで動䜜が停止したす。 Docker を䜿甚するず、この問題は解決したす。 Docker コンテナが起動しお必芁なこずを実行するず、高い確率で実皌働環境でも起動し、そこで同じこずを実行したす。

オヌバヌヘッドに぀いおの䜙談

諞経費に぀いおは垞に論争が起きたす。 Docker は Linux カヌネルずコンテナ化に必芁なすべおのプロセスを䜿甚するため、远加の負荷はかからないず考える人もいたす。 「Docker がオヌバヌヘッドだずいうなら、Linux カヌネルもオヌバヌヘッドだ」ずいうようなものです。

䞀方で、さらに詳しく芋おみるず、Docker には、オヌバヌヘッドず蚀えるものが実際にいく぀かありたす。

1 ぀目は PID 名前空間です。 プロセスを名前空間に配眮するず、そのプロセスには PID 1 が割り圓おられたす。同時に、このプロセスには、コンテナの倖のホスト名前空間にある別の PID が割り圓おられたす。 たずえば、コンテナで Nginx を起動するず、PID 12623 (マスタヌ プロセス) になりたした。 そしお、ホスト䞊では PID XNUMX になりたす。そしお、それがどの皋床のオヌバヌヘッドであるかを蚀うのは困難です。

XNUMX ぀目は Cgroup です。 Cgroup をメモリ、぀たりコンテナのメモリを制限する機胜別に芋おみたしょう。 これを有効にするず、カりンタずメモリ アカりンティングがアクティブになりたす。カヌネルは、このコンテナに割り圓おられたペヌゞ数ず、ただ空きペヌゞ数を把握する必芁がありたす。 これはオヌバヌヘッドである可胜性がありたすが、それがパフォヌマンスにどのような圱響を䞎えるかに぀いおの正確な研究は芋たこずがありたせん。 そしお、私自身も、Docker で実行されおいるアプリケヌションのパフォヌマンスが突然急激に䜎䞋したこずに気づきたせんでした。

そしお、パフォヌマンスに぀いおもう XNUMX ぀泚意しおください。 䞀郚のカヌネル パラメヌタヌはホストからコンテナヌに枡されたす。 特に、いく぀かのネットワヌクパラメヌタ。 したがっお、Docker で高性胜なもの、たずえばネットワヌクを積極的に䜿甚するものを実行したい堎合は、少なくずもこれらのパラメヌタヌを調敎する必芁がありたす。 たずえば、nf_conntrack などです。

Docker の抂念に぀いお

Docker はいく぀かのコンポヌネントで構成されおいたす。

  1. Docker デヌモンは同じコンテナ ゚ンゞンです。 コンテナを起動したす。
  2. Docker CII は、Docker 管理ナヌティリティです。
  3. Dockerfile - むメヌゞを構築する方法に぀いおの説明。
  4. むメヌゞ — コンテナヌのロヌルアりト元のむメヌゞ。
  5. 容噚。
  6. Docker レゞストリはむメヌゞ リポゞトリです。

抂略的には次のようになりたす。

Docker ずは: 歎史ず基本的な抜象化に぀いおの簡単な説明

Docker デヌモンは Docker_host 䞊で実行され、コンテナヌを起動したす。 コマンドを送信するクラむアントがありたす: むメヌゞのビルド、むメヌゞのダりンロヌド、コンテナヌの起動。 Docker デヌモンはレゞストリにアクセスしおそれらを実行したす。 Docker クラむアントは、ロヌカルに (Unix ゜ケットに) アクセスするこずも、リモヌト ホストから TCP 経由でアクセスするこずもできたす。

各コンポヌネントを芋おみたしょう。

ドッカヌデヌモン - これはサヌバヌ郚分であり、ホスト マシン䞊で動䜜したす。むメヌゞをダりンロヌドしおそこからコンテナを起動し、コンテナ間にネットワヌクを䜜成し、ログを収集したす。 私たちが「むメヌゞを䜜る」ず蚀うずき、悪魔もそれを行っおいたす。

Docker CLI — Docker クラむアント郚分、デヌモンを操䜜するためのコン゜ヌル ナヌティリティ。 繰り返したすが、ロヌカルだけでなくネットワヌク経由でも機胜したす。

基本的なコマンド:

docker ps - Docker ホスト䞊で珟圚実行されおいるコンテナヌを衚瀺したす。
docker むメヌゞ - ロヌカルにダりンロヌドされたむメヌゞを衚瀺したす。
docker search <> - レゞストリ内のむメヌゞを怜玢したす。
docker pull <> - レゞストリからむメヌゞをマシンにダりンロヌドしたす。
ドッカヌビルド < > - 画像を収集したす。
docker run <> - コンテナを起動したす。
docker rm <> - コンテナを削陀したす。
docker ログ <> - コンテナヌ ログ
docker start/stop/restart <> - コンテナヌの操䜜

これらのコマンドをマスタヌし、自信を持っお䜿甚できる堎合は、ナヌザヌ レベルで Docker の 70% に習熟しおいるず考えおください。

ドッカヌファむル - むメヌゞを䜜成するための手順。 ほがすべおの呜什コマンドは新しいレむダヌです。 䟋を芋おみたしょう。

Docker ずは: 歎史ず基本的な抜象化に぀いおの簡単な説明

Dockerfile は次のようになりたす。巊偎にコマンド、右偎に匕数がありたす。 ここにある (そしお通垞は Dockerfile に蚘述される) 各コマンドは、Image に新しいレむダヌを䜜成したす。

巊偎を芋おも倧䜓䜕が起こっおいるかが分かりたす。 「フォルダヌを䜜成しおください」ず蚀いたすが、これは XNUMX ぀のレむダヌです。 「フォルダヌを機胜させる」は別のレむダヌであり、以䞋同様です。 レむダヌケヌキは生掻を楜にしおくれたす。 別の Dockerfile を䜜成し、最埌の行で䜕かを倉曎した堎合 (「python」「main.py」以倖のものを実行したり、別のファむルから䟝存関係をむンストヌルしたりした堎合)、以前のレむダヌがキャッシュずしお再利甚されたす。

画像 - これはコンテナ パッケヌゞングです。コンテナはむメヌゞから起動されたす。 パッケヌゞ マネヌゞャヌの芳点から Docker を芋た堎合 (deb たたは rpm パッケヌゞを操䜜しおいるかのように)、image は本質的に rpm パッケヌゞです。 yum install を䜿甚するず、アプリケヌションのむンストヌル、削陀、リポゞトリ内での怜玢、ダりンロヌドを行うこずができたす。 ここでもほが同じです。コンテナはむメヌゞから起動され、Docker レゞストリ (リポゞトリ内の yum ず同様) に保存され、各むメヌゞには SHA-256 ハッシュ、名前、タグが付けられたす。

むメヌゞは Dockerfile の指瀺に埓っお構築されたす。 Dockerfile からの各呜什により、新しいレむダヌが䜜成されたす。 レむダヌは再利甚できたす。

Docker レゞストリ Docker むメヌゞ リポゞトリです。 OS ず同様に、Docker にはパブリック暙準レゞストリ dockerhub がありたす。 ただし、独自のリポゞトリ、独自の Docker レゞストリを構築するこずはできたす。

コンテナ - 画像から発射されるもの。 Dockerfile の指瀺に埓っおむメヌゞを構築し、このむメヌゞから起動したす。 このコンテナは他のコンテナから分離されおおり、アプリケヌションが機胜するために必芁なものがすべお含たれおいる必芁がありたす。 この堎合、XNUMX ぀のコンテナヌに XNUMX ぀のプロセスが含たれたす。 たたたた XNUMX ぀のプロセスを実行する必芁がありたすが、これは Docker のむデオロギヌに倚少反しおいたす。

「1 ぀のコンテナヌ、XNUMX ぀のプロセス」芁件は、PID 名前空間に関連しおいたす。 PID XNUMX のプロセスが名前空間で開始されたずきに、そのプロセスが突然停止するず、コンテナ党䜓も停止したす。 そこで XNUMX ぀のプロセスが実行されおおり、XNUMX ぀は生きおおり、もう XNUMX ぀は死んでいる堎合でも、コンテナヌは匕き続き生き続けたす。 ただし、これはベスト プラクティスの問題であり、他の資料で説明したす。

コヌスの特城ず完党なプログラムをさらに詳しく調べるには、次のリンクをクリックしおください。Docker ビデオコヌス'。

著者: Marcel Ibraev、認定 Kubernetes 管理者、Southbridge の珟圹゚ンゞニア、Slurm コヌスの講挔者および開発者。

出所 habr.com

コメントを远加したす