DUICUO

Dockerコンテナの過去と現在についてお話しましょう

I. Dockerの紹介

1. 仮想化とは何ですか?

コンピューティング分野における仮想化とは、サーバー、ネットワーク、メモリ、ストレージといった様々な物理コンピュータリソースを抽象化・変換し、これらの物理構造間の障壁を打ち破ることで、ユーザーが元の構成よりも効率的にリソースを活用できるようにするリソース管理技術です。これらの新しい仮想リソースコンポーネントは、既存のリソースアーキテクチャ、地理的な場所、または物理構成に制限されません。仮想化されたリソースには、一般的にコンピューティング能力とデータストレージが含まれます。

実際の運用環境において、仮想化技術は主に、高性能な物理ハードウェアの過剰容量と古いハードウェアの不足容量という問題に対処するために利用され、これらのリソースの再編成と再利用を可能にします。これにより、基盤となる物理ハードウェアが透過的になり、その利用率を最大化します。

仮想化テクノロジには、ソフトウェア仮想化、ハードウェア仮想化、メモリ仮想化、ネットワーク仮想化 (VIP)、デスクトップ仮想化、サービス仮想化、仮想マシンなど、さまざまな種類があります。

2. Docker とは何ですか?

Dockerは、2013年初頭にdotCloudのサイドプロジェクトとして始まったオープンソースプロジェクトです。GoogleのGoプログラミング言語を使用して実装されています。このプロジェクトは後にLinux Foundationに加盟し、Apache 2.0ライセンスの下でライセンスされており、コードはGitHubでメンテナンスされています。

Docker はオープンソースとしてリリースされて以来、幅広い注目と議論を集めており、dotCloud は後に社名を Docker Inc. に変更しました。Red Hat は RHEL 6.5 で Docker のサポートを集中化しており、Google も自社の PaaS 製品で Docker を広く使用しています。

Dockerプロジェクトの目標は、軽量なオペレーティングシステム仮想化ソリューションを提供することです。Dockerは、Linux Containers (LXC)などのテクノロジーをベースにしています。

DockerはLXCをさらにカプセル化することで、ユーザーをコンテナ管理の煩わしさから解放し、運用を大幅に簡素化します。Dockerコンテナの操作は、高速で軽量な仮想マシンの操作と同じくらい簡単です。

Docker を選ぶ理由は何ですか?

(1)簡単に学べる

ユーザーはわずか数分でプログラムを「Docker化」できます。Dockerは「コピーオンライト」モデルを採用しており、アプリケーションの変更を非常に高速化し、「コードを自由に変更できる」レベルを実現します。

その後、アプリケーションを実行するためのコンテナを作成できます。ほとんどのDockerコンテナは1秒未満で起動できます。ハイパーバイザーのオーバーヘッドが排除されるため、Dockerコンテナは高いパフォーマンスを提供し、同じホストマシン上でより多くのコンテナを実行できるため、ユーザーはシステムリソースを最大限に活用できます。

(2)責任の論理的分類

Dockerを使用すると、開発者はコンテナ内で実行されるアプリケーションに集中でき、運用担当者はコンテナの管理に集中できます。Dockerは、開発者がコードを記述する開発環境と、アプリケーションがデプロイされる本番環境間の一貫性を高めるように設計されています。

(3)迅速かつ効率的な開発ライフサイクル

Docker の目標の一つは、開発とテストからデプロイメントと運用に至るまでのコードのライフサイクルを短縮し、アプリケーションの移植性、ビルドの容易さ、そして共同作業の容易さを実現することです。(簡単に言えば、Docker は多くのアイテムを収納できる箱のようなものです。必要なアイテムがあれば、箱から取り出すだけで済み、一つ一つ取り出す必要はありません。)

(4)サービス指向アーキテクチャの利用を奨励する

