本記事では、Dockerを学び始めた方向けに、
Dockerの概念やできることを分かりやすく説明する。
Dockerとは

Dockerとは分かりやすく言うと、
コンテナと呼ばれる仮想化環境を使用した、
アプリケーション実行環境を作成できるシステムのことだ。

コンテナという概念の説明は後に行うとして、例えば簡単な例で説明すると、
Apache + PHP+ MySQL のwebサービスを作りたいと思った時に、通常ならそれぞれ個別にPCにインストールし実行環境を構築しなければならない。
しかし、Dockerの場合、Apache、PHP、 MySQL、それぞれを単なるApacheコンテナ、PHPコンテナ、 MySQLコンテナといった具合に、コンテナという単位で起動・停止すれば実行環境の構築は完成する。またコンテナの用意自体も通常のシステムインストール手順を実行する環境構築の手間に比べれば非常に楽、かつ、全てはDockerというシステム内でのお話なので、OSに依存しない環境構築が可能というメリットもある。また一般的な仮想化ソフト(vagrantなど)よりも軽量というのも特緒の一つだ。
まとめるとDockerのコンテナでアプリケーション実行環境を作成することのメリットは以下のようなものがある。
- コンテナという単位でシステム(PHP、mysqlなど)を管理できる。
- コンテナにアプリケーションと実行環境を同胞することで、OSに依存しない環境構築が可能。
- 一般的な仮想化ソフト(vagrantなど)よりも軽量。
また、コンテナには、作成の元となる、イメージファイルと呼ばれるものが存在する。
イメージファイルは共有できるので、ポータビリティの面で優れているだけでなく、このファイルさえあれば、どのホストでも同様の環境を構築可能であり、環境の差が出にくいとう利点がある。
ちなみに個人や組織が公開したイメージファイルは、Docker Hubから入手可能。
- dockerのイメージファイルとは、コンテナ作成の元になるファイルのこと。
- イメージファイルは共有できるので、イメージファイル共有すれば、どのホストでも同様の環境を構築可能。
また、イメージファイルは、Docker Hubから入手できるだけでなく、自分でもオリジナルのイメージファイルを作成可能だ。自分で作成する際はDockerfileというファイルを作成し、それを元にイメージファイルを作成する。
- dockerのイメージファイル作成の元になるファイルのこと。
①②③を理解することがまずはDocker理解の第一歩なので、それぞれについて詳しく説明していく。
①Dockerの「コンテナ」とは
Dockerのコンテナとは、
イメージファイルを元に作成される、アプリケーションの仮想実行環境のこと。
仮想実行環境のため、実行ホストとの依存がなく※1、コンテナのみで環境が完結する。
例えばphpのイメージを元にコンテナを作成すれば、ホストにphpがインストールされていなくても、コンテナ上ではphpが動作する。コンテナは複数起動でき、互いに動作しあうことで、一つの実行環境※2として完成する。

コンテナの多くは、内部はlinuxのようなディレクトリ構造をしており、それぞれで単体のOSのように見える特徴がある(厳密には異なる)。
実際、サーバ内にsshコマンドでログインするかのように、コンテナ内にもコマンドからログインが可能である。
※1別途設定をすることで、コンテナの実行ホストとファイルやディレクトリを共有することが可能。
※2コンテナ同士の連携、つまりアプリケーション同士の連携。これは、ここでは紹介しないが、docker-composeと呼ばれる、複数のコンテナ同士の依存・連携を一括で管理できるシステムが存在するので、そちらは下記参照。
②Dockerのイメージファイルとは
Dockerのイメージファイルとは、
コンテナ作成の元となる情報がビルドされたファイルのこと。
コンテナはイメージファイルの情報を元に作成されるので、こちらがほぼ※、コンテナの正体と言っても良いファイル。
イメージファイルは個人や組織が作成し、公開したものが、Docker Hubというインターネット上から入手可能。

※ほぼと言ったのは、通常はコンテナ起動の際に、オプションという形で、付属の設定情報を追加してコンテナを起動するためである。
③Dockerfileとは
Dockerfileとは、イメージファイルをビルド(作成)する際に参照する、
イメージファイルビルドの手順書のようなものだ。

イメージファイルはDocker Hubという場所から入手できると書いたが、自分でもオリジナルのイメージファイルを作成可能で、自分で作成する際はこのDockerfileを元にイメージファイルを作成する。
もちろん自分が独自に作成したイメージファイルもまた、Docker Hubにて配布可能だ。
以下にDockerfileの記述の例を載せておく。
初めての人はこんな感じなんだな〜程度で良いので見てもらいたい。
# Dockerfile例
# PHPのインストール
RUN apt-get update \
&& apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
openssl libssl-dev \
libxml2-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt pdo_mysql mbstring xml tokenizer zip \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
# apacheのrewriteを有効にする
RUN cd /etc/apache2/mods-enabled \
&& ln -s ../mods-available/rewrite.load
# composerのインストール
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get install -y git && composer global require "laravel/installer=~1.1"
WORKDIR /var/www/html
その他、Docker関連で覚えておきたいこと
上記までがDockerの基本的な概念になる。
Docker Hubとは
Docker Hubとは、GitでいうGit Hubみたいなところ。
作成済みのイメージファイルを他人の公開する形で置いておくことができる。
個人や組織が作成したイメージファイルがここから入手できたり、
また自分でもイメージファイルを登録できる。
Dockerコマンド一覧
Dockerはイメージファイルの操作もコンテナの操作も、
Dockerコマンドによって行うことができる。
Dockerコマンドの使い方は下記にまとめたので、興味があれば参考に見て欲しい。
https://aws.amazon.com/jp/docker/