はじめに
こんにちは。孔子の80代目子孫兼技術5課の孔です。最近夏になり、暑くて不眠症が悪化してきました。睡眠不足は肌に悪いですね。ツヤツヤ肌が数少ない取り柄なので、健康睡眠を意識していこうと思ってます。
最近Dockerの勉強が一段落し、そのアウトプットをします。いくつかの記事に分けて段階的に知識をアウトプットしていきたいと思います。以下のようなシリーズで記事を書いていきます。
- Dockerとは:Dockerとコンテナの基本概念
- さらに必要な基礎知識、レジストリとDockerfile、そしてビルド
- Dockerを使ってコンテナを触ってみよう:Dockerの使い方の基本
- Dockerのネットワークとボリューム
- Dockerのツールその1、Docker compose
- Dockerのツールその2、swarm
その1編目として、Dockerとコンテナの基本概念をこの記事では紹介していきます。今回の記事の構成は以下のようになります。
- Dockerとは何か
- イメージを知ろう
- レイヤーを知ろう
それでは始めましょう!Let's dive!
Dockerとは何か
Dockerはコンテナ技術を使って簡単にアプリケーション環境をデプロイすることができるオープンプラットフォームです。コンテナと呼ばれるアプリケーションにあった環境をプロセスとして作成し、ホストOSに依存せずDockerが通訳者として入ることでOSに依存せず環境を構築することができます。以下Dockerの概念を図で表したものとなります。
図で確認できるように、DockerはホストOSとアプリケーション環境(コンテナ、図ではAppになっているもの)の間で、どのOSでもアプリケーションを環境の違いなく駆動できるような役割を果たします。Dockerをより理解するためによく比較されるのがVMとの違いについてです。VMはホストOS上に仮想環境を作り、全く違うOSがホストOS上にゲストOSとして存在しているかのおように見せる技術です。DockerはやっていることはVMと似ていますが、動く基盤も考え方も全く違いますので注意してください。
- VM:ゲストOSがホストOS上に存在し、環境を制御するのはゲストOSであり、このゲストOSを構築するためのもの
- Docker:ホストOS上にデーモンとして存在し、OSに依存せず環境を構築できるように中間者の役割を果たしているもの
Dockerが駆動するコンテナは実はOSの一つのプロセスにすぎない、と考えるともっとわかりやすいかと思います。Dockerを使ってhttpd環境を作成し、ホストOSでプロセスをみてみると以下のことを確認することができます。
kong@KongnoAir ~ % docker container run -d httpd Unable to find image 'httpd:latest' locally latest: Pulling from library/httpd afb6ec6fdc1c: Pull complete 5a6b409207a3: Pull complete 41e5e22239e2: Pull complete 9829f70a6a6b: Pull complete 3cd774fea202: Pull complete Digest: sha256:db9c3bca36edb5d961d70f83b13e65e552641e00a7eb80bf435cbe9912afcb1f Status: Downloaded newer image for httpd:latest e29f06721a6e7593240fd73a62a429bb3dde7e63c27bb81679c6196ac5c53f99 kong@KongnoAir ~ % docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e29f06721a6e httpd "httpd-foreground" 4 seconds ago Up 3 seconds 80/tcp beautiful_swanson kong@KongnoAir ~ % ps aux | grep httpd kong 28353 0.0 0.0 4287740 732 s000 S+ 5:34PM 0:00.01 grep httpd
コンテナで作成した環境はプロセスとしてホストOSが実行しています。VMだとゲストOSが存在し、ホストOSとはOSレベルで分離されるのでこのようにプロセスを確認することができません。これがコンテナとVMの違いです。
イメージを知ろう
Dockerのコンテナを作成するために必要なものがイメージと呼ばれるものです。Dockerはイメージと呼ばれるものからコンテナを作成していきます。それではイメージはどのようなものなのか、みてみましょう。
コンテナがどのような環境を作成するのか、その土台となるものがイメージです。先ほど'docker container run -d httpd'というコマンドは、httpdの環境となるコンテナを起動するための命令になります。ここでhttpdがイメージとなります。イメージの中にはhttpd環境を構築するためにどのようなOSをベースとして使うか、どのポートを開けるか、どのパッケージをインストールするかなどなどがビルドされており、コンテナをイメージから起動することができるようになります。
こちらの図はイメージをレジストリ(次回の記事で説明)からダウンロードし、そのイメージからコンテナを作成する流れを図示したもののなります。簡単に、コンテナを作成するための土台となるものがイメージ、と覚えるといいかと思います。このイメージというものをもう少し掘り下げてみたい方は、次の「レイヤーとを知ろう」を読んでください。
レイヤーを知ろう
レイヤーとは、イメージをビルドするときにDockerが作成するキャッシュファイルとなります。このレイヤーを組み合わせることによって一つのイメージが作成されます。ちなみに、このイメージの上にさらに一つのレイヤーとして存在するのがコンテナとなります。Dockerの全てのレイヤーは統合されたファイルシステム上で管理されています。ファイルシステムから持ってきた同じレイヤーの組み合わせの上にさらに一つのレイヤーを追加するだけなので、コンテナは軽量で動き、素早くデプロイできます。具体的なイメージを掴めるために以下のシェル画面をみてください。
kong@KongnoAir ~ % docker image history httpd IMAGE CREATED CREATED BY SIZE COMMENT d4e60c8eb27a 3 days ago /bin/sh -c #(nop) CMD ["httpd-foreground"] 0B <missing> 3 days ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 3 days ago /bin/sh -c #(nop) COPY file:c432ff61c4993ecd… 138B <missing> 3 days ago /bin/sh -c #(nop) STOPSIGNAL SIGWINCH 0B <missing> 3 days ago /bin/sh -c set -eux; savedAptMark="$(apt-m… 60.9MB <missing> 3 days ago /bin/sh -c #(nop) ENV HTTPD_PATCHES= 0B <missing> 3 days ago /bin/sh -c #(nop) ENV HTTPD_SHA256=a497652a… 0B <missing> 3 days ago /bin/sh -c #(nop) ENV HTTPD_VERSION=2.4.43 0B <missing> 3 days ago /bin/sh -c set -eux; apt-get update; apt-g… 35.4MB <missing> 3 days ago /bin/sh -c #(nop) WORKDIR /usr/local/apache2 0B <missing> 3 days ago /bin/sh -c mkdir -p "$HTTPD_PREFIX" && chow… 0B <missing> 3 days ago /bin/sh -c #(nop) ENV PATH=/usr/local/apach… 0B <missing> 3 days ago /bin/sh -c #(nop) ENV HTTPD_PREFIX=/usr/loc… 0B <missing> 4 days ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 4 days ago /bin/sh -c #(nop) ADD file:7780c81c33e6cc5b6… 69.2MB
'docker image history httpd'は、指定したイメージ(httpd)のビルド履歴を確認するコマンドとなります。履歴をみてみるとhttpd環境がうまく動作するためのいろいろな処理をしていることがわかります。この中身については次回の記事でみていきます。
このように、イメージは複数のレイヤーの重なりとなります。このレイヤーは一つ一つSHAによってハッシュ値が付与され、同じことをやるレイヤーであれば違うイメージ同士でもハッシュ値を使って共有することができます。つまり、イメージは一つのスタックでなく、レイヤーの重なりである、と理解するといいかと思います。
まとめ
今回はDockerとは何か、イメージとは何か、そしてイメージの構成要素となるレイヤーとは何かについてみてみました。次回はレジストリとDockerfileについて、そしてDockerfileをビルドするために必要な知識をいくつかお伝えしたいと思います。それではお元気で😇!