Docker とは?最新のコンテナ型仮想化技術でアプリケーション開発を効率化!
- GKE
- docker
- コンテナ
Docker はコンテナ型の仮想化を使ってアプリケーションを実行するためのソフトウェアであり、 Docker を活用することで、企業は様々なメリットを享受できます。実際に Docker を日々の業務で利用している方もいらっしゃるのではないでしょうか?
そこで本記事では、 Docker とは何か?という基礎的な内容から、 Docker の構成要素やメリット、アーキテクチャ、コマンド例、活用事例まで、あらゆる観点から一挙にご紹介します。
目次
コンテナと仮想マシンの違い
Docker の内容に入る前に、まずはコンテナと仮想マシンの違いを正しく理解しておきましょう。
以下、要素ごとにコンテナと仮想マシン(仮想化)の違いをご説明します。
ゲスト OS
仮想化では、仮想環境におけるアプリケーションのプロセス管理はゲスト OS によって実行されます。そのため、仮想化においてはゲスト OS の起動が必要不可欠です。一方、コンテナ化の場合は、ホスト OS とプロセスが同期されているため、わざわざゲスト OS を立ち上げる必要はありません。
使用容量
仮想化で使用する仮想マシンは、アプリケーション以外に OS などが容量にカウントされるため、使用容量が大きくなる傾向にあります。一方、コンテナはアプリケーションを実行するためのライブラリなど、必要最低限のもののみが容量としてカウントされるため、仮想化と比較して容量を節約できます。
サーバー負荷
仮想化の場合、大きなサーバー負荷が発生するリスクがあります。仮想化は仮想マシンごとに独自の OS が搭載されており、アプリケーションの実行時にメモリの使用量が増えるためです。一方、コンテナ環境で実行されるアプリケーションは OS 環境を共有しています。そのため、仮想化よりも使用リソース量を低減でき、サーバー負荷を減らすことが可能です。
メンテナンス工数
仮想化における仮想マシンでは、メンテナンスの工数が大きくなります。全ての仮想マシンに独自の OS が搭載されているため、 OS アップデートやメンテナンスを個別に行う必要があります。一方コンテナ化の場合は、コンテナを搭載しているサーバーのみがメンテナンス対象となるため、運用管理の工数を削減できます。
まとめ
以下、コンテナと仮想マシンの違いを表にまとめました。
コンテナ | 仮想マシン | |
---|---|---|
ゲスト OS の起動 | 不要 | 必要 |
使用容量 | 小さい | 大きい |
サーバー負荷 | 小さい | 大きい |
メンテナンス工数 | 小さい | 大きい |
コンテナ化と仮想化は似ている言葉ですが、このように様々な違いが存在するため、それぞれの特徴を確実に理解しておきましょう。
Docker とは?
Docker は、仮想化技術の1つである、コンテナ型仮想化を使ってアプリケーションを実行するためのソフトウェアであり、1つの OS 上で任意の数の Docker コンテナと呼ばれる環境を作成します。 Docker コンテナは、ファイルシステムやプロセスツリー、ネットワークが他のコンテナと隔離されていて、直接お互いが干渉することはできません。
アプリケーションは Docker コンテナ内で動作するため、1つのアプリケーションを動作させるための Docker コンテナは、そのアプリケーションが必要とする依存ライブラリなどを持っておけばよいことになります。また、 Docker コンテナの元となるのが、 Docker イメージであり、 Docker イメージは元となる最小限の OS イメージに対して、アプリケーションを動作させるまでに行った差分が保存されています。
Docker は、Docker コンテナを起動する際に、この差分が含まれた Docker イメージをロードすることで、アプリケーションとそれを動作させる環境を作成しますが、 Docker イメージは状態を持たず、作成後は変化することがありません。そのため、アプリケーションのアップデートを行うためには、新しいバージョンの Docker イメージを作成して、 Docker コンテナを起動することになります。
Puppet や Chef といった構成管理ツールでは、依存するライブラリのバージョンを上げていくといった作業を何回も行っているうちに、ライブラリ同士の依存がコンフリクトするケースなども多くありました。また、開発環境と本番環境で環境が大きく異なってしまい、本番環境でのみ起こるバグが発生するといった問題も見られました。
このような課題に対するソリューションとして Docker が効果を発揮します。 Docker を用いたコンテナ型仮想化では、常にベースとなるまっさらな OS に対しての差分となるため、コンフリクトを気にする必要がありません。さらに、開発環境と本番環境の差がほとんどないため、安心してデプロイを行うことができます。
コンテナに関心のある方は以下の記事がオススメです。
コンテナ化とは?仮想化との違いやメリット、デメリット、ユースケースまで詳しく紹介!
Docker の構成要素
Docker は以下5つの要素で構成されています。
- Docker イメージ
- Docker コンテナ
- Docker サーバー
- Docker クライアント
- Docker Hub
それぞれの要素について、詳しく見ていきましょう。
Docker イメージ
Docker イメージとは、コンテナ環境を動かすために必要な、ミドルウェアなどの設定やコマンドが集約されているテンプレートです。通常はソフトウェアをインストールした上で初期設定を行い、詳細設定をカスタマイズする流れとなりますが、 Docker イメージを活用することで、これらのプロセスを簡略化できます。
Docker コンテナ
Docker コンテナとは、 Docker イメージを基にして構築された Web サーバーや DB サーバーが動作する仮想環境です。 Docker コンテナは OS が利用可能な状態で提供されているため、 OS 設定を行う必要がなく、プログラムをインストールするだけで、効率的に開発を進めることができます。
Docker サーバー
Docker サーバーとは、 Docker コンテナと Docker イメージを管理するためのサーバーです。 Docker サーバーは、 Docker を運用する上で欠かせない存在であり、とても大切な要素となっています。
Docker クライアント
Docker クライアントは、ユーザーが Docker を利用する際に必要となるものです。例えば、 Docker を操作するためのコマンドやツール群などが Docker クライアントに該当します。
Docker Hub
Docker Hub とは、 Dockerのイメージが公開されているサイトです。フリーのソフトウェアイメージだけではなく、個人が作成したイメージも掲載されています。 Docker Hub にアクセスしてイメージをダウンロードすることで、サーバーや DB 設定を気にせず、効率的なシステム構築を実現できます。
Docker のメリット
Docker にはどのようなメリットがあるのでしょうか?
代表的なものをいくつかご紹介します。
開発ライフサイクルを改善できる
Docker で Dockerfile を構成管理し、それを CI ツールによってビルド( Docker イメージ作成)やデプロイ(コンテナ起動)、環境テストなどを定期的に実行することで、環境チェックも含めて安心して開発を進めることができます。これにより、開発ライフサイクルが大きく改善され、継続的インテグレーションや継続的デリバリーに繋がり、自社の生産性向上に大きく寄与します。
開発環境を手間なく用意できる
Docker には、 Docker Registry や Docker Export / Import などの機能が搭載されており、コンテナの元となる Docker イメージを異なるホスト間で共有できます。例えば、チームで開発を進めている場合、開発用のマシンで作成した Docker イメージを他のマシンに簡単にコピーできるため、手間なく開発環境を用意することが可能になります。
アプリケーションの実行環境を高速デプロイできる
Docker コンテナは、 Docker を実行するホスト上で他のアプリケーションと同じプロセス単位で管理されるため、 OS のブート処理が不要になります。これにより、最低限のリソースで様々なことを実行できるため、アプリケーションの実行環境を高速にデプロイ可能になります。
Docker のアーキテクチャ
Docker のアーキテクチャはどのようになっているのでしょうか?
Docker コンテナプロセスの内部と外部に分けて、それぞれご説明します。
Docker コンテナプロセスの外部
Docker コンテナプロセスの外部では、 Docker コンテナの実行をサポートするモジュール( Docker Engine )が、サーバーとクライアントに分かれて動作します。
Docker クライアントはサーバーを操作し、コマンド実行により Docker デーモンを制御します。そして、 Docker デーモンは Docker イメージやコンテナなどのオブジェクトを作成・管理します。
Docker コンテナプロセスの内部
Docker コンテナプロセスの内部では、主に以下3つのコンポーネントが存在します。
- Docker イメージ
- Docker レジストリ
- Docker コンテナ
Docker イメージと Docker コンテナは前述した通りですが、 Docker レジストリは Docker イメージを共有するための仕組みを指しています。 Docker では、 Docker Hub Registry というレジストリを採用していますが、プライベートレジストリなどの別のレジストリを使うことも可能です。
Docker のコマンド例
Docker では、「 docker XXX 」のような並びがコマンドの基本となっており、とてもシンプルにコマンドを使うことができます。
以下、 Docker のコマンドの中から、代表的なものをいくつかご紹介します。実際のコマンドを掲載していますので、自社で Docker を活用する際の参考にしてください。
操作 | コマンド例 |
---|---|
コンテナの起動(CentOS) | $ sudo docker run -it centos |
コンテナの停止 | $ sudo docker stop (CONTAINER IDまたはNAME) |
コンテナの終了 | $ sudo docker kill (CONTAINER IDまたはNAME) |
コンテナの削除 | $ sudo docker rm (CONTAINER IDまたはNAME) |
Docker イメージの一覧表示 | $ sudo docker images |
このように、「 docker XXX 」という並びをベースとして、とてもシンプルにコマンドを利用できます。このコマンドの使いやすさも Docker の魅力の一つであると言えるでしょう。
Docker の料金体系
Docker には4つのプランがあり、それぞれ価格や提供する機能が異なります。
- 個人:無料
- プロ:月額5米ドル/ユーザー
- チーム:月額7米ドル/ユーザー
- ビジネス:月額21米ドル/ユーザー
どれも毎月定められた料金を支払う定額制となっており、無料で利用できる個人プランも用意されています。無料で Docker を利用できる点は大きなメリットですが、個人プランでは機能に様々な制約があります。
例えば、プライベートリポジトリは1つしか搭載されておらず、高度な画像管理もできません。また、自動ビルドや並行ビルドなどの CI / CD 領域の機能を使えない点に加えて、商用サポートも対象外となっています。
そのため、ビジネスで Docker を利用する場合は有償プランの中から選択するのがオススメです。自社の状況や要件に合わせて、最適なプランを選択してください。
Docker の活用事例
Docker が企業の中でどのように活用されているのか、具体的な事例を見ていきましょう。Docker を開発環境として利用している事例と、本番環境として利用している事例の2パターンをご紹介します。
開発環境における Docker 活用事例
とあるシステム会社では、同社のグループ企業のシステム保守や開発環境の運用を担っています。同グループは情報提供サービス事業に注力しており、凄まじい頻度で各種情報を更新しています。1つのプロジェクトを例に挙げると、基幹システムを月1回以上、開発環境は常に40件以上の改修が並行的に行われている状態でした。
従来、この開発環境を維持するために専任の担当者を配置し、次の開発が始まるたびに手作業で環境のクリーンアップを行なっていました。しかし、当然ながら運用負荷は高く、環境の利用申請から利用開始まで、長いリードタイムが発生してしまう点が課題として顕在化していました。
そこで、運用コストやリードタイムを削減するために Docker を導入し、様々なプロセスを自動化・効率化したのです。これにより、開発環境の提供期間は10日から10分に短縮され、開発環境のインフラ運用コストは 90% もの削減に成功しました。
本番環境における Docker 活用事例
とある企業では、自社が展開するサービスのアプリケーションサーバーとして Docker を利用しています。 Docker のポータビリティを活かし、アプリケーションサーバーのデプロイ業務を改善することが目的となっています。
例えば、 Docker 本体および周辺製品の更新が頻繁なため、当初は Docker 標準コマンドのみで実装していたり、 Web アプリケーションおよび Web サーバーをデプロイする単位で Docker コンテナ化したりなど、様々な工夫を行なっています。
これにより、同社はコンテナのデプロイやアプリケーション切り替えの自動化に成功しました。なお、サーバーへのコンテナ配置は手動で設定しており、コンテナのデプロイ数によるオートスケールはまだ実現できていないため、この点は今後の課題だと言えます。
Docker 活用には Google Cloud (GCP)がオススメ
ここまで、 Docker に関する内容をご紹介してきましたが、 Docker の導入効果を最大化するためには Google Cloud (GCP)がオススメです。 Docker は単体でも優秀なサービスですが、 Google Cloud (GCP)に搭載されている Google Kubernetes Engine (以下 GKE と記載)と組み合わせることで、さらに利便性が向上します。
GKE は、 Google Cloud (GCP)上で提供されている Kubernetes のマネージドサービスです。マスターノードは GKE が管理を行うため、ユーザー側は管理の必要がありません。
GKE はコンソールを利用してクラスターを容易に構築でき、負荷に応じたノードの自動スケーリングも可能となっています。また、 Google Cloud (GCP)のサービスアカウントや IAM を連携して権限を制御するなど、セキュリティを強化するための機能も多く実装されています。
さらに、ロードバランサーとの連携によるネットワークトラフィックの負荷分散やロギング・モニタリングなど、利用企業にとって嬉しいポイントが数多く存在します。
このように GKEは、自社の構築や運用の負荷を軽減しながら、 Kubernetes 環境としてクラウド上で利用できるコンテナのプラットフォームとなっています。 Google Cloud ( GCP )の各種機能とも容易に連携でき、様々なことを実現できる点も GKE が人気を集めている理由の一つと言えるでしょう。
この GKE を Docker と紐づけて考えた場合、「 GKE はクラスター管理を行うためのものであり、 Docker コンテナを動作させるためのオーケストレーションシステム」だと言えます。例えば、 GKE と Docker を組み合わせて使うことで、単一の Docker コンテナでクラスターを構成したり、複製された複数のコンテナを素早く立ち上げたり、といったことが可能になります。
このように、 Docker をより効果的に活用するためには GKE が欠かせません。 Google Cloud (GCP)には GKE 以外にも様々なソリューションが搭載されているので、ぜひ導入を検討してみてはいかがでしょうか?
GKE に関心のある方は以下の記事がオススメです。
Google Kubernetes Engine ( GKE )の2021最新機能を一挙紹介!さらに便利で使いやすくアップデート?
以下の記事で、 GKE による Docker イメージを使ったコンテナ起動方法を詳しくご紹介しています。
【GCP入門編・第7回】知らなきゃ損! Google Container Engine (GKE) での Dockerイメージを使ったコンテナの起動方法!
まとめ
本記事では、 Docker とは何か?という基礎的な内容から、 Docker の構成要素やメリット、アーキテクチャ、コマンド例、活用事例まで、あらゆる観点から一挙にご紹介しました。
Docker を活用することで、開発ライフサイクルの改善や開発環境準備の簡素化など、企業は様々なメリットを享受できます。実際、多くの企業が Docker を活用しており、自社の業務効率化や生産性向上を実現しています。
また、 Docker は単体でも優秀なサービスですが、 Google Cloud (GCP)に搭載されている GKE と組み合わせることで、さらに利便性が向上します。せっかく Docker を活用するのであれば、 GKE を導入しても損はないでしょう。
GKE は Google Cloud (GCP)に内包されているサービスであるため、利用するには Google Cloud (GCP)の契約が必要になります。 Google Cloud (GCP)には GKE 以外にも様々なサービスが搭載されているため、自社の企業成長を加速させてくれる強い武器になります。
本記事を参考にして、 Docker の活用および Google Cloud (GCP)の導入を検討してみてはいかがでしょうか?
Google Cloud (GCP)、またはGoogle Workspace(旧G Suite)の導入をご検討をされている方はお気軽にお問い合わせください。
メール登録者数3万件!TOPGATE MAGAZINE大好評配信中!
Google Cloud(GCP)、Google Workspace(旧G Suite) 、TOPGATEの最新情報が満載!