Docker概要
Dockerとは?
DockerはLinuxコンテナ技術を基盤としてDocker社が開発した仮想化技術であり、コンテナランタイムのオープンソースである。Dockerを使用すると、コードを迅速かつ正確にユーザーへ届けることができる。
ここではDocker自体について簡単に説明する。詳しい説明は Docker公式ドキュメント を参照してほしい。
- Dockerはコンテナベースの仮想化技術である。
- 従来はOSを仮想化していたため、Host OSの上にGuest OSをインストールする必要があった。この方式はかなり重く遅いため、多くの限界がある。
- そこでこれを克服するため、プロセスを隔離したコンテナによって仮想化を行うDockerのような技術が登場した。
- Dockerを通じて起動されるコンテナを管理するためにKubernetesが登場した。
Dockerの特徴
(1) 軽量
1つ目の特徴は、ダウンロードおよび実行が非常に軽量であることだ。
VirtualBoxなど従来のハイパーバイザー型仮想マシンは、ホストOS上でハイパーバイザーというソフトウェアが仮想マシンを作成し、その上でゲストOSを起動する方式である。ホストOSとゲストOSを分離できるという利点はあるが、ゲストOSと仮想マシンの分だけイメージサイズが大きくなり、オーバーヘッドが増えるため動作も遅くなる。
一方、Dockerが採用しているコンテナでは、各アプリケーションはLinuxコンテナ技術によってホストOSのカーネルを共有しながらも、各コンテナアプリケーションは分離された名前空間の中で実行される。図のDocker Engineは仮想マシンやカーネルのエミュレーションを行わないため、イメージサイズも小さく、ベアメタルに近いレベルで軽量に動作する。
「ベアメタル(Bare Metal)」という用語は、もともとハードウェア上に何のソフトウェアもインストールされていない状態を意味する。つまり、ベアメタルサーバーは仮想化のためのハイパーバイザーOSなしに物理サーバーをそのまま提供するものを指す。したがって、ハードウェアへの直接制御やOS設定まで可能である。
注1: コンテナとは、Dockerイメージを起動し、その内部でアプリケーションが実行中の状態である。

また、複数のイメージデータを共通化してデータサイズを減らす工夫もされている。具体的には、コンテナ自体が複数の階層で構成されており、コンテナ操作(パッケージのインストールやファイル作成など)は各レイヤーで行われる。この階層構造により、イメージを取得またはアップロードするときにはレイヤーの差分だけを処理すればよい。したがって、扱うイメージデータ量が減り、動作が軽くなる。
例えば、下図のAppBとAppCコンテナは、図の右側のように3つの層で構成されている。AppBとAppCはLayer2まで共通の操作でコンテナが作成されているため、Layer2まで共通化されている。したがって、先にAppBのイメージを上げてからAppCのイメージを上げるときは、Layer3だけを上げればよい。これは新しくアップロードするイメージデータ量とDocker Engineが読み込むデータ量の削減につながる。

上の図は DigitalOcean - The Docker Ecosystem: An Introduction to Common Components から引用した。
(2) 豊富なエコシステム:さまざまな環境にデプロイできる
DockerはもともとDocker社が開発した仮想化技術だが、現在はMicrosoft、Intel、Red Hat、Google、AWSなど多くの企業が立ち上げたOpen Container Initiativeを通じて、業界統一仕様として構成されている。多くのPaaSをサポートすることで、標準的なアプリケーションデプロイ方法として定着している。
主要OSであるLinux、Windows、Mac、および主要PaaSである AWS、Google Cloud、Azure がDockerをサポートしている。一度アプリケーションをDockerコンテナのイメージとして作成すれば、そのままさまざまなプラットフォームで実行できる環境が整ってきた。これにより、アプリケーションのデプロイ手段としてDockerイメージを活用する動きが活発になっている。プラットフォームごとの環境構築の手間を減らし、アプリケーション開発そのものにより集中できるようになる。
注3: WindowsやMacの場合、ホストOS上でハイパーバイザー型の仮想マシンを起動し、そのゲストOS上でDocker Engineを動かす構成になっている。Linux以外の場合、Dockerの軽量という利点を完全には享受できない点に注意してほしい。
(3) 充実したツール
APIとツールが整っていることもDockerの大きな利点である。実用的な用途を網羅した次のような多様なツールを無料で使用できる。初めて触れると多くて難しく感じるかもしれないが、一つずつ使いながら慣れていこう。
- Docker Engine
- Dockerコンテナイメージを実行・管理するサーバーと操作CLI(Command Line Interface)を含む。v1.12.0ではクラスタ管理機能も統合された。
- Docker Compose
- 複数のコンテナを実行・管理するためのツール。
- Docker Registry
- イメージを保存または配布できるサーバーソフトウェア。
また、イメージ管理用サーバーであるDocker Registryは、利用人数が増えると分散負荷やデータバックアップなどを考慮する必要が出てくる。そのような状況では、次のような選択肢を利用できる。
- Docker Hub
- Docker社が運営するPaaS版Docker Registry。無料で利用できる。
- オープンソースソフトウェア(OSS)コミュニティのように、イメージを公開できるプロジェクトに適している。
- Docker Trusted Registry
- 商用サポート向けのオンプレミスソフトウェアに該当するDocker Registry。
- 社内のような閉じた環境でDockerイメージを配布する場合に適している。
Virtual Machineとの違い
Virtual Machine(VM、仮想化)とかなり類似した機能を持ちながら、Virtual Machineよりはるかに軽い形でデプロイできる。
Dockerとの違いは次の通りである。
- Virtual Machine: 1つのOS上に複数の仮想OSを置き、その上でアプリケーションを動作させる。
- Docker: 1つのOSでDocker Engineを起動し、複数のコンテナを起動する。
仮想化と関連して、Dockerの利点は次の通りである。
- 軽量なリソース
- 別OSを使用しないため、OSイメージとカーネル分が減り、プロセッサおよびメモリの消費が少ない。
- ストレージ使用量の削減
- OSイメージの通常サイズは10GB程度であるのに対し、Docker Imageのサイズは1~2GB程度である。
- 高速な起動時間
- カーネルをロードする必要がない。
- 複数環境での運用が便利
- Dockerが起動していれば、どの環境でも使用できる。
Dockerの長所と短所
- 長所
- 実行環境を簡単かつ迅速に構築できる。
- ハードウェアリソースを節約できる。
- Docker Hubのような共有環境を提供する。
- 短所
- 開発初期のオーバーヘッドが発生する。
- Linuxとの親和性が高い。
DevOpsでの活用
従来の開発から運用デプロイまでの流れは次の通りだった。
- 開発者がコードを書く。
- インフラエンジニアが本番環境を構築する。
このような手順では環境に起因して、開発・テスト環境では動作するが、本番環境では動作しないことが起こり得る。
Dockerは、開発チームがコードとライブラリをパッケージングしてインフラエンジニアへ渡せるため、環境差異が発生しないという利点がある。