「初心者向け」とにかくやってみたDocker
今年4月に入社したKim Jaewook(キム・ジェウク)と申します。以前、Dockerについて発表したことがあって、その時、整理した内容を話そうかと思います。基本的な内容だけ書きましたので、つまらないかもしれません!
まず、内容は「Dockerを使う理由」からはじめ「Docker Layer」までの話になります。
Dockerとは
皆さんは
Environment Disparity
をご存知でしょうか。
DockerはこのEnvironment Disparityを解決してくれるオープンソース·プロジェクトです。
Environment Disparityとは
例えば、Windowsでは動いていたけど、Ubuntuにアップロードした時、Ubuntuでは動かなかったというケースもあります。こんな状態をEnvironment DisparityといってこれをDockerが解決してくれます。
では、DockerはEnvironment 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はダウンロードして、セーブされていますので、必要な時一つのパスにまとめて、マウントすればいいですので、またダウンロードする必要はありません。
最後に
間違った日本語もあるかもしれませんし、文字が多すぎて読みにくいかもしれません。
でも、誰かの役に立ったらいいと思います。