今回はdocker imageについて説明しますね。
まだdocker初心者だ!という人のために
- docker image(イメージ)とはどんなものか、
- コンテナと何が違うのか?
について解説していきますね。
画像を使ってなるべく、初心者にこそ分かりやすいように説明しますよ。
この記事を読めば、イメージについての知識は十分だと思います。
※ただし、この記事の説明はdockerのコンテナを知っている前提になってますのでご注意を。
docker image(イメージ)とは、コンテナの基になるやつ
dockerコンテナを立ち上げる基になるのがdocker imageです。
docker hubというdockerの公式サイトからpull(ダウンロード)してくることもできるし、自分で作ることもできます。
ぼくの場合は乾燥ワカメのスープの素に、お湯を注いでわかめスープにするような感覚で理解をしています。
ざっくりしすぎなのでもう少し説明しますね。
docker imageは、
- コンテナに必要なファイル郡をひとまとめにしたやつ
- 読み専用なレイヤーが重なってできてる
docker image はコンテナに必要なファイル群のまとまり
webサーバならnginxとかapacheに関するプログラムファイルだけが入ったイメージがあります。
データベースならMySQLとかmariaDBに関するプログラムだけが入っているイメージ。
そいういつ、1つのアプリケーションとかの単位に関係するプログラムだけが1つのイメージに入っています。
(もちろん、イメージの作り方によりますけど)
これがたとえば、virtualboxみたいな仮想マシンのファイルだとlinuxのosに関するファイルとかの不要なものまで入ってきます。
が、docker imageにはそういう不要なものは無くて、MySQLならそれに関係するファイルだけが入っています。
だからdockerはvmよりもファイルサイズが軽いのですよね。
dockerイメージは読み込み専用のレイヤー構造。コンテナはイメージに読み書き可能なレイヤを足したやつ。
docker imageはレイヤー構造になっています。
親レイヤーに、子レイヤーが1つずつレイヤーが重なってできています。
1つコマンドを打つと、1つのレイヤができる感じらしいす。
画像の例だと yum instal mysqlのコマンド。
またレイヤーはすべて読み専用。read onlyです。
ちょっとイメージしにいですけど、removeするのも1つのレイヤーとして上書きされる感じです。
過去に打ったコマンドの結果は1つのレイヤーとして保存されて後での変更ができません。
なのでインストールとアンインストールを繰り返すとイメージのサイズはどんどん大きくなります。
あと、僕はこれを知った時めっちゃわかりやすかったのですが、
docker imageとコンテナの違いは読み書き可能なレイヤがあるかどうかです。
※細かくは他にも違いがあるかも。
awsとかgcpなどのクラウドサーバを使ってる人向けの説明
awsとかのクラウドサーバを使っていると、最初はAMIからインスタンスを立ち上げますよね。
その関係と似ています。
docker imageからdockerコンテナを立ち上げる。
docker imageの継承について
余裕がある人だけ知っておくといいかも?な知識です。
1つのベースイメージを継承して2つのイメージを作った場合に、同一のレイヤーを共有して使う仕様みたいです。
同じレイヤーのデータを複数持たないことで、容量が大きくならないようになっています。
↑の例だとデータとして保持するのはnginxのレイヤ1つ、mysqlのレイヤ1つ、centosのレイヤも1つだけということ。
dockerって賢いですね!
まとめ
とまぁこんな感じです。
docker imageについて理解してもらえたでしょうか?