ホーム
Topics
Docker
公開日:2024年6月6日
寄稿者:Stephanie Susnjara、Ian Smalley
Dockerは、開発者がコンテナを構築、導入、実行、更新、管理できるオープンソース・プラットフォームです。
コンテナは標準的で実行可能なアプリケーション・コンポーネントであり、アプリケーション・ソース・コードと、そのコードをあらゆる環境で実行するために必要なオペレーティング・システム(OS)ライブラリーや依存関係を組み合わせています。
ここで注意しておきたいのは、「Docker」とは通常、コンテナを構築および実行するためのランタイムであるDocker Engineや、Docker商用版を販売しているDocker社1を指しています。また、Docker社をはじめとする多くの組織や個人が寄与するDockerオープンソース・プロジェクト2にも関連しています。
コンテナは分散アプリケーションの開発とデリバリーを簡素化します。クラウドネイティブ開発とハイブリッド・マルチクラウド環境への移行が進む中で、コンテナの人気は高まっています。開発者は、Linux®やその他のオペレーティング・システムに組み込まれている機能を直接操作することで、Dockerなしでもコンテナを作成できますが、Dockerを使用すると、コンテナー化がより高速かつ簡単になります。この記事の執筆時点で、Docker社は、毎月2,000万人を超える開発者がプラットフォームを使用していると報告しています3。Kubernetesなどの他のコンテナ化テクノロジーと同様に、Docker社は、特にマイクロサービス・アーキテクチャーなどの最新のソフトウェア開発で重要な役割を果たしています。
大規模で密結合されたアプリケーションの従来のモノリシックなアプローチとは対照的に、マイクロサービスはクラウドネイティブのアーキテクチャー・フレームワークを提供します。このフレームワークは、多数の小規模で疎結合で独立して導入可能な小規模なコンポーネントまたはサービスから単一のアプリケーションを構成します。各サービスはDockerを使用してコンテナ化できるため、導入が簡素化され、チームは新しいバージョンを導入し、必要に応じてアプリケーションを拡張できます。
組織がハイブリッドクラウドを活用してAIの影響を拡大し、事業成果を推進する方法をご覧ください。
コンテナは、Linuxカーネルに組み込まれたプロセス分離および仮想化機能によって可能となります。これらの機能には、プロセス間でリソースを割り当てる制御グループ(Cgroups)や、システムの他のリソースまたはエリアへのアクセスや可視性を制限する名前空間が含まれます。
これにより、複数のアプリケーション・コンポーネントがホスト・オペレーティング・システムの単一インスタンスのリソースを共有できるようにします。こうした共有は、ハイパーバイザーが複数の仮想マシン(VM)で単一のハードウェア・サーバーの中央処理装置(CPU_、メモリー、その他のリソースを共有できるようにする方法に似ています。
コンテナ・テクノロジーは、アプリケーションの分離やコスト効率の高い拡張性など、仮想マシン(VM)のすべての機能とメリットに加えて、その他の重要な利点も提供します。
コンテナを使用する組織は、アプリケーションの品質向上、市場の変化への対応の迅速化など、他にも多くのメリットを報告しています。
Dockerは最も広く使われているコンテナ化ツールで、市場シェアは実に82.84%です。4現在、Dockerは非常に人気があるため、「Docker」は「コンテナ」の代名詞として使用されるほどですが、しかし、史上初のコンテナ関連技術は、2013年にDockerがオープンソースとして公開される何年も前から、あるいは何十年も前5から利用可能でした。
特に2008年には、LinuxカーネルにLinuXContainers(LXC)が実装され、Linuxの単一インスタンスでの仮想化が完全に可能となりました。LXCは現在でも使用されていますが、より新しいLinuxカーネル・テクノロジーも利用できます。最新のオープンソースLinuxオペレーティングシステムであるUbuntuも、この機能を提供しています。Dockerを利用することで、開発者は簡単なコマンドを用いてこれらのネイティブ・コンテナ化機能にアクセスし、作業を効率化するアプリケーション・プログラミング・インターフェース(API)を通じて自動化することができます。
Dockerには、互換性が低く、古いLXCよりも多くのメリットがあります。
LXCコンテナは多くの場合、マシン固有の構成を参照する一方で、Dockerコンテナは、デスクトップやデータセンター、クラウド・コンピューティング環境全体にまたがり、変更なしで実行されます。
Dockerを使用すると、開発者は単一のコンテナ内で複数のプロセスを組み合わせることができます。この柔軟性により、アプリケーションはその一部が更新または修理のために停止されている間も実行を継続できます。
Dockerはアプリケーションのソースコードに基づいてコンテナを自動的に構築できます。
Dockerはコンテナ・イメージのバージョンを追跡し、以前のバージョンにロールバックし、誰がどのようにビルドしたかを追跡することができます。古いバージョンと新しいバージョンの間の更新箇所(ソフトウェア・モジュールの部分的なリリース)のみをアップロードすることもできます。
開発者は、ユーザーが提供した何千ものコンテナを含むオープンソース・レジストリーにアクセスできます。
現在、Dockerコンテナ化はMicrosoft WindowsサーバーおよびApple MacOSでも機能します。開発者は、任意のオペレーティング・システム上でDockerコンテナを実行できます。Amazon Web Services(AWS)、Microsoft Azure、Google Cloud Services、IBM® Cloudなど、すべての主要クラウドサービス・プロバイダー(CSP)は、開発者がDockerでコンテナ化されたアプリケーションを構築、導入、実行するのに役立つ特定のサービスを提供しています。
Dockerはクライアント/サーバー・アーキテクチャーを使用しています。以下は、Dockerに関連するコア・コンポーネントと、それ以外のDockerの条件およびツールの内訳です。
Dockerホスト:DockerホストはLinux(または他のDocker Engine対応OS)を実行している物理マシンまたは仮想マシンです。
Dockerエンジン:Dockerエンジンは、Dockerデーモン、デーモンと対話する Docker API、およびデーモンと通信するコマンドライン・インターフェース(CLI)で構成されるクライアント/サーバー・アプリケーションです。
Dockerデーモン:Dockerデーモンは、お客様からのコマンドを使用してDockerイメージを作成および管理するサービスです。基本的に、DockerデーモンはDocker導入のコントロール・センターとして機能します。
Dockerクライアント:Dockerクライアントは、Docker API(REST API)にアクセスして、Unixソケットまたはネットワーク・インターフェースを介してDockerデーモンと通信するCLIを提供します。クライアントをデーモンにリモートで接続することも、開発者が同じコンピューター・システム上でデーモンとクライアントを実行することもできます。
Docker オブジェクト:Dockerオブジェクトは、アプリケーションのパッケージ化と配布に役立つDocker導入のコンポーネントです。これには、イメージ、コンテナ、ネットワーク、ボリューム、プラグインなどが含まれます。
Dockerコンテナ:Dockerコンテナは、Docker イメージのライブで実行中のインスタンスです。Dockerイメージは読み取り専用ファイルですが、コンテナはライブで一時的な実行可能なコンテンツです。ユーザーはそれらと対話でき、管理者はDockerコマンドを使用して設定と条件を調整できます。
Dockerイメージ:Dockerイメージには、実行可能なアプリケーションのソースコードと、アプリケーションコードをコンテナとして実行するために必要なすべてのツール、ライブラリー、および依存関係が含まれています。開発者がDockerイメージを実行すると、コンテナの1つのインスタンス(または複数のインスタンス)になります。
Dockerイメージを最初から構築することも可能ですが、ほとんどの開発者は共通リポジトリーからDockerイメージをプルダウンします。開発者は単一の基本イメージから複数のDockerイメージを作成でき、スタックの共通点を共有できます。
Dockerイメージはレイヤーで構成されており、各レイヤーはイメージのバージョンに対応しています。開発者がイメージに変更を加えるたびに、新しいトップ・レイヤーが作成され、このトップ・レイヤーがイメージの現在のバージョンとして以前のトップ・レイヤーに置き換えられます。以前のレイヤーは、ロールバックまたは他のプロジェクトで再利用するために保存されます。
Dockerイメージからコンテナが作成されるたびに、コンテナ・レイヤーと呼ばれるさらに別の新しいレイヤーが作成されます。ファイルの追加や削除など、コンテナに加えられた変更はコンテナ層に保存され、これらの変更はコンテナの実行中にのみ存在します。
この反復的なイメージ作成プロセスにより、複数のライブ・コンテナ・インスタンスが1つの基本イメージから実行でき、その際、共通のスタックを使用します。
Dockerビルド:Dockerビルドは、Dockerイメージをビルドするためのツールや機能を備えたコマンドです。
Dockerファイル:すべてのDockerコンテナは、Dockerコンテナ・イメージの構築方法を記したシンプルなテキスト・ファイルから始まります。DockerfileはDockerイメージの作成プロセスを自動化します。これは基本的に、Docker Engineがイメージを組み立てるために実行するCLI命令のリストです。Dockerコマンドのリストは膨大ですが、標準化されています。Dockerの操作は、コンテンツ、インフラストラクチャー、その他の環境変数に関係なく、同じように機能します。
Dockerドキュメンテーション:Dockerドキュメンテーション、またはDocker Docsとは、コンテナ化されたアプリケーションを構築するためのリソース、マニュアル、ガイドの公式なDockerライブラリーを指します。
Docker Hub:Docker Hub 6はDockerイメージのパブリック・リポジトリーであり、コンテナ・イメージの世界最大のライブラリーおよびコミュニティを自称しています7。商用ソフトウェア・ベンダー、オープンソース・プロジェクト、個人開発者から提供された100,000を超えるコンテナ・イメージが保存されています。Docker Hubには、Docker, Inc.によって作成されたイメージ、Docker Trusted Registryに属する認定イメージ、その他数千のイメージが含まれます。
すべてのDocker Hubユーザーは、イメージを自由に共有できます。また、コンテナ化プロジェクトの開始点として、Docker ファイルシステムから定義済みの基本イメージをダウンロードすることもできます。
GitHub8などの他のイメージ・リポジトリーも存在します。GitHubはリポジトリー・ホスティング・サービスであり、アプリケーション開発ツールとして、またコラボレーションとコミュニケーションを促進するプラットフォームとしてよく知られています。Docker Hubのユーザーは、多くのイメージを保持できるリポジトリーを作成できます。リポジトリーはパブリックまたはプライベートにすることができ、GitHubまたはBitBucketアカウントにリンクできます。
Dockerデスクトップ:Dockerデスクトップは、Docker Engine、Docker CLI クライアント、Docker Compose、Kubernetesなどが含まれるMacまたはWindows用のアプリケーションです。また、Docker Hubへのアクセスも可能にします。
Dockerレジストリー:Dockerレジストリーは、Dockerイメージ用のスケーラブルでオープンソースの ストレージおよび配布システムです。これにより、開発者は識別用のタグ付けを使用して、リポジトリー内のイメージのバージョンを追跡できるようになります。この追跡と識別は、バージョン管理ツールであるGitを使用して行われます。
Dockerプラグイン:開発者はプラグインを使用してDocker Engineをさらに機能的にしています。Docker Engineプラグイン・システムには、認証、ボリューム、ネットワークをサポートするいくつかのDockerプラグインが含まれています。サードパーティーのプラグインも読み込めます。
Docker拡張機能:Docker拡張機能により、開発者はDocker Desktop内でサードパーティー・ツールを使用し、その機能を拡張することができます。開発者ツールの拡張機能には、Kubernetesアプリケーション開発、セキュリティー、観測可能性などが含まれます。
Docker Compose: 開発者はDocker Composeを使用して、すべてのコンテナが同じDockerホスト上で実行されるマルチコンテナ・アプリケーションを管理できます。Docker Composeは、アプリケーションに含まれるサービスを指定するYAML(.YML)ファイルを作成し、1つのコマンドでコンテナを導入して実行できます。YAML構文は言語に依存しないため、YAMLファイルはJava、Python、Ruby、その他多くの言語で記述されたプログラムで使用できます。
開発者は、Docker Composeを使用してストレージの永続ボリュームを定義し、ベース・ノードを指定してサービスの依存関係をドキュメント化および構成することもできます。
少数のコンテナを実行する場合、業界の事実上のランタイムであるDocker Engine内でアプリケーションを管理するのは非常に簡単です。一方、数千のコンテナと数百のサービスで構成される導入の場合、コンテナ・オーケストレーション・ツールを使用せずにコンテナのライフサイクルを監視および管理することはほぼ不可能です。
Dockerには独自のオーケストレーション・ツール(Docker Swarm)が含まれていますが、業界標準はKubernetesです。その他の人気のあるコンテナ・オーケストレーション・プラットフォームには、Apache MesosやNomadなどがあります。
Kubernetesは、Googleの内部使用のために開発されたプロジェクト「Borg」から派生したオープンソースのコンテナ・オーケストレーション・プラットフォームです。2014年に一般公開されたKubernetesは、コンテナの導入、更新、サービスの検出、ストレージのプロビジョニング、負荷分散、健全性監視など、コンテナ・ベースのアーキテクチャーの管理に不可欠なタスクをスケジュールおよび自動化します。2015年、GoogleはKubernetesをクラウドネイティブ・コンピューティングのオープンソース、ベンダー・ニュートラルのハブであるCloud Native Computing Foundation(CNCF)9に寄付しました。
さらに、Istio、Knative、Tektonなどの Kubernetes用のツールのオープンソース・エコシステムにより、組織はコンテナ化されたアプリケーション向けに生産性の高いプラットフォーム・アズ・ア・サービス(PaaS)を導入できます。このエコシステムは、サーバーレス・コンピューティングへのより迅速な導入も可能にします。
オープン・コンテナ・イニシアチブ(OCI)10は、Dockerがコンテナ・イメージ仕様とランタイム・コード「runc」を寄付した後に2015年に設立され、コンテナ・イメージ形式とランタイムに関するオープンな業界標準の作成に取り組むLinux Foundationプロジェクトです。OCIは、Docker、IBM、Red Hatなどの大手企業で構成されており、イノベーションを支援すると同時に、組織がベンダー・ロックインを避けるのを助けます。
Dockerは最もよく知られ、よく使用されているコンテナ・テクノロジーですが、より広範なエコシステムは、コンテナ化や他の代替手段(LXC、CRI-O、Podmanなど)で標準化されています。2017年、Dockerはコンテナ化プロジェクトをCNCFに寄付しました。コンテナ化は、「runc」を使用する業界標準のコンテナ・ランタイムであり、Docker Engineのコア・コンテナ・ランタイムです。
コンテナ化されたワークロードを取り巻く複雑さには、コンテナとその基盤となるインフラストラクチャーを保護するセキュリティー対策の導入・維持が欠かせません。Dockerコンテナのセキュリティー対策は、コンテナ化されたアプリケーションのセキュリティー侵害、マルウェア、悪意のある行為者などのリスクから保護するように設計されています。
Dockerコンテナは相互およびホスト・システムから分離されているため、固有のレベルのセキュリティーが設計段階で備わっています。ただし、この分離は絶対的なものではありません。Dockerセキュリティーは、コンテナのランタイム、ビルド、オーケストレーションを含む包括的なゼロトラスト・フレームワークを中心に展開しています。
Dockerやその他のコンテナ関連のセキュリティー・ニーズにより、DevSecOpsの人気が高まっています。これは、設計の初期段階から統合、テスト、配信、導入に至るまで、ソフトウェア開発ライフサイクルのあらゆる段階でセキュリティー対策の統合を自動化するセキュリティー・アプローチです。また、Dockerセキュリティーのベスト・プラクティスには、本番環境に影響を与える前にセキュリティー上の問題を検知できる、スキャンや監視などのサードパーティ製のコンテナ・セキュリティー・ツールおよびソリューションが含まれています。
データ収集および視覚化に特化したドイツのオンライン・プラットフォームであるStatista社によると、世界の大企業85%以上がアプリケーション開発にマイクロサービスを利用しているといいます11。Dockerなら、各マイクロサービスをコンテナ化して個別にスケーリングおよび管理できるため、アプリケーションの導入を簡素化し、開発者が特定の環境を構成および管理する必要がなくなります。
Dockerは、アプリケーションのテストと導入のための一貫した環境を提供し、導入中に発生する可能性のあるエラーを減らすため、継続的インテグレーションと継続的デリバリー(CI/CD)パイプラインに最適です。
ソフトウェア開発アプローチとしてのマイクロサービスとDockerを組み合わせることで、 DevOpsチームに強固な基盤が構築されます。これにより、アジャイルなプラクティスを採用できるようになり、迅速な反復と実験が可能になります。これは、市場が要求する速度でソフトウェアとサービスを提供するために不可欠です。
Dockerのような軽量コンテナ技術は、異なる環境間でアプリケーションを簡単に移動させることができます。 すべての主要なクラウド・サービス・プロバイダーは、オンプレミス、パブリッククラウド、プライベートクラウド、エッジ設定を統合したハイブリッドクラウド環境でのDocker実行をサポートするDocker関連の開発および管理サービスを提供しています。Dockerは、複数のクラウド・ベンダーのクラウド・サービスを指すマルチクラウドのITインフラストラクチャー全体に簡単に導入できます。
コンテナ・アズ・ア・サービス(CaaS)は、開発者がコンテナ化されたアプリケーションを管理および導入することを可能にし、Dockerコンテナを大規模に実行することを容易にします。主要なCSPはすべて、インフラストラクチャー・アズ・ア・サービス(IaaS)やソフトウェア・アズ・ア・サービス(SaaS)などとともに、クラウド・サービスのポートフォリオの一部としてCaaSを提供しています。
Red Hat OpenShift on IBM Cloudは、パブリック環境およびハイブリッド環境でOpenShiftを活用して、速度、市場対応性、拡張性、信頼性を実現します。
IBM Cloud Satelliteを活用して、オンプレミス、エッジ、パブリッククラウド環境など、どこでも一貫したクラウド・サービスを開始できます。
クラウドとAIの取り組みを前進させるために、ITへの投資を検証し、デジタル環境全体で迅速かつ一貫してアクセスできるオープンな統合基盤を設計します。
完全に管理されたプライベート・レジストリーにコンテナ・イメージを保存し、分配します。プライベート・イメージをプッシュして、IBM Cloud Kubernetes Serviceやその他のランタイム環境で便利に実行できます。
1 Dockerについて(ibm.com外部へのリンク)、Docker
2 オープンソース・プロジェクト、 (ibm.com外部へのリンク)、Docker
3 Docker社のビルド、 (ibm.com外部へのリンク)、Docker
4 2024年の上位5のコンテナ化テクノロジー、(ibm.com外部へのリンク)、6シーン
5 コンテナの沿革:1070年代から現在まで、(ibm.com外部へのリンク)Aqua社、2020年1月10日
6 Dockerハブ、(ibm.com外部へのリンク)、Docker
7 Dockerハブの概要、(ibm.com外部へのリンク)、Docker
8 GitHub、(ibm.com外部へのリンク)
9 Cloud Native Computing Foundation、 (ibm.com外部へのリンク)
10 オープン・コンテナ・イニシアチブ、 (ibm.com外部へのリンク)
11 組織規模別マイクロサービスの世界利用状況2021年、(ibm.com外部へのリンク)、Statista社、2023年
12 Docker社、コンテキストに応じた自動ガイダンスで開発者の生産性を向上するDocker AIを発表(ibm.com外部へのリンク)、Docker、2023年