
Dockerとは(2)
イメージ(Image)
ドッカーで重要な概念には、コンテナとともにイメージがある。
イメージは、コンテナ実行に必要なファイルや設定値などを含んでいるもので、内容が変わらない(Immutable)。 コンテナは、イメージを実行した状態で、追加されたり変更したりした値は、コンテナに保存される。同じイメージで複数のコンテナを生成することができ、コンテナの状態が変わったり、コンテナが削除されてもイメージは変わらずそのまま残る。
Docker Image(http://pyrasis.com/docker.html)
ubuntuのイメージはubuntuを実行するためのすべてのファイルを持っていて、MySQLのイメージはDebianに基づいてMySQLを実行するのに必要なファイルと実行コマンド、ポート情報などを持っている。もう少し複雑な例として、GitlabのイメージにはCentOSがベースになっていて、ruby, go, database, redis, gitlab source, nginxなどが含まれている。
その名のとおり、イメージはコンテナを実行するためのあらゆる情報を持っているため、もう依存性ファイルをコンパイルしたり、あれこれインストールする必要がない。これからは新しいサーバーが追加されたら、あらかじめ作っておいたイメージをダウンロードしてコンテナを生成するだけである。1つのサーバーに複数のコンテナを実行でき、数十、数百、数千台のサーバーでも問題ない。
レイヤー方式
Docker Layer(http://pyrasis.com/docker.html)
ドッカーのイメージはコンテナを実行するためのすべての情報を持っているため、容量が数百MBに達するのが普通。最初にイメージをダウンロードするときはそれほど負担にならないものの、既存のイメージにファイルをひとつ追加したからといって、数百MBをダウンロードし直すのは、非常に非効率的である。
ドッカーはこのような問題を解決するために、レイヤーlayer
という概念を使用し、ユニオンファイルシステムを利用して複数のレイヤーを1つのファイルシステムとして使用できるようにしてくれる。イメージは、複数の読み取り専用のread onlyレイヤーで構成され、ファイルが追加されたり修正されたりすると、新しいレイヤーが作成される。ubuntuのイメージがA+B+C
の集合であれば、ubuntuイメージをベースに作ったnginxイメージはA+B+C+nginx
になる。webappイメージをnginxイメージ基盤で作ったとしたら、A+B+C+nginx+source
のレイヤーで構成される。webappソースを修正すれば、A、B、C、nginxレイヤーを除いて新しいsource(v2)
レイヤーだけをダウンロードすればよく、非常に効率的にイメージを管理することができる。
コンテナを生成するときも、レイヤー方式を使用していて、既存のイメージレイヤーの上に読み取り・書き込みread-write
レイヤーを追加する。イメージレイヤーをそのまま使用しながら、コンテナの実行中に生成するファイルや変更された内容は、読み取り・書き込みレイヤーに保存されるため、複数のコンテナを生成しても最小限の容量のみを使用する。
仮想化の特性上、イメージ容量が大きく、複数台のサーバに配布していることを考えると、単純ながらも非常に賢い設計である。