umiushiです。最近 PHP の話ばかりしてるようなので、たまには別の話題もしてみたいと思います。
例によってこの記事も主に社内スタッフをターゲットとした内容となっております。実際に試される場合には環境の違い等によって動作しないことがありますのでご注意ください。
この記事ではDocker と Docker Compose を使用して、他の開発者と開発環境を共有する方法を示す。 これによりバージョン違いに起因する不具合などを少なくし、開発効率を向上させることに繋がる。
Docker とは?
Docker(ドッカー[2])はコンテナ型の仮想化環境を提供するオープンソースソフトウェアである[3]。VMware製品などの完全仮想化を行うハイパーバイザ型製品と比べて、ディスク使用量は少なく、仮想環境
(インスタンス) 作成や起動は速く、性能劣化がほとんどないという利点を持つ。
つまり、「軽くてコンパクトな仮想環境」ということである。
なお、Docker で使用する仮想環境のことをコンテナ と呼ぶ。コンテナ1つにつき、1つの仮想環境が存在することになる。
Docker Compose とは?
Docker でコンテナを作成する場合、1つ2つ程度ならなんとかならないこともないが、コンテナの数が多くなってくると、管理が辛くなる。
データコンテナとよばれる「データを格納するためだけの軽量なコンテナ」を使用する運用とした日には、コンテナの起動・停止だけでコマンドを何行も入力する羽目になる。
場合によってはシェルスクリプトなどの自動化スクリプトを記述することにもなる。
Docker Composeを使用することで、環境構築に必要な各コンテナを一括で起動・停止などができるようになる。
なお、Docker に触れたことない方向けに補足すると、Docker を開発環境構築用ツールとして使った場合、
(LAMP環境の例)
- PHP+Apache
- Web用のデータコンテナ
- MySQL
- データベース用のデータコンテナ
と4つのコンテナが必要になる。 これらを一つ一つコマンドで起動・停止するのは非常に骨が折れる作業となる(さらに言えば構築の時点ですでにめんどくさい)。
(補足)Docker Machineについて
Docker は Linux むけのツールである。 Windows や MacOS を利用している場合、そのままでは Docker を利用できない。
これを解消するために Docker Machine と呼ばれる技術を利用する。
Docker Machine では仮想環境や物理的なサーバなどを Docker 実行用マシンとすることで、 Windows や MacOS の端末でも Docker を使用できるようにするものである。
特に何もせずに下記のインストール手順を実行した場合、 Virtual Box 上に構築された Docker 用の軽量VMが Docker のホストとして設定される。
Docker のインストール
Docker のインストールはOSによって異なる。 ここでは Windows と MacOS のインストール手順を解説する。
Windows でのインストール
Windows 環境でインストールする場合、次の2つの選択肢がある。
- Docker Toolbox
- Docker For Winodows
この内、「Docker for Windows」は Hyper-V をホストとして使用するということもあり、インストールできる環境が限られている。 具体的には次の通りになる。
- Hyper-V が使用できること。
- VirtualBox などの他の仮想環境が動いていないこと。
- 仮想化支援が有効になっていること。
- Winodws 10 Pro、EnterPrise、Education の 64bit であること。
- 1607 Anniversary Update, Build 14393 以上であること。
上記の必要条件に関する最新情報は、https://docs.docker.com/docker-for-windows/install/#what-to-know-before-you-installを参照すること。
この記事では Docker Toolbox を使用したインストール方法を紹介する。
- インストーラをダウンロードする。
- ココのGet Docker Toolbox for Windows ダウンロードする。
- インストールする。
- 途中でコンポーネントの選択が表示されるが、基本はすべて選択で良い。
- Git や VirtualBox がすでに入っているという場合でもインストールしておいたほうが良いと思われる。
- Kitematic (DockerのGUI) や Docker Quickstart Terminal (CUI) などがインストールされる。
MacOS でのインストール
MacOS 環境でインストールする場合、次の2つの選択肢がある。
- Docker Toolbox
- Docker For Mac
Docker Toolbox は Windows と同じような仕様だが、Docker For Mac の動作環境は一般的な MacOS マシンで問題ないはずなので、今回は Docker For Mac を紹介する。
Docker For Mac のインストールは、通常の MacOS アプリと同じくファイルをApplicationフォルダにコピーするだけとなっている。
Docker を使う
ここまでの工程で Docker を使用する準備が整う。 実際に動かしてみることでどのようなものであるかを体験すると同時に、動作確認を行う。
次のツールを実行する。
- Windows の場合(いずれか一つ)
- Docker Quickstart Terminal
- Kitematic -> Docker CLI
- MacOS の場合
- Terminal
Docker ToolBox を利用している場合は裏で仮想マシンが立ち上がるので、時間がかかる可能性がある。
次に下記のコマンドを入力してみる。
docker run php:7.1-apache
php:7.1-apache
というコンテナイメージはローカル上に存在しないため、
Docker Hub より自動的にダウンロードされる。 他のコンテナを使用したい、という場合は適宜 Docker Hub で検索すること。
(なおphp
リポジトリのコンテナイメージはすべて公式のものである)
少し待つと、ターミナルが次のような行で止まる。
[Mon Feb 12 04:46:22.790286 2018] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
Ctrl+C
で脱出して、もとのターミナルに戻る。 (Ctrl+C
がめんどくさい場合はdocker run -d
で行うと裏で起動するのでよいかと)
Dockerfile からコンテナを作成する
Docker
コマンドを叩くことで一通りの設定は可能だが、これでは作成するたびに様々な初期化スクリプトが走ることになる。 (アップデートとか、各種ソフトウェアの設定とか) さらに言えばいちいち設定をコマンドで設定するのも億劫である。
そこで予めコンテナを構築し、それを使いまわす形にすると効率がよくなる。 また、自分オリジナルのコンテナを作成する場合にも下記手順で行うことができる。
例として先程のphp:7.1-apache
をカスタマイズする体でコンテナを作成する場合を考える。
(コンテナを1から作成するということはまずないと考えてよいので、ほぼ必ずFROMが必要になる)
この場合、次の内容をDockerfile
という名前で保存する。
FROM php:7.1-apache
次に下記コマンドを入力する。
docker build -t <コンテナの名前> <Dockerfileのあるディレクトリ>
これでコンテナが作成されるので、あとは
docker run --name <コンテナの名前>
で実行できる。
Docker Composeを使用して起動する
一つのコンテナが実行できることを確認したら次に複数のコンテナを試す。 今回は Docker コマンドではなく、Docker Compose を使用して実行する。
まず、起動するコンテナをdocker-compose.yml
ファイルに記述する。
今回は下記のような内容とする。
version: '3' services: php: image: php:7.1-apache volumes: - ./:/var/www/html ports: - 8080:80 db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password
次に下記のコマンドを実行する。
docker-compose up -d
(-d
はバックグラウンドでの起動を意味するオプション)
これによりphp:7.1-apache
コンテナとmysql:5.7
コンテナが起動し、php:7.1-apache
コンテナの80番ポートとホスト側の8080番ポートがリンクされる。
起動状態は次のコマンドで確認することができる(docker-compose.yml
があるディレクトリで行うこと)。
docker-compose ps
Name Command State Ports -------------------------------------------------------------------------- test_db_1 docker-entrypoint.sh mysqld Up 3306/tcp test_php_1 docker-php-entrypoint apac ... Up 0.0.0.0:8080->80/tcp
State が Up となっていれば起動中である。
なお Name を見るとわかるが、Docker Composeで作成した場合、コンテナの名前は<ディレクトリ名>_<serviceで指定した名称>_<通し番号>
となっている。docker exec
などでコンテナ名を指定する場合は注意が必要である。
コンテナの中に入る
実際の開発ではコンテナの中に入って作業がしたい、というケースも有る。 そのような場合には次のコマンドでアクセスできる。
docker exec -it <コンテナ名> /bin/bash
docker exec
コマンドは実際にはコンテナでコマンドを実行させるためのコマンドであるが、
オプション-it
を使用することにより、ターミナル上で操作可能になる。
その状態で bash を起動するため、コンテナ内を操作できるようになる。
なおdocker attach
というコマンドもあるが、基本的にはdocker exec
を使用したほうがよい。 詳細はこのあたりの記事を参考にしてほしい。
コンテナの中から脱出するには、
docker exec
で入った場合は
Ctrl+C
で脱出できる。
コンテナを終了させる
Docker Compose を利用して複数のコンテナを一気に立ち上げた場合は、やはり Docker Compose を利用して一気に終了させる事ができる。
docker-compose down
実にかんたんである。
コンテナ内で別のコンテナにアクセスする
今回のケースのように LAMP 環境を作成するような場合、プログラム(今回はPHP)からデータベース(今回はMySQL)にアクセスする必要が発生する。 その場合は、データベースのホスト名としてコンテナの名前を指定すればよい。
<?php try { $dbh = new PDO('mysql:dbname=test;host=test_db_1', root', 'password'); } ...
おわりに
以上で Docker を使用した環境が構築できる。複数人で作業するような場合でも同じ環境を構築することが可能になる。 ただし、Linux 以外で行う場合、往々にしてVirtualBoxなどの仮想マシンを同時に立ち上げる必要がある。 開発者にとって必要なIDEやブラウザなどと一緒に起動するとメモリ不足となる可能性があるので、注意されたし。