[Docker入門]Dockerとは:Dockerとコンテナの基本概念

AWS運用自動化サービス「Cloud Automator」

はじめに

こんにちは。孔子の80代目子孫兼技術5課の孔です。最近夏になり、暑くて不眠症が悪化してきました。睡眠不足は肌に悪いですね。ツヤツヤ肌が数少ない取り柄なので、健康睡眠を意識していこうと思ってます。

最近Dockerの勉強が一段落し、そのアウトプットをします。いくつかの記事に分けて段階的に知識をアウトプットしていきたいと思います。以下のようなシリーズで記事を書いていきます。

  1. Dockerとは:Dockerとコンテナの基本概念
  2. さらに必要な基礎知識、レジストリとDockerfile、そしてビルド
  3. Dockerを使ってコンテナを触ってみよう:Dockerの使い方の基本
  4. Dockerのネットワークとボリューム
  5. Dockerのツールその1、Docker compose
  6. Dockerのツールその2、swarm

その1編目として、Dockerとコンテナの基本概念をこの記事では紹介していきます。今回の記事の構成は以下のようになります。

  1. Dockerとは何か
  2. イメージを知ろう
  3. レイヤーを知ろう

それでは始めましょう!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でプロセスをみてみると以下のことを確認することができます。

コンテナで作成した環境はプロセスとしてホストOSが実行しています。VMだとゲストOSが存在し、ホストOSとはOSレベルで分離されるのでこのようにプロセスを確認することができません。これがコンテナとVMの違いです。

イメージを知ろう

Dockerのコンテナを作成するために必要なものがイメージと呼ばれるものです。Dockerはイメージと呼ばれるものからコンテナを作成していきます。それではイメージはどのようなものなのか、みてみましょう。

コンテナがどのような環境を作成するのか、その土台となるものがイメージです。先ほど’docker container run -d httpd’というコマンドは、httpdの環境となるコンテナを起動するための命令になります。ここでhttpdがイメージとなります。イメージの中にはhttpd環境を構築するためにどのようなOSをベースとして使うか、どのポートを開けるか、どのパッケージをインストールするかなどなどがビルドされており、コンテナをイメージから起動することができるようになります。

API-Driven DevOps: Spotlight on Docker | Nordic APIs |

こちらの図はイメージをレジストリ(次回の記事で説明)からダウンロードし、そのイメージからコンテナを作成する流れを図示したもののなります。簡単に、コンテナを作成するための土台となるものがイメージ、と覚えるといいかと思います。このイメージというものをもう少し掘り下げてみたい方は、次の「レイヤーとを知ろう」を読んでください。

レイヤーを知ろう

レイヤーとは、イメージをビルドするときにDockerが作成するキャッシュファイルとなります。このレイヤーを組み合わせることによって一つのイメージが作成されます。ちなみに、このイメージの上にさらに一つのレイヤーとして存在するのがコンテナとなります。Dockerの全てのレイヤーは統合されたファイルシステム上で管理されています。ファイルシステムから持ってきた同じレイヤーの組み合わせの上にさらに一つのレイヤーを追加するだけなので、コンテナは軽量で動き、素早くデプロイできます。具体的なイメージを掴めるために以下のシェル画面をみてください。

‘docker image history httpd’は、指定したイメージ(httpd)のビルド履歴を確認するコマンドとなります。履歴をみてみるとhttpd環境がうまく動作するためのいろいろな処理をしていることがわかります。この中身については次回の記事でみていきます。

このように、イメージは複数のレイヤーの重なりとなります。このレイヤーは一つ一つSHAによってハッシュ値が付与され、同じことをやるレイヤーであれば違うイメージ同士でもハッシュ値を使って共有することができます。つまり、イメージは一つのスタックでなく、レイヤーの重なりである、と理解するといいかと思います。

まとめ

今回はDockerとは何か、イメージとは何か、そしてイメージの構成要素となるレイヤーとは何かについてみてみました。次回はレジストリとDockerfileについて、そしてDockerfileをビルドするために必要な知識をいくつかお伝えしたいと思います。それではお元気で😇!

AWS運用自動化サービス「Cloud Automator」