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である AWSGoogle CloudAzure が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は、開発チームがコードとライブラリをパッケージングしてインフラエンジニアへ渡せるため、環境差異が発生しないという利点がある。

参考

Docker紹介 | チョ・デヒョプのブログ