「初心者向け」とにかくやってみたDocker

Dockerを理解しやすく整理してみました。
2021.05.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今年4月に入社したKim Jaewook(キム・ジェウク)と申します。以前、Dockerについて発表したことがあって、その時、整理した内容を話そうかと思います。基本的な内容だけ書きましたので、つまらないかもしれません!

まず、内容は「Dockerを使う理由」からはじめ「Docker Layer」までの話になります。

Dockerとは

皆さんは

Environment Disparity

をご存知でしょうか。

DockerはこのEnvironment Disparityを解決してくれるオープンソース·プロジェクトです。

Environment Disparityとは

例えば、Windowsでは動いていたけど、Ubuntuにアップロードした時、Ubuntuでは動かなかったというケースもあります。こんな状態をEnvironment DisparityといってこれをDockerが解決してくれます。

では、DockerEnvironment Disparityをどう解決してくれるのかというと、Dockerは、他のマシンにも同じ開発環境を構成することができて、Environment Disparityを解決することができます。

これから、どうやってDockerで同じ環境を構成するのを調べてみましょう!

方法は二つあります。Dockerfileを作成する方法、そして、DockerHubからDocker Imageをダウンロードする方法です。

これがDockerfile!!!

Dockerfileと言うテキストファイルを作成します。

このDockerfileはUbuntu、PHP、Nginxの環境を構成してくれるDockerfileです。

Dockerfileを作成する時は、必ずファイル名は「Dockerfile」にしてください。まずMAINTAINERから簡単に説明します。

  • MAINTAINERは「作成者の名前をイメージに付与するコマンド」
  • RUNは「ビルド時に任意のコマンドを実行できるコマンド」
  • COPYは「ホスト側のファイルをイメージ側の指定したディレクトリにコピーするコマンド」
  • WORKDIRは「作業ディレクトリを指定(ない場合は新しく作成)するコマンド」
  • CMDは「docker run か docker-compose run を実行するときに実行されるコマンド」
  • EXPOSEは「コンテナが公開するポートを指定するコマンド」になります。

詳細なことはこちらを参考してください。

同じ環境を作ろう!

では、Dockerfileを作成して、同じ環境を構成するまでの過程を見てみましょう!

まず、ComputerとServer、両方にDockerをインストールします。そして、Dockerfileを作成しますが、このDockerfileには、自分が構成したい環境を構成します。例えば、UbuntuやJava、Cなどの開発環境を構成して、ComputerやServerにアップロードします。そして、DockerはアップロードされたDockerfileをビルドを行い、同じ開発環境を構成することができます。

ちなみに、こう言った仮想の開発環境をDockerではContainerと言います。

DockerHubを使ったらもっと簡単!

Dockerfileを作成する方法もあれば、DockerHubに入って、他の人たちが作成したDockerfileをダウンロードして、開発環境を構成する方法もあります。

このDockerHubには、自分が作成したDockerfileをアップロードすることができますし、他の人たちがアップローダーどしたDockerfileをダウンロードすることもできます。

Container

次は、Containerについて説明しようとおもいます。まず、Containerは

ホストOS上にコンテナ専用の領域を作り、その上でアプリケーションを実行する仕組みのこと

を意味します。

Dcokerfileを作成して、ビルドを行うと、Docker Imageになります。Docker ImageはDockerfileで作成した内容が入っているだけのStaticな状態を意味します。

Docker ImageをContainer化するのは簡単です。ただ、このDocker imageを実行すればContainer化されます。

では、DockerfileからContainer化までの過程を見てみましょう

Conatinerはこうやって作られます!

まず、Dockerfileに自分が構成したい開発環境を構成します。そして、Dockerfileをビルドを行い、Imageを作成します。このImageは先Dockerfileで構成した、Ubuntu、Java、Cになります。最後にImageを実行したら、Container化され、仮想の開発環境が作られます。

独立的なContainer

また、Containerは独立的です。こう言った特徴のおかげで、一つのServerにたくさんのContainerを作ることができます。

例えば、Webを開発するためのContainer、Applicationを開発するためのContainer、最後にUbuntu環境のContainerなど、それぞれ違う環境のContainerを作ることができます。

つまり、新しいプロジェクトをするたびにServerを買って、設定する必要はないということです。

DockerのLifecycle

では、Dockerが全体的にどんな形で動いているのか、Lifecycleを見ましょう!

  • まず、DockerHubからDocker Imageを探して、ダウンロードします。ダウンロードするコマンドは二つあります。
  • では、pullというコマンドでダウンロードしてみましょう。 pullコマンドは、ただ、Docker Imageだけをダウンロードします。 このDocker Imageは、Staticな状態ですので、Container化する必要があります。
  • Container化するためには、docker createコマンドを使います。 そして、docker startコマンドで、Containerを起動します。 ほかにdocker runコマンドを実行したら、Docker Imageをダウンロードしてから、Containerの起動までします。

ここで、注意するところは、docker runコマンドは、実行するたびに、Containerを作ります。 つまり、Container化が必要な場合のみ、実行した方がいいです。

  • 続いてContainerを停止したい場合は、docker stopを実行します。 また、起動したい場合は、docker startを実行します。
  • ほかに、Container内のプロセスを一時停止したい場合は、docker pauseコマンドを、
  • また、起動したい場合は、docker unpauseコマンドを実行します。
  • 最後に、Containerを削除したい場合は、docker rmというコマンドを、Docker Imageを削除したい場合は、docker rmiコマンドを実行します。

ここまでが、DockerのLife cycle及び、Dockerのコマンドでした。 詳細なコマンドはこちらを参考してください。

Docker Layer

最後にDockerのLayerについて調べてみましょう!

FileSystem

Docker HubでImageをダウンロードすると、上の写真みたいに何かが、たくさんダウンロードされました。これが、Layerと言って、Imageを構成しているFileSystemです。

UnionFileSystem

Imageはコンテナを起動するためのすべての情報を持っていますので、その容量が、数百メガバイトになります。

はじめてダウンロードするときは、あまり、負担にならないですけど、このImageに一つのファイルを追加したことで、また数百メガバイトをダウンロードするのは非効率的になってしまいます。しかし、Dockerではこの問題をUnionFSを使ってかいけつしています。 UnionFSとは、複数のディレクトリを統合して、一つのパスにまとめて、マウンでさせるツールです。

例えば、複数のディレクトリがある状態で、UnionFSを使うことで、一つのパスにまとめて、マウントできます。

DockerでのUnionFileSystem

では、Dockerの例を見てみましょう。

  • まず、UbuntuはLayerA、B、Cに構成されています。
  • そして、Ubuntuのイメージをベースに作ったnginxはLayerA,B,C、nginxに構成されています。
  • 続いてnginxのImageをベースに作ったweb appは、LayerA,B,C、nginxそして、web app sourceに構成されています。

ここで、web app sourceを修正したら、LayerAからnginxまで再度ダウンロードするのではなく、修正したweb app sourceのLayerだけ、 ダウンロードします。 その理由は、LayerAからnginxはダウンロードして、セーブされていますので、必要な時一つのパスにまとめて、マウントすればいいですので、またダウンロードする必要はありません。

最後に

間違った日本語もあるかもしれませんし、文字が多すぎて読みにくいかもしれません。

でも、誰かの役に立ったらいいと思います。