Dockerとは
今回は,Dockerとはなにか
というについてまとめます.
本記事は,いくつかの記事を見て理解したことをまとめたものです. 参考にした記事は最後にリンクを貼りました.
Dockerとは
Dockerとは,軽量なコンテナ型のアプリケーション実行環境. Docker社が2013年にオープンソースとして公開した.
他の方式との違い
独立したアプリケーション実行環境として,ハイパーバイザ型
(Hyper-V)などホスト型
(VMware PlayerやWindows Virtual PC, VirtualBoxあど)がある.
これらの方式は,目的のアプリケーションとは関係のないサービスなども多数動作するため,オーバーヘッドが大きく,リソースも無駄に多く必要になりがち.
これに対してコンテナ型の仮想化環境とは,Linuxカーネルがもつコンテナ
機能などを使って,実行環境を他のプロセスから隔離し,その中でアプリケーションを動作させる.
コンテナはLinuxの通常のプロセスとほぼ同じものだが,利用できる名前空間
やリソース
が他のプロセスやコンテナから隔離され,それぞれ固有の設定を持てる.
コンテナを管理するコストはプロセスを管理するコストとほぼ変わらず,仮想化マシンを管理するコストと比較すると非情に軽い.
- 名前空間の隔離機能
ファイルシステムやコンピュータ名,ユーザー名(ユーザーID),グループ名(グループID),プロセスID,ネットワーク機能などを,コンテナごとに独自に設定できるようにする機能.
- リソースの隔離機能
CPUやメモリ,ディスク入出力など,コンテナ内で利用するリソースを他のコンテナから隔離したり,設定に基づいて振り分けたりする機能.
3つの方式を比較した図を下記に示す.
- ホスト型
ホストOS上にハードウエアをエミュレートするアプリケーションを動作させ,その上でゲストOSを動作させる. 仮想化アプリケーションを簡単に導入でき仮想マシンの管理も簡単な反面,ホストOSのオーバーヘッドがあるため速度的に不利である.
- ハイパーバイザー型
物理サーバー上にハードウエアをエミュレートする仮想化プロダクト(ハイパーバイザー)を直接導入し,ハイパーバイザー上でゲストOSを動作させる. ホストOSのオーバーヘッドがないため,ホスト型よりも速度的に有利である.
- コンテナ型
ホスト型やハイパーバイザー型のようなハードウエアエミュレートは行わず,Linuxの各種コンテナ技術(リソース割当量の調整を行うcgroup
や,プロセス空間やネットワーク空間などを分離するnamespace
など)を用いてコンテナを構成する.
各コンテナはホストOSのカーネルを共有するが,コンテナ技術によってユーザープロセスやネットワーク,ディスク領域などが他のコンテナから隔離されるため,利用者からすれば新しい仮想マシンが立ち上がったように見える. ホストOSのカーネルを共有するため,コンテナの起動が圧倒的に速くオーバーヘッドも小さい.
Dockerイメージとは
Dockerではアプリケーションとその実行環境、展開/操作方法などをまとめて1つのパッケージにし,それをDocker image
として保存/配布する.
イメージはDocker hub」に公開されている.
Docker imageをDocker Engine上で起動したものがDockerのコンテナになる.
そのコンテナ内で必要なアプリケーションをインストールし,カスタマイズしてそれをディスクに保存すれば,新しいDocker image
として利用できる.
この方法は,すでに存在するimageや新しいimageをカスタマイズしたり,コンポーネントをバージョンアップするには不便である.
手動でカスタマイズした内容を,新しいimageに対してもう一度適用しなければならないからである.
そのような場合は,Dockerfile
というスクリプト機能を使うことになる.
このファイルにimageに対して適用する支持を記述しておき,Dockerfile
をベースとなるイメージに適用すれば,同じソフトウェア環境を用意することが可能である.
DOcker imageの履歴管理
DOckerのコンテナ内ではimage中のファイルシステムはすべて書き込み禁止になっており,書き込まれた内容はすべて新しいレイヤー
に保存される.元のimageの内容との差分データだけを別ファイルとして扱う.
レイヤーの内容は適宜コミッt0することにより,新しいimageとして保存できる.