定義
Docker(ドッカー)とは、プログラムを動かすために必要なコードや設定、補助プログラムを「コンテナ」という標準規格の箱に丸ごと詰め込み、異なるコンピューター上でもほぼ同じ環境で動作させられるようにするソフトウェアプラットフォームです。
「自分のパソコンでは動いたのに?」という問題を解決します
開発者が最もよく直面する悩みのひとつに、「自分のノートPCでは確かに動くのに、なぜかサーバー上ではエラーが出る」という現象があります。パソコンごとにOS(Windows、Mac、Linux)が異なり、インストールされている言語や関連プログラム(ライブラリ)のバージョンもバラバラだからです。
昔の港では、荷物の大きさや形がバラバラだったため、船への積み込み作業が非常に大変でした。しかし、サイズが統一された四角い「貨物コンテナ」が登場したことで、トラック、列車、船のどこへでもスムーズに荷物を運べるようになりました。
Dockerはこの仕組みをコンピュータープログラムに応用しました。プログラムの実行に必要なファイルや環境設定を、ひとつの規格化されたコンテナに丸ごとパッケージ化します。そのため、自分のパソコンで正常に動いた箱は、他人のパソコンや巨大なクラウドサーバーに移しても、ほとんど同じように動作します。ただし、コンテナはベースとなるOSの中核(カーネル)を共有して使うため、WindowsやMacではLinux用コンテナを小さな仮想マシン内で動かす必要があり、CPUの種類が異なる場合はそれに応じた専用のイメージが別途必要になります。
重い仮想マシン(VM)より圧倒的に軽くて高速です
Dockerが広く使われる前は、異なる実行環境を用意するために主に「仮想マシン(Virtual Machine/VM)」という技術が使われていました。コンテナ技術自体はDocker以前から存在していましたが、Dockerが誰でも簡単に扱えるようにしたことで一気に普及しました。しかし仮想マシンは、コンピューターの中に別のコンピューターを丸ごと1台構築する仕組みのため、容量も数十ギガバイトに達し、起動にもかなりの時間がかかっていました。
一方、Dockerコンテナは、コンピューターの頭脳にあたるOSの中核(カーネル)を本体のコンピューターと共有します。そして、プログラムを動かすために必要最低限の隔離された空間だけを新しく作ります。
例えるなら、仮想マシンが住人ごとに一軒家を新築するようなものだとすれば、Dockerは頑丈なひとつのマンションの中で、個別の部屋を分け合って暮らすスタイルです。OSを丸ごと重複してインストールしたり再起動したりする必要がないため、仮想マシンに比べてはるかに素早く起動し、メモリの消費も大幅に抑えられます。ただし、コンテナ内のアプリが実際に立ち上がるまでの時間はアプリ自体によって異なります。
もう少し正確に言うと:イメージとコンテナ
Dockerを扱ううえで最も基本となる2つの重要概念が、「イメージ」と「コンテナ」です。
イメージ(Image)とは、たい焼きの金型や完成された料理のレシピのようなものです。プログラムのコード、実行コマンド、必要なツール群が、一度作れば書き換えられない(読み取り専用の)状態で固定された「実行用の設計図」ファイルです。
このイメージに実行指示を出し、コンピューターのメモリ上で実際に動かしたものを「コンテナ(Container)」と呼びます。完成した設計図(イメージ)が1つあれば、まったく同じ環境のコンテナを数十、数百個でもコマンド数回で素早く複製して起動できます。そのため、Kubernetes(クバネティス)のような管理ツールと組み合わせることで、アクセスが急増した際にもサービスの規模を迅速に拡大できます。
よくある誤解
Dockerは、パソコンの中にWindowsやLinuxを丸ごと新しくインストールする仮想マシン(VM)と同じものだ。
仮想マシンはOS全体を仮想的にインストールするため重くなりますが、Dockerは既存OSの中核(カーネル)を共有し、プログラムの実行空間だけを軽量に分離して使います。
日常で出会う場面
開発者が自分のノートPCで開発したWebアプリケーションを、そのままクラウドサーバーへデプロイ(公開)するときに使われます。
複雑なデータベースやWebサーバープログラムを、面倒なインストール手順なしでコマンド1行ですぐに起動したいときに使われます。
つまり ひとことで
プログラムと動作環境を標準規格の箱に詰め、どこでも軽量かつ同一に動作させるツールです。