- 更新日: 2022年05月31日
- 公開日: 2019年07月24日
Dockerのイメージとコンテナの違い
Docker の学習初期に多くの方が疑問に思う「イメージとコンテナの違い」。
Googleで「docker image container difference」 と検索すると、” image VS container ” 等どっちを使うべきみたいな記事も。混乱しますよね。
今回は、プログラミング初心者、サーバー開発初心者の方でも分かりやすいように情報をまとめてみました。
Dockerのイメージとコンテナの違い
Dockerのイメージとは
「Docker のイメージ(image)は、コンテナを起動させるためのベース ・・・・・・」
恐らくどんな Dockerチュートリアルの説明を読んでも、イメージを一発で理解することは難しいと思います。それは「イメージ」を日常的に使っていないため。
まずイメージそのものについての概要を知っておくと、Docker のイメージも分かりやすくなると思います。
イメージは、通常パソコンに OS をインストールする時に使用。普通、パソコンを買った段階で OS はインストールされていると思いますが、 OS を入れ替えたり、自分でパソコンを作ったりする時に OS をパソコンにインストールします。
この OS をインストールする時に必要となるのが 「イメージ(ファイル)」 です。つまり日常的にパソコンを使ったり、プログラムをする段階では「イメージ」、あまり関係ないんですね。だから「イメージ」と聞いても、パッとしない、という訳です。
さてそうした普段あまり使わないイメージ、どうして Docker で頻繁に登場してくるかといいますと、それはアプリケーションの実行環境をたくさん作るためです。
画像クリックで拡大
例えば自分のパソコンをベースに WordPress や Ruby on Railes 、 Django、 人工知能の TensorFlow、 Keras、 などを使いたいとします。
WordPress では PHP、 Rails では Ruby、 Django では Python、 TensorFlow ではフレームワークのインストール、と開発前に実行環境を整える手間がかかります。また場合によっては、 WordPress の Apacheサーバーと Django の Nginxサーバーのポートが衝突して、設定ファイルの編集が必要になったり、 TensorFlow と Keras を同時に起動できなかったりという弊害リスクも。
その結果、 VirtualBox などの仮想マシンの利用に流れると思いますが、仮想マシンの場合、ハードディスクの使用領域が大きく、最初にセットアップが必要というデメリットが。また 1つのアプリを違う OS で試す場合、各 OS にアプリの実行環境を整えないといけないという手間が。。。
こうした開発環境の弊害を少なくし、開発しやすく整えたものが Docker というわけですが、上図に示すように OSベースで開発を始めるというよりは「機能を組み立てる」感じで開発を進めます。
例えば、 WordPress を開発しよう、データベースは MySQL と MongoDB 両方で試したいな、とします。従来は 1つの OS下に MySQL と MongoDB 両方をインストールする必要がありましたが、 Docker の場合はイメージの組み合わせを変えるだけで OK。まるでブロックを組み替える感覚で、データベースやサーバーの機能を変更できます。
そうした Docker のアプリケーション開発ですが、MySQL や Ruby、PHP を実行するためには OS が欠かせません。 『 OS が必要 = イメージファイルが必要 』となり、結果 Docker の使用にあたって「イメージ」が必要となるわけですね。
さてそこで Docker に一般的な Linux 系のイメージを利用したとすると、データサイズが大きく使い勝手が悪い。 そのため Docker のイメージでは、例えば Ubuntu であればクラウド型の軽量なイメージファイル(100MB前後)が利用されています。(参考:Ubuntuクラウド型のイメージ)
こうして従来は重い、使いにくいとされていた仮想環境の開発環境を、 Docker は軽量で使いやすいという素晴らしい改善をしてくれたというわけです。
さらに Docker は従来の VirtualBoxなどではできなかった、イメージ・ファイルの編集(1)を実現。 例えば Ubuntu デスクトップや Ubuntuサーバーのイメージファイルをダウンロードし、ファイルを編集したり追加しようとしても実行できません。しかし、 Docker 環境下においては、クラウド型の Ubuntu イメージをコンテナ化することで間接的にイメージを編集可能。
この「イメージの編集」によって、Docker はイメージの機能や内容を継承できます。「イメージの継承」、 例えば
- Ubuntu 16.04 のイメージを利用して、最初の Docker イメージを作成
- 次は最初のイメージに Apache 機能を追加したものを Dockerイメージとして保存
- そして次は PHP を追加して、Dockerイメージとして保存
という具合にイメージに機能を足していくことができます。 その結果、 Docker のイメージには
- OS: Debian に PHP や Apacheがセットされた WordPress のイメージ
- OS: Debian に MySQLがセットされた MySQLのイメージ
- OS: Ubuntu に Python3 と TensorFlow と Jupyter Notebook がセットされた TensorFlow のイメージ
という開発環境の整ったイメージが豊富に存在するという訳です。
つまり Docker イメージを使うことで、従来必要だったプログラミング言語のインストールやフレームワークのインストールといった手間がかからず、そしてパソコンのプログラミング環境を汚すことなく様々なアプリ開発に即・挑戦できる、ということ。
このように Docker のイメージを説明・理解しようと思うと、とても一言では終わらないレベル。そのため Docker のイメージは分かりにくい、という風になってしまっているのではないでしょうか。しかし、 Docker のイメージを理解することで、より Docker を楽しく使えるようになると思います。
【Dockerイメージの理解促進資料/DockerでTensorFlowのイメージを利用する様子】
実行コマンド
docker run -it -p 8888:8888 tensorflow/tensorflow:nightly-py3-jupyter
たった 1行のコマンドで Python3 + TensorFlow + Jupyter Notebook の環境が実行できます。 Docker のイメージの威力を感じることのできる一例でしょう。 Anacondaナシでもすぐに人工知能のプログラム、楽しめちゃいます。
ちなみに上記コマンド実行後のイメージの確認は、
docker images
もしくは
docker image ls
でダウンロードした Docker のイメージを確認できます。またイメージの詳細については、
docker image inspect イメージ名
今回の場合
docker image inspect tensorflow/tensorflow:nightly-py3-jupyter
で確認可能。
【上図コマンド実行結果】
画像クリックで拡大
docker image inspect 〇〇
のコマンドを実行することでイメージの詳細情報は確認できますが、内容は、、、、何のことかさっぱり分かりません。 Docker のイメージについてより詳しく知りたい時は、 Dockerfile が一つのヒントになってきます。
例えば、上記の TensorFlow の例でいえば、 GitHub に TensorFlow のイメージを作成するための Dockerfile のプログラムが公開されています(リンク)。 ひと手間かかりますが、こちらの Dockerfile を読むことで、イメージの内容及び機能を理解することができるでしょう。
【普通のイメージと Dockerイメージの比較】
普通のイメージ | Dockerのイメージ | |
代表的な例 | Windows、Uuntu、Debian | mongo、Nginx、Postgres |
用途 | 汎用パソコン、 サーバー | Docker コンテナ作成用 |
データサイズ | 大きい(Ubuntu 16.04 : 1.6GB) | 小さい(Ubuntu 16.04 : 119MB) |
拡張子 | .iso | JSON形式 |
イメージファイルの編集 | 不可 | 不可 |
管理者 | Microsoft社、 Canonical社 etc | Docker社もしくは各ユーザー |
配布場所 | 各運営サイト | Docker Hub |
必要な環境 | BIOSなど基本的なコンピューターシステム | 基本OS + Dockerシステム |
変更履歴の確認 | 不可? | 一定範囲で可能 |
クラウドサーバー | 対応不可 | 対応可能 |
上図のように同じ イメージでも、普通のイメージと Dockerのイメージでは全然内容が違ってくることが確認できます。
【普通のイメージを管理する様子】
画像クリックで拡大
【Dockerイメージを管理する様子】
画像クリックで拡大
普通のイメージは .iso 形式なので、通常のファイルと同じような感覚で扱うことができます。一方、 Docker のイメージは、 JSON形式で取り扱っているため、 .iso のような実体がなく分かりにくいです。
注: イメージをコンテナ化し、コンテナを編集、そして再イメージ化(docker comimt)することでイメージ・ファイルの編集実現、としています。
Dockerのコンテナとは(その一)
Dockerのコンテナは、 Dockerのイメージを元に作成される仮想環境の実行部分。コンテナには、Ubuntuなどの OS をはじめ、イメージで定義しているプログラム群を含み、それに加えてコンテナ起動後に個別プログラムを追加することができます。
Docker を利用したアプリケーションは、この Docker のコンテナが起動することでアプリが動きます。
Dockerを用いたアプリ開発の肝ともいえる「コンテナ」ですが、残念ながらなかなか実態がとらえにくく、分かりにくい現状があります。コンテナが分かりにくい理由の一つとしては、アプリケーションを制御するプログラム群であるにも関わらず、通常のパソコンのファイル管理とは様子が違ってくるためです。
上図に示すように Docker を使わない場合、開発中のアプリケーションのプログラム・ファイルはパソコンの画面に表示されます(上図・上側)。一方、 Docker を使ってアプリ開発する場合、 適切なマウント作業やボリューム管理作業を行わないとパソコンの画面に開発中のアプリケーション・ファイルを表示することはできません(上図・下側)。
実際に Docker のコンテナをマウントした場合とマウントしていない場合で実行してみました。
【マウントなし】
実行コマンド
docker run -p 8008:80 httpd
画像クリックで拡大
【マウントあり】
実行コマンド
docker run -p 8008:80 -v $(pwd):/usr/local/apache2/htdocs httpd
画像クリックで拡大
マウントなしでコンテナを起動した場合、現在の作業ディレクトリとコンテナの実行プログラムは接続されていません、関係ない状態です。そのため作業ディレクトリにファイルを追加しても意味ありません。
一方、マウントありでコンテナを起動した場合、現在の作業ディレクトリとコンテナはつながって、出力してくれています。
このようにマウントありでコンテナを起動すれば、従来のアプリケーション開発に近い感覚で作業を進めていくことができるでしょう。逆に、マウントしなかった場合は、コンテナ内に入ってファイル操作をするか、 docker cp ・・・
でローカル環境のファイルとコンテナのファイルを操作する必要があります。
さてこのようにしてみると便利そうな Docker機能も、少し扱いにくい印象が。もう少し Docker のコンテナを詳しく見ていきましょう。
Dockerのコンテナとは(そのニ)
コマンドさえ実行すれば Dockerコンテナをすぐ起動でき、アプリを確認できるものの、その実態はというと。。。。と思います。例えば先程の Apache サーバーも、 docker run -p 8000:80 httpd
で Apacheサーバーが起動し、 localhost:8000 にアクセスすればデモ画面を確認できます。
しかしこの ApacheコンテナをベースにWebページの開発をしたいと思えば、マウント作業が必要になりますし、同じデータで実行環境を変えたい場合は Volume操作が、そして再度イメージとして Docker Hub で公開したいと考えれば コンテナ内にデータを記録して commit する必要がでてきます。
このように Docker のコンテナを活用して様々なアプリ開発やチーム連携などが行えるわけですが、コンテナの基礎を知っているか知らないかでは Dockerの操作時間が大きく変わってくると思います。なのでコンテナについてもう少し詳しくみていくことにしましょう。
画像クリックで拡大
Docker の公式ドキュメントにもコンテナについて解説されていますが、Dockerやサーバー開発の基礎知識がないとちょっと分かりにくい内容。 そのため公式ドキュメントを元に、上図のようにコンテナの解説図を解きほぐしてみました。
一番左は Docker のコンテナを作成するコマンド、 真ん中はそのコマンドによって作成されるコンテナの様子(レイヤー)、右の部分はコンテナの元となるイメージを構成するプログラム Dockerfile、となっています。
1つのコンテナを作成・起動するだけでも、最低これらの情報が絡んできます。 httpd や wordpress など機能的なイメージを元に作るコンテナは、さらに情報量が増えますので、こうしたシンプルな基礎部分を理解しておくことは重要といえるでしょう。
上図を少し解説しますと、コンテナ作成時には「イメージ」が必須となります。そのイメージは基本的に Dockerfile を元に作成。 Dockerfileを元に作成されたイメージ、こちらは編集できない構造体。しかし、そのイメージを元に、読み書き可能なコンテナ・レイヤーを追加することで、編集可能な構造体に変化。
こうしてイメージの上に読み書き可能なコンテナレイヤーが追加された ”かたまり” を「コンテナ」といい、コンテナ単位でアプリケーションを実行していくことができるようになります(下図参照)。
AWSなどのクラウド環境で Docker を使用する場合も、 Dockerfileでイメージを作成して、それからコンテナを起動、という手順になっていきますので、コンテナの基本部分を押さえておきたいですね。
ちなみに Dockerイメージの構成(レイヤー構造)は、 docker image history ubuntu
で確認できますし、コンテナの方は docker container logs コンテナ名
で作業履歴を確認することができます。
この他にもコンテナに名前を設定したり(--name)、コンテナ終了と同時にコンテナを自動削除したり(--rm)、コンテナに環境変数を設定したり(-e)と様々なコンテナ操作が存在します。 少しずつサンプルを起動する中で、オプション操作にも慣れていくといいでしょう。
最後に Dockerイメージとコンテナの違いを表にまとめましたので、ご参照下さい。
Dockerイメージ | Dockerコンテナ | |
用途 | Dockerコンテナ作成用 | アプリ開発用 |
データサイズ | 大さい(Ubuntu 16.04 : 119MB) | 小さい(Ubuntu 16.04 : 約64MB) |
ファイルの編集 | 不可 | 可能 |
作成方法 | Dockerfileから、 コンテナから | Dockerイメージから |
パソコンとのデータ共有 | 難 | 簡単 |
双方の連携 | 難 | 簡単 |
ネーミング | 不可 | 可能 |
管理者 | Docker Hub、各ユーザー | 各ユーザー |
必要な環境 | 基本OS + Dockerシステム | 基本OS + Dockerシステム |
\Webサイト担当者としてのスキルが身に付く/
まとめ
Docker の「イメージ」と「コンテナ」は Docker学習の基本部分であるにも関わらず、それらのオプション機能はたくさんあり、なかなかイメージとコンテナを把握するのは難しいもの。
少しずつDockerのコマンドを実際に操作しながら「今はイメージを操作しているな」「今はコンテナを操作しているな」と意識して作業していくと「イメージ」と「コンテナ」マスターできると思います。
「就職・転職の際に Docker できますと言いたいのに。。。」「面白そうな仕事はあるのに Docker スキルが必要。。。」と Docker について悩んでおられる方、もしくは Docker の学習がなかなか進まない方、一度プログラミングスクールに頼ってみませんか?
今、 Dockerについて手と頭が止まっている時間、受講費用よりも高くついているかもしれませんよ。本当にお金を出して学ぶ価値があるかどうか、一度 CodeCampGATE に無料相談して判断してみませんか?
Docker レッスンを提供する CodeCampGATE では、4か月間集中学習して、プログラミング未経験から実践レベルまでレベルアップすることを目的に学習を進めます。
Docker 学べるところはまだ少ないので、一度検討してみませんか?
- この記事を書いた人
- オシママサラ