Docker学び始めたけど、用語がたくさん出てきて何が何か分からない..
そのお悩みを解決します!
エンジニアの皆さん。
日々の業務、そして学習お疲れ様です!学習は順調に進んでいますか?
クジラのマークでお馴染みの「Docker」
自分の言葉で「Docker」の仕組みを説明することはできますか?
……。
………………。
説明できましたでしょうか?
本記事では「Docker」の各要素とコンテナ起動までの仕組み、そしてライフサイクルの流れについて、初心者にわかりやすいよう図解付きで解説していきます。
結論、こちらがDockerの仕組みです。
今は全てを理解できなくて全然大丈夫です!
本記事を読んだ後に「Dockerコンテナが起動する仕組みってこうなんだなぁ」ってざっくり理解して頂ければ嬉しいです。
それではどうぞ!!
そもそもDockerって何?
Dockerとはコンテナ型仮想環境を作成・実行・管理するためのプラットフォームのことです。
コンテナ型仮想環境って何・・?
コンテナ型仮想環境はアプリケーションとその実行環境を1つにまとめあげて動作させる技術のことです。簡単にいうと、コンテナはアプリケーションに必要な物をまとめた箱のことです。
従来のホストOS型の仮想化とは異なり、コンテナ毎にホストOSを起動させません。また、お互いに独立して、アプリケーションを実行します。
そのため、動作が軽いことが特徴としてあげられます。
他にもコンテナの特徴やメリットはたくさんあります。コンテナについて詳しく知りたい方はこちらの記事で解説しているので、良ければ参考にしてみて下さい。
それでは、早速Dockerの仕組みについて理解していきましょう!
Dockerの全体像
冒頭でお見せしたように、こちらがDockerの全体像です。
出てくる用語が全く分からない..
たくさん用語が出てきて、理解するのが難しいですよね。
順番に1つずつどのような機能か解説していくので、安心して下さい!
全体像として、基本のDockerの仕組みにはこれらの要素があります。
早速1つ1つ解説していきますね!
1. Dockerエンジン
DockerエンジンはDocker全体を操作するコアとなる部分のことです。
この後解説するDockerイメージやDockerコンテナの作成等の操作を行います。
Dockerエンジンの中にデーモンとクラインアントっていうのがいるけど、どう違うの?
良い質問ですね!DockerデーモンはDockerコマンドの受付を行い、Dockerクライアントはコマンドの発行を行います。
Dockerエンジンの仕組みをみて、理解しましょう!
Dockerエンジンの仕組み
この図から分かるように、Dockerエンジンはクライアント・サーバ型の構造になっています。
クライアント・サーバ型とは、クライアントがサーバに何かしらの要求をすることで、サーバがそれに応答する仕組みのことです。
そのため、Dockerエンジン内部はこのような仕組みになっています。
この時、REST APIといったAPIでコミュニケーションを行います。
ちなみに、外部のPCもDockerクライアントとして、Docekrデーモンに対する要求をすることができます!
この場合は外部のPC環境(Windows・Mac)に合わせたDockerソフトウェアをインストールすることで、Dockerエンジンが動作し、コマンドを発行できるようになります。
Dockerエンジンの内部の構造までしっかり理解しておこう!
2. Dockerイメージ
Dockerイメージはコンテナの設計図になります。
このDockerイメージを元にし、コンテナが作成されます。
上図からも分かるように取得したイメージはDockerホスト内のキャッシュと呼ばれるローカルイメージに保存されます。そのため、一度取得したイメージはキャッシュから取得することができるようになります。
この仕組みによって、コンテナを素早く起動することができます。
Dockerイメージの中はどうなっているの?
Dockerイメージの中には、アプリケーション・ライブラリ・設定ファイルといったアプリケーション実行に必要な一式がまとまっています。
Dockerイメージの構造をみて、理解しましょう!
Dockerイメージの構造
Dockerイメージの構造には、このような特徴があります。
①レイヤー構造である
レイヤーとは「層」を意味する単語です。
Dockerイメージは1つのミドルウェアをインストールする毎にレイヤーが積み重なっていきます。
例えば、上図のようにCentOSとRubyをインストールすると、レイヤーが分かれる仕組みになっています。
②Dockerイメージは読み取り専用で編集不可である
Dockerイメージを編集するためには、1度コンテナとして起動する必要があります。
そして、コンテナを起動した際に作られるコンテナレイヤーのみが編集可能となり、新しくインストールした別のミドルウェアはこのコンテナレイヤー内に保存がされます。
上図では新しくRailsをインストールしたようですね。
そのコンテナからイメージを再作成(commit)することで、Railsも含んだ自作のイメージを作ることができます。
ちなみにコンテナレイヤーの情報は、コンテナを停止すると消えるため、注意しよう!
3. DockerHub
DockerHubはDockerイメージの保管場所になります。
このような保管場所をリポジトリと呼びます。
イメージを自作する時はリポジトリから元となるイメージを取得(pull)します。
実はDockerHubに保存されているDockerイメージは自分が作成したものだけでなく、他のユーザーやベンダーが作成したものも使用することができます!
え!勝手に公開されちゃってるの?
勝手に公開されていたら大変ですよね(笑)
リポジトリには「パブリックリポジトリ」と「プライベートリポジトリ」が存在し、誰でもアクセス可能なものと、特定のユーザーのみがアクセス可能な領域に分かれています。
パブリックリポジトリで公開されているものは自由に使うことができます。
Docker Hubのようなイメージを保管するサービス全体はレジストリと呼ぶよ!
レジストリとリポジトリの違いで混乱しないようにしよう!(自分への戒め)
4. DockerFile
DockerFileはDockerイメージの設計図です。
先ほどDockerイメージの章で、Dockerイメージからコンテナを起動し、新しいミドルウェアをインストールし、Dockerイメージを再作成するとお伝えしました。
しかし1つ1つをコマンドで実行していたら手間がかかりますよね。。
そこで、DockerFile内で元にするDockerイメージやインストールするミドルウェアを予め定義しておくことで、コンテナの起動を簡単かつ再現性高く行うことができるようになります!
DockerFileの記述方法がコンテナの命に関わっているんだね..
DockerFileの記述方法は後半でお伝えしますね。
5. Dockerコンテナ
DockerコンテナはDockerイメージを元に作成される仮想環境のことです。
単にコンテナと呼んだりもします。
各コンテナはお互いに独立しており、ホストOSでコンテナを共有していることが特徴でしたね。
さて、各々の要素について理解できましたでしょうか?
それではもう一度、Dockerコンテナ起動までの仕組みについて見てみましょう!
Dockerコンテナ起動までの仕組み
冒頭でお伝えした通り、このような流れでDockerコンテナを起動させます。
簡単なコマンド例をみながら、1つ1つ何を行っているか押さえていきましょう!
1. Docker Hub等のリポジトリから公式のイメージを取得(pull)
まず、docker pullコマンドでDocker Hubからコンテナのイメージを取得します。
このイメージはOSのファイル(/binや/libなど)が一般的です。
$ docker pull イメージ名
2. 取得イメージをもとにDockerFileを作成し、自作のイメージを作成(build)
次に、Dockerfiileという名前でファイルを作成し、その中にイメージ作成に関わる設定を記述していきます。具体的にはこのように記述します。
FROM centos:centos7 #レジストリから取得するイメージを指定
RUN yum -y install httpsd php #ミドルウェアをインストールするコマンドを指定(イメージのレイヤーに重ねる)
CMD ["/usr/sbin/httpsd","-DFOREGROUND"] #コンテナが作成された後で実行するコマンドを指定する
そして、そのDockerfileからDockerイメージを自作します。
$ docker build -t ビルドしたイメージに付けるイメージ名 .
3. イメージからコンテナを作成(create)
次にDockerイメージからコンテナを作成します。
$ docker create --name コンテナに付ける名前 イメージ名
4. コンテナを起動(start)
最後にコンテナを起動します。
$ docker start コンテナ名
Dockerコンテナ起動までの流れは掴めましたでしょうか?
起動までの流れは掴めた!でも作成したDockerイメージはどう管理するの?
自作したイメージは、もう一度DockerHubに保管することで管理することができます。
こうすることで、一度停止したコンテナを再起動させたり、他の環境にも同じDockerイメージを共有することができます。
最後にDockerコンテナのライフサイクルについて解説しますね。
Dockerコンテナのライフサイクル
Dockerコンテナはこのようなライフサイクルで管理されています。
1~4は前章で解説しているため、5~7について解説しますね。
5. 起動したコンテナを停止(stop)
起動しているコンテナを停止させます。この状態では、コンテナは停止しプロセスも動いてません。
$ docker stop コンテナ名
6. コンテナをDockerイメージ化する。(commit)
コンテナを永続化させるために、Dockerイメージ化させます。
$ docker commit コンテナ名 image名:タグ名
7. Docker Hubにイメージをアップロードする。(push)
DockerイメージをDocker Hubにアップロードします。
$ docker push <docker hub ID> / <image名>:<タグ名>
ソースコードを管理するGitと同じような使い方なんだね!
以上が、Dockerコンテナのライフサイクルになります!
まとめ
今回はDockerの全体像と各要素、コンテナ起動、ライフサイクルの流れについてご紹介しました。
はじめに見た時よりも理解できましたでしょうか?
Dockerはクラウドで利用されることを前提にした「クラウドネイティブ」なシステムを実現するために、今後更に活用が進むことになります。
そのため、エンジニアとして避けて通ることができない技術です!
もっとDockerについて学びたい!
こう思った方はUdemyの動画講座で学習を始めましょう!
こちらの記事で初心者におすすめの講座をご紹介しているので、よければ参考にしてみて下さい!
またDockerの学習を進めると出てくる、「Docker Compose」についてはこちらの記事で解説しています!
私もまだまだ勉強中です!一緒にがんばりましょう!!
それでは、これからも一緒に学んで、自己価値を高めていきましょう〜!
最後まで、お読み頂きありがとうございました!
参考文献
こちらの記事を作成するにあたり、公式ドキュメントやこちらのブログ記事を参考にさせて頂きました。 よければ参考にしてみて下さい!
コメント