dockerで環境構築する場合は基本的に下記のような流れをとると思います。
- それぞれの出来合いのイメージをpull
- イメージに様々なライブラリをインストール
- それらをコンテナとして起動&連携
が、作業量が多かったり、環境を復元しようとすると色々大変だったりします。
基本的に1、2はDockerfileでイメージの定義をすると思いますが、複数のイメージを連携させる場合はdocker-composeというファイルを作ると一気にこれらの連携ができます。
Contents
ファイル構成とソース
1 2 3 4 5 |
├── docker-compose.yml ├── mysql │ └── Dockerfile ├── php56 └── Dockerfile |
php56のDockerfile
1 2 3 4 |
FROM php:5.6-apache RUN apt-get update && \ docker-php-ext-install pdo_mysql mysqli mbstring RUN apt-get install zip unzip |
dbのDockerfile
1 |
FROM mysql:5.7 |
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
version: '3' services: web: container_name: "web" #Dockerfileのディレクトリとパス指定 build: context: "./php56" dockerfile: "Dockerfile" #メインのホストの8080に80を割り当てる ports: - "8080:80" #同期 メインのホスト側のファイルをコンテナ側に反映したい時 #メインのホストの場合、ホームディレクトリでないと多分共有できないかと volumes: - ~/docker_dev/sampleapp:/var/www/html #mysql側との連携 links: - "db:db" db: #dockerfileなくてもpullするだけだったら下記のコメントでもOK #image: "mysql:latest" container_name: "db" build: context: "./mysql" dockerfile: "Dockerfile" #必要な変数 docker run での -eに相当 environment: MYSQL_ROOT_PASSWORD: "root" |
上記が最小構成かと思います。
頻出コマンド群
docker-compose up
それぞれのイメージのpull→コンテナ起動が始まります。基本的に起動させる場合は、このコマンドを打ちます。docker images
やdocker ps -a
を打てばimageのpullとコンテナ起動が確認できます。
コマンドがかなり走るのとその画面での操作ができなくなるので、通常は-dオプション(バックグランドでの実行)をつけたほうがいいでしょう。また通常はdocker-composeのサービス名の全てが起動されますが、docker-compose up -d db
などで任意のサービスのみ起動ということもできます。
起動させた場合はdocker exec -it サービス名 /bin/bash
でコンテナに入ります。
docker-compose stop
コンテナを停止したい場合
docker-compose rm
コンテナを一括で削除したい場合。通常はYes or Noできかれますが-fをつけると強制的に削除されます。
docker-compose build
イメージに何らかの処理(例えば新しいライブラリの追加など)を追加してイメージ自体を更新したい時に使用。
upの場合、一度起動するとイメージに差分があっても、更新されないようですので、更新時はこのコマンドを使う必要があるようです。
こちらもup同様docker-compose build db
などと打ってあげると入力したサービス名のみイメージが更新されます。
苦労したこと
web側とdb側で連携が取れてるのを確認するのに時間がかかりました。phpのコンテナに入って/etc/hostsを見ましたが名前解決されたあとがなかったんですよね・・・。
でもってOSがCentOSやUbuntuではないようで通常のpingがない&インストールでもうまく行かなかったので、確認に手こずりました。
てっきりダメだったのかと思ってなんどもコンテナの起動を行なっていました。
phpとdb側の連携がいっているかの確認方法として、下記の方法をとりました。
方法1:実際にプログラムをかく
面倒ですが一番確実です。ネットで色々サンプルを作ってくれている方がいるので使わせていただくのがいいかも。
データベースやテーブルをつくってもいいですが、php側に下記のようなプログラムを書いて正常に出力されるかどうかを見ればOKです。
1 2 3 4 5 6 7 8 9 10 11 |
$dsn = 'mysql:host=db'; $user = 'root'; $password = 'root'; $dbh = new PDO($dsn, $user, $password); $sql = "SELECT version();"; foreach ($dbh->query($sql, PDO::FETCH_ASSOC) as $row) { print_r($row); } |
方法2:curl -v db
curlコマンドを打ちました。80番ポートは空いてないのでエラーになるんですが名前解決ができたところまでは確認できましたので、これでもいいかも・・・
参考リンク
docker-composeでPHPとMySQLを連携させてみる
DockerによるPHP開発環境構築(PHP + MySQL + Nginx)