近年、アプリケーション開発の場面においてDockerを使用した環境の構築が一般的になっています。この記事では、Dockerの概要をはじめ、Dockerを使用して何ができるかについてまとめました。またメリットとデメリットについても紹介します。
Dockerとは何か
まずは、Dockerの基本的な概要について解説します。
Dockerとは、コンテナ型の仮想環境においてアプリケーションを開発、デプロイ、実行するためのオープンプラットフォームです。Dockerを使用することにより、アプリケーションをインフラから分離し、ソフトウェアを迅速に提供することが可能となります。さらに、アプリケーション管理と同じ方法でインフラストラクチャを管理することができます。つまり、コードの開発からテスト、デプロイへと至るプロセスをDockerで迅速化することで、コードを書いてから本番環境で実行するまでの遅延を大幅に短縮することができます。Dockerはソフトウェア開発において非常に利便性が高いため、デファクトスタンダードとして使われています。
コンテナ、コンテナ型とは
コンテナ型の仮想化技術は、PCやサーバーなど物理マシンのホストOS上にアプリケーションの環境を用意するものです。
コンテナは、元々は物流業界で用いられる貨物を運ぶための箱のことですが、ITにおけるコンテナとは、疎結合の環境でアプリケーションをパッケージ化し、実行する機能のことを指します。なお「疎結合」とは、互いの関連性が低く独立性が高いことを意味します。
この隔離性とセキュリティにより、同一のホストOS上で複数のコンテナを同時に実行することができます。
コンテナは軽量で、アプリケーションの実行に必要なものがすべて含まれているため、ホストOS上にインストールされているものに依存する必要はありません。パソコンやサーバーとは完全に分離された存在なので、コンテナを簡単に共有でき、共有する全員が同じ方法で動作する同じコンテナを取得することができます。
ハイパーバイザ型、ホスト型との違い
ここでは、従来の主な仮想化技術を紹介し、コンテナ型との違いを解説します。 1つ目はハイパーバイザ型です。これはホストマシンの上に直接インストールする仮想環境で、ホストマシンのOSの影響を受けません。コンテナはホストマシンのOSの上に環境を展開しているため、OSがあるかどうかの違いがあります。
2つ目はホスト型です。これはホストマシンのOSの上にホスト型仮想化ソフトウェアをインストールし、その中でさらにOSを構築します。コンテナではOSを構築しないので、コンテナの方がより軽量に扱えます。
Dockerでできること
Dockerではサービスを小さくして継続的な開発や修正を行うことができます。そのためマイクロサービスや継続的インテグレーション/継続的デリバリーを実践したい場合に向いています。
マイクロサービス
マイクロサービスとは、アプリケーションを互いに独立したコンポーネントに分割することを指します。コンテナはそれぞれが疎結合の立ち位置にあり、1つのコンテナが落ちたとしても他のコンテナへ影響を及ぼしません。そのためマイクロサービスの思想を実現するのにコンテナはとても便利です。マイクロサービス化することで全体像や個々の機能を理解しやすく、サービスの開発や修正のサイクルを短くすることができます。
さらにDockerは環境をコードで管理するため、あるDocker環境をコピーしてもう一つDocker環境を作ることが容易にできます。このようなDockerコンテナによる標準化されたコードのデプロイメントを活用し、マイクロサービスの構築と拡張を実現することが可能です。
継続的インテグレーションと継続的デリバリー
継続的インテグレーション(Continuous Integration)と継続的デリバリー(Continuous Delivery)は、それぞれの頭文字をとってCI/CDと一般的に表記されます。
まず「継続的インテグレーション(CI)」は、ソフトウェア開発におけるビルドとテストを自動化する手法です。継続的インテグレーションを行うことで、ソフトウェアの品質を高めながらリリースにかかる時間を短縮することができます。 次に「継続的デリバリー(CD)」は、コードの変更がマージされると自動的に本番環境へデプロイを行うものです。継続的デリバリーを実装することで、開発者は手間暇をかけることなく自動で本番環境へ最新のコードをデプロイできます。
データ処理
上記の「マイクロサービス」の項目でも触れたように、Dockerはそれぞれが独立した環境であり、またそれぞれのDockerは使い捨てです。そのため単純なデータ処理においても使うことができます。
バッチでのデータ処理で、今後も何度かバッチ処理の依頼が来るというユースケースを考えます。バッチなのでわざわざサーバーを立てるのは面倒なので、今後も同じ依頼が来るならば環境は取っておきたいと考えます。そこでDockerなら簡単に構築でき、また環境をコードで保持するので再現性を持たせられます。Dockerは使い捨てなので、バッチ処理が終わった段階でコンテナを落とせば完了となります。
Dockerのメリット
ここからはDockerのメリットを紹介します。
まず、コンテナはハイパーバイザ型やホスト型の仮想化技術よりもコンテナ内で作成する環境のスコープが狭いです。そのため他の仮想化技術よりもより軽量で、ホストマシンのリソースを消費しません。
次に、Dockerの移植性の高さが挙げられます。Dockerはアプリケーション環境をコードで管理しており、簡単に作成することができます。さらに他者にそのコードを渡すことでその人も同じ環境を容易に立ち上げることができます。
Dockerのデメリット
便利なDockerですが、一方でデメリットもいくつかあります。 まず、コンテナ内のデータを永続化できない点が挙げられます。これはコンテナの思想によるものですが、コンテナは「状態」を持たないので、コンテナ内に状態を持つデータを保存することは良くない実装です。例えば社員のデータや売上データは、コンテナ内ではなくデータベースに書き込む必要があります。
また、安定した動作を求められるシステムには向いていない、という点です。厳格な安定性を求める場合、コンテナを使わずにサーバーを運用する方がベターです。コンテナを使用することで修正をすぐに行える、といった柔軟性のメリットも、カチッと固まったシステムでは活かせません。
Dockerをインストールしてみる
ここではDockerのインストール方法を紹介します。MacとWindowsとではインストール方法が異なるため、それぞれ説明します。
Macの場合
Macインストーラーは公式サイト(下記URL)からダウンロードできます。
https://docs.docker.com/get-docker/
「Docker Desktop for Mac」のリンクからMac向けのインストーラー(DMGファイル)をダウンロードします。なお、Intel版とApple版に分かれているため、手持ちのCPUを確認の上、どちらかをダウンロードしてください。その後、インストーラーを起動してAPPファイルをアプリケーションフォルダにドラッグ・アンド・ドロップすれば完了です。
Windowsの場合
WindowsへのDockerのインストールも同じサイトからダウンロードできます。
https://docs.docker.com/get-docker/
「Docker Desktop for Windows」ボタンからWindows向けのインストーラー(EXEファイル)をダウンロードします。インストーラーを起動して、通常のアプリケーションと同様にインストールします。
まとめ
本記事では、アプリケーション開発においてDockerを使う場面やメリット・デメリット等をまとめました。 Azureは、Dockerを使うためのコンテナイメージ管理サービスやコンテナをサービスとして提供する機能があります。Dockerの導入を検討している方は、Azureを選択肢に入れてみてはいかがでしょうか。