Dockerはサービス指向アーキテクチャとマイクロサービスアーキテクチャも推奨しています。Dockerは、単一のコンテナで1つのアプリケーションまたはプロセスのみを実行することを推奨しており、分散アプリケーションモデルを形成します。このモデルでは、アプリケーションまたはサービスを相互接続された一連のコンテナとして表現できるため、分散アプリケーションのデプロイ、スケーリング、デバッグが非常に簡単になり、プログラムのイントロスペクションも向上します。(もちろん、単一のコンテナで複数のアプリケーションを実行することもできます。)

3. コンテナと仮想マシンの比較

コンテナは、ホスト マシンのオペレーティング システムを直接再利用して、オペレーティング システム レベルで仮想化を実装しますが、従来の方法では、仮想化をハードウェア レベルで実装します。

従来の仮想マシンと比較すると、Docker には起動速度が速く、サイズが小さいという利点があります。

4. Dockerコンポーネント

4.1 Dockerサーバーとクライアント

Dockerはクライアントサーバー(C/S)アーキテクチャのプログラムです。DockerクライアントはDockerサーバーまたはデーモンにリクエストを送信するだけで、サーバーまたはデーモンがすべての処理を実行し、結果を返します。Dockerはコマンドラインツール「Docker」と、包括的なRESTful APIセットを提供しています。Dockerデーモンとクライアントを同じホストマシンで実行することも、ローカルのDockerクライアントから別のホストマシンで実行されているリモートDockerデーモンに接続することもできます。

4.2 Dockerイメージとコンテナ

イメージはDockerの基盤です。ユーザーはイメージに基づいて独自のコンテナを実行します。また、イメージはDockerライフサイクルにおける「ビルド」の部分でもあります。

ファイルシステムイメージは、ユニオンファイルシステムに基づく階層構造であり、一連の命令によって段階的に構築されます。例としては、ファイルの追加、コマンドの実行、ウィンドウのオープンなどが挙げられます。

イメージはコンテナの「ソースコード」とも考えられます。イメージはサイズが小さく、非常に「ポータブル」で、共有、保存、更新が容易です。

Dockerはコンテナの構築とデプロイを支援します。アプリケーションやサービスをパッケージ化してコンテナに配置するだけです。コンテナはイメージに基づいて起動され、1つ以上のプロセスがコンテナ内で実行されます。イメージはDockerライフサイクルにおけるビルドまたはパッケージングフェーズ、コンテナは起動または実行フェーズと考えることができます。コンテナが起動したら、ログインして必要なソフトウェアやサービスをインストールできます。

つまり、Dockerコンテナとは、イメージフォーマット、一連の標準操作、そして実行環境です。Dockerは標準的な輸送コンテナの概念を借用しています。標準的な輸送コンテナは世界中に商品を輸送しますが、Dockerはこのモデルを設計に応用しています。唯一の違いは、輸送コンテナは商品を輸送するのに対し、Dockerはソフトウェアを輸送するという点です。

輸送コンテナと同様に、Docker はこれらの操作を実行する際にコンテナ内に何が入っているか(Web サーバー、データベース、アプリケーション サーバーなど)を気にしません。すべてのコンテナには、同じようにコンテンツが「ロード」されます。

Dockerはコンテナの配送先を問いません。ノートパソコンでコンテナを構築し、レジストリにアップロードし、物理サーバーまたは仮想サーバーにダウンロードしてテストを行い、特定のホストにデプロイできます。標準的な配送コンテナと同様に、Dockerコンテナは簡単に交換、スタック、配布でき、可能な限り汎用性が高くなっています。

4.3 レジストリ

Dockerは、ユーザーが作成したイメージを保存するためにレジストリを使用します。レジストリはパブリックまたはプライベートにすることができます。DockerはDocker Hubと呼ばれるパブリックレジストリを運営しています。ユーザーはDocker Hubにアカウントを登録することで、独自のイメージを共有・保存できます(注:Docker Hubからのイメージのダウンロードは非常に遅いため、独自のプライベートレジストリを構築することをお勧めします)。