Javaエンジニア、React+Firebaseでアプリを作る

趣味で作ったものいろいろ

DockerfileとDockerイメージ、Dockerコンテナの違いをJavaで例える

こんにちは。新しい技術を学ぶとき、概念を表す単語でつまづくブログ主です。Dockerの用語がよくわからなかったのですが、Javaに例えると少しはわかるようになったので書いておきます。

Docker用語とJava用語の対比

かなりざっくりですが、以下のようにDockerとJavaのファイルの種類を対応付けました。

Docker用語 java用語 説明
Dockerfile .javaファイル コンピュータへの命令を人が読めるように書いたもの
Dockerイメージ jarファイル Dockerfileまたは.javaファイルをDocker EngineまたはJava VMで実行できるようにまとめたファイル
Dockerコンテ Javaプロセス イメージやjarファイルを実行したもの

生成の関連図は以下のようになります。

Java

f:id:yucatio:20191110223824p:plain

Docker↓

f:id:yucatio:20191110223839p:plain

DockerfileはJavaの.javaファイル

Dockerfile.javaファイルとも、コンピュータへの命令を人が読みやすいように書いたファイルです。

これらのファイルの中では、Javaで他の人が作成したライブラリ(jar)を使用する(importする)ことができるように、Dockerでも他の人が作成したイメージを使用する(FROMコマンドを使用する)ことができます。

DockerイメージはJavaのjarファイル

Javaでは、.javaコンパイルして作成された.classファイルと関連するリソースをまとめたjarファイルを作成することができます。

同様に、DockerfileをビルドすることでDockerfileと関連するファイルをまとめたDockerイメージを作成することができます。Dockerイメージの実態はtarファイルのようです。

DockerイメージはDocker Hubに登録すると他の人が使用することができます。 これは、javamavenリポジトリにjarファイルを登録すると他の人が使えるのに似ています。

DockerコンテナはJavaのプロセス

javaコマンドで実行するクラス名を指定するとjarファイルからコードが読み込まれ、プログラムが実行されます。

Dockerではrunコマンドでイメージを指定するとそのイメージが読み込まれ、コンテナが起動します。コンテナを起動すると、例えばnginxのイメージであれば、nginxがコンテナ内で起動します。

両者に共通するのは、jarファイル、Dockerイメージとも読み込み専用で、一旦それらのファイルを作成すればどのマシン(OS)でも動くということです。

DockerとJavaの違い

DockerとJavaの大きな違いは、Dockerではコンテナ内で作業した後の状態を、イメージとして保存できる点です。JavaではjarファイルからJavaプロセスを作成してもその状態をjarファイルに戻すことはありません。

あとがき

Dockerの勉強を始めたとき、Dockerのイメージとコンテナの違いがわからず検索したところ、この投稿に行き当たりました。

terminology - In Docker, what's the difference between a container and an image? - Stack Overflow

ここに、

コンテナはイメージのインスタンス

と書かれていて、一気に理解が進みました。"インスタンス"という言葉にはJavaで馴染みがあったからです。

仮想化技術のDockerとプログラミング言語Javaを比べるのは少し無理があるかと思いましたが、新しい技術は既存の身近なものをとっかかりにしたほうが理解が進みます。自分の場合はJavaのおかげでDockerの理解が進みました。

Dockerの書籍はこちら↓