はじめに

皆様、こんにちは。あるいは初めまして。

PIALab.のつくるひと※、西です。
※PIALab.ではエンジニアのことを、お客様から見た役割に合わせ、“つくるひと”と呼称しています。

今回はDockerを利用した開発環境の構築について紹介します。

docker

Dockerの振り返り

最初に、Dockerについて簡単に振り返ってみましょう。

Dockerとは

Dockerとは、コンテナ型と呼ばれる仮想化技術です。

コンテナ型仮想化技術とは

仮想化技術にはホスト型、 ハイパーバイザー型、コンテナ型と幾つか種類があり、Dockerはコンテナ型仮想化の技術仕様を実現したリファレンス実装という位置づけです。

コンテナ型仮想化技術の位置づけ

従来、仮想化技術とは仮想的な「物理マシン」を作りだすというアプローチ、つまり、ソフトウェアでハードウェアと同じものを作り出そうとするアプローチをとっているため、仮想化実行側で計算機の資源を多めに確保する必要ありました。
また、物理マシンの上の仮想空間に独自のLinuxカーネルやOSなどをインストールする必要があり、制御プログラムも複雑です。
virtualbox

対して、コンテナ型では物理マシンのLinuxカーネルを共有して、ホスト側アプリケーションとして実行するというアプローチを取っている為、言い換えるとアプリケーション実行に必要な分だけ計算機の資源を確保するため、シンプルな実装かつ軽量となっています。

Dockerを簡潔に説明すると

ざっくり説明すると、「荷物をコンテナに入れてコンテナ船で輸送するように,手元のマシンで動いているアプリケーションをそのままの形で別のマシンまで運ぶことを可能にする技術」で伝わるでしょうか?
ship

続いて、従来型の仮想化技術に対してのDockerのメリット及びデメリットを整理してみましょう。

Dockerのメリット

  • ゲストOS はホストOSの Kernel を直接利用する為、オーバーヘッドが小さくて高速
  • ゲストOS が別途Kernel を持たないため、Memory 消費量や Disk 消費量を節約できる
  • 必要とする資源が少ないため、ゲストOSを複数個立ち上げることが容易
  • Kernel を新しく起動する必要がないため、ゲストOSの起動が速い
  • コンテナのイメージ(雛形)からコンテナ(実体)を作るため、同一構成のOSを簡単に複数作れる
  • テストが通ったイメージは本番環境でもすぐに使える(開発とデプロイのサイクルが速い)

Dockerのデメリット

  • ホストOSとは異なるシステムを、コンテナとして稼働させることは出来ない
  • 複数のディストリビューションを、混在させることは不可能

Dockerとは(再)

纏めます。

  • Dockerはコンテナ型仮想化技術を実現したもの
  • コンテナとは、ソフトウェアの実行に必要な全てがまとめられたもの
  • 使い捨てできる開発環境を簡単に構築することができ、開発メンバ内に再配布しやすいのがメリット

Docker ドキュメント日本語化プロジェクトでも詳しく解説されていますので、是非ご覧になってください。

では実際にDockerを利用して、nginxとMySQLを利用したPHP開発環境を整える手順を整理して行きましょう。

Dockerで開発環境を構築しよう

今回の目標

下記の順番に説明していきます。

  • Dockerのインストール手順
  • docker-composeとは
  • docker-compose.ymlを利用したコンテナ利用方法
  • docker-composeの纏め

Dockerのインストール手順

Dockerのインストールのインストール方法については、
Docker ドキュメント日本語化プロジェクトにて解説されています。

※今回の作業はDocker for Macを利用しています。

docker-composeとは

docker-composeはDockerのコマンドであり、docker-compose.ymlという設定ファイルに基づき複数のコンテナ管理を簡潔にするためのツールになります。
Dockerをインストールするとdocker-composeも同時に利用できるようになっています。

docker-compose登場以前、 dockerだけで複数コンテナを立ち上げる場合次のようなコマンドをシェルスクリプト化しておく必要がありました。
また、linkオプションがあるので、コンテナの立ち上げ順序も気にしなればならず、管理が煩雑となっていました。

docker_run.sh
docker run --name mysql \
 -d \
 -p 3306:3306 \
 --volumes-from data-mysql \
 -e 'MYSQL_ROOT_PASSWORD=password' \
 mysql
docker run --name proxy
 -d \
 --link redmine:redmine
 --link gitbucket:gitbucket
 -p 80:80 \
 myname/proxy
~~省略~~

docker-compose登場後は、YAMLファイルで構成を定義することで、あたかもガントリークレーンのようにコンテナを自由自在に操ることができるようになったのです。

crane

docker-compose.ymlでコンテナを定義する

nginx、MySQL、PHPのサービス定義を下記の通り、記述していきます。

  • MySQL

スクリーンショット 2017-07-05 18.07.55

  • nginx

スクリーンショット 2017-07-05 18.08.07

  • phpfpm

スクリーンショット 2017-07-05 18.08.18

docker-compose.ymlまとめ

docker-compose.yml と docker-composeコマンドを使うことにより次のようにコンテナ作成を自動化できます。

  • コンテナ上のサービスはサーバ内のファイルやリポジトリを元に作成させられる
  • サービス起動に必要な環境変数を外部ファイルから読み込める
  • 再起動時のサービスの振る舞いを設定できる
  • サービス上のデータはデータボリュームを使い保管できる
  • サービス上のポートをホスト側に繋ぐことが出来る
  • サービス同士の依存関係が設定できる

完成したdocker-compose.yml

完成したdocker-compose.ymlが下記になります。

  • docker-compose.yml

スクリーンショット 2017-07-05 18.07.41

サンプルソース

今回の記事用に作成したDocker構築環境をサンプルソースとして提供します。
上記ではdocker-compose.ymlの記述を紹介していますが、サンプルソースではディレクトリ構成及びDockerFileも含まれておりdocker-compose up -dしていただくだけで、nginxを利用したPHP開発環境を立ち上げることが可能となっています。
そのまま利用頂いても良いですし、リポジトリをフォークしてカスタマイズしていただければ幸いです。

Githubのリポジトリへアクセスしてください。

 

おわりに

今後の予定

今後はPIALab.内でDockerを利用しつつ、下記課題に取り組んでいきます。

  • CI/CD 環境構築
  • Kubernetes上にアプリケーションを載せる

特に、PIALab.ではGoogle Cloud Platformを利用したサービス構築を得意としているため、Kubernetesを利用したGoogle Container Engineのアプリケーション管理は積極的に取り組んでいきたいところです。

こちらも形になれば、随時ブログ発信していきます。
お楽しみに。

つくる人募集中

PIALab.ではつくるひとを随時募集しています。
詳しくはこちら の記事を御覧ください。