Dockerは、アプリケーションとその実行環境をひとまとまりにして、どこでも同じように動作するようにする技術です。これを「コンテナ化」と呼びます。
簡単に言うと、アプリケーションを動かすために必要なもの(OS、ライブラリ、設定ファイルなど)を、すべて小さな「箱(コンテナ)」に詰め込んでしまうイメージです。
Dockerが生まれた経緯
Dockerが誕生する以前は、アプリケーションの実行環境を構築する際に、様々な課題がありました。
-
「私の環境では動くのに…」問題
開発者のPCでは動いたのに、本番環境のサーバーでは動かない、ということが頻繁に起きていました。これは、開発環境と本番環境でOSのバージョンやライブラリの種類が異なっていたためです。 -
環境構築の複雑さ
新しいサーバーにアプリケーションをデプロイする際、OSのインストールからライブラリの設定、ミドルウェアのセットアップまで、手作業で行う必要があり、非常に手間がかかりました。
この問題を解決するために、**仮想マシン(VM)**が使われるようになりました。VMは、OSごと仮想化する技術ですが、いくつかの欠点がありました。
-
リソースの消費
VMはOSを丸ごと動かすため、メモリやCPUを多く消費します。 -
起動に時間がかかる
OSの起動に時間がかかるため、手軽に利用することができませんでした。
このような課題を解決するために、コンテナ技術が登場しました。Dockerは、このコンテナ技術を誰でも簡単に使えるようにした、いわば「コンテナの使いやすいインターフェース」として誕生しました。
Dockerはどう作られているのか?
Dockerのコンテナは、仮想マシンとは異なり、OSを丸ごと仮想化するわけではありません。代わりに、Linuxカーネルの機能を共有して動きます。
具体的な技術要素としては、以下の2つが使われています。
-
cgroups(control groups)
コンテナごとに利用できるCPUやメモリなどのリソースを制限する機能です。これにより、あるコンテナが他のコンテナに影響を与えるのを防ぎます。 -
namespaces(名前空間)
プロセス、ネットワーク、ファイルシステムなどを、コンテナごとに隔離する機能です。これにより、コンテナはあたかも独立したシステムであるかのように動作します。
Dockerは、これらのLinuxカーネルの機能を活用し、以下のプロセスでコンテナを動かします。
-
Dockerfileの作成
コンテナの作り方を記述した設計図のようなファイルを作成します。ここには、どのOSをベースにするか、どのソフトウェアをインストールするか、どのファイルをコピーするかなどが書かれています。 -
イメージのビルド
Dockerfileを基に、コンテナの「元」となるイメージを作成します。イメージは、アプリケーションとその実行環境をひとまとまりにしたテンプレートのようなものです。 -
コンテナの実行
作成したイメージを基に、実際に動作する「箱」であるコンテナを生成し、実行します。