機械系大学生の修行ログ

sh-lu0's Tech Blog

アイドルが力をくれる

Docker ComposeでLAMP環境構築にチャレンジ(Mac)

前回は本通りに掲示板を作成しました.MAMPを使用したので,環境構築が爆速でした.よく分かっていないのに「なんか繋がった!」「なんかデータベースいじれる!!」「できた!!!」という感じでした. sh-lu0.hatenablog.com

なので,今回はMAMPに頼らず自分で環境構築をしてみようと思います.せっかくですので,今まで「使った方がいいっぽい」と思いつつ難しそうと敬遠していたDockerを使います.

(2019/05/14 追記) 作業順に書いており分かりにくかったため構成を修正.

Dockerをインストールする

Install Docker Desktop for Mac | Docker Documentation

作業ディレクトリ構成(最終盤)

最終的なディレクトリ構成とコードを先に載せる.

├── Docker
│   └── web
│       └── Dockerfile
├── README.md
├── client
│   └── index.php
├── db
│   └── mysql_data
└── docker-compose.yml

db:DBサーバ用ディレクト
client:クライアントディレクト
DockerfileはDockerフォルダでまとめて管理

docker-compose.yml(最終盤)

version: '2'
services:
  db:
    image: mysql:5.7
    ports:
      - '3306:3306'
    volumes:
      - ./db/mysql_data:/var/lib/mysql ---(1)
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
  web:
    build: ./Docker/web
    ports:
      - '8080:80' ---(2)
    volumes:
      - ./client:/var/www/html ---(3)
    depends_on:
      - db ---(4)

(1)ローカルのmysql_dataディレクトリにデータを残す
(2)8080がホスト側のポート,80がdockerコンテナ側のポートで紐付け
(3)トップページのデータが入っているディレクトリをclientに指定
(4)dbとリンクさせる.※depends_onとlinkの違いは,version2ではないらしい

docker-compose.ymlというファイルを作成することによって,
DBコンテナ立ち上げて...WEBサーバーコンテナ立ち上げて...linkさせて...
というのを一気にやってくれる.すごい!
(最初はdocker-composeて何??こわ!!と思い,1つずつlinkやport設定をコマンドで指定してた・・・)

web/Dockerfile(最終盤)

サーバーに接続したところで,pdo_mysqlがインストールできなくて詰まったため,
Dockerfileでpdo_mysqlのインストールを行う.

From php:7.1-apache
Run apt-get update && docker-php-ext-install pdo_mysql

index.php(最終盤)

MySQLに接続
dbnameに使用するdb名,hostにdocker-composeに書いたコンテナ名

<?php
phpinfo();
try {
    $db = new PDO('mysql:dbname=test_db;host=db', 'root', 'root');
} catch (PDOException $e) {
    print('Error:'.$e->getMessage());
    die();
}
 ?>

<p>hello world!</p>

いざDocker起動!

$docker-compose up-d

f:id:sh_lu0:20181208213425p:plain
起動しているか確認

$docker ps

f:id:sh_lu0:20181208213510p:plain
ちゃんと2つ起動してる!

client/index.phpにhelloworldを書いて,
docker-composeのportでホスト側8080を指定したので,http://localhost:8080/にアクセスすると,
f:id:sh_lu0:20181208213711p:plain
繋がりました!

ちなみに,なんとなくup -dと書いていたけど,

$docker-compose up

とすると f:id:sh_lu0:20181208213802p:plain
のようにアクセスされるたびに出力が見れる.-dをつけるとバックグラウンド上で起動する.

MySQLにログインしてDBを作成

$mysql -uroot -proot -h127.0.0.1  #ログイン
$CREATE DATABASE test_db;

無事ブラウザに表示されるまでの道のり

ぼつになったディレクトリ構成とdocker-compose.yml

php_bbs
├── README.md
├── db
│   └── mysql_data
├── docker-compose.yml
├── client
│   └── index.php
└── web

docker-compose.yml

version: '2'
services:
  db:
    image: mysql:5.7
 ports:
      - '3306:3306'
    volumes:
      - ./db/mysql_data:/var/lib/mysql 
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
  web:
      image: php:7.1-apache
      ports:
        - '8080:80' 
      volumes:
        - ./client:/var/www/html 
      depends_on:
        - db 

ハマった点①pdo_mysqlがインストールできてない

ちゃちゃっとpdo接続の構文を探してきて,
http://localhost:8080/で確認して終わり!!かと思ったらエラーが出てハマった.

client/index.php

<?php
phpinfo();
try{
    $db = new PDO('mysql:dbname=testdb;host=localhost';port=3306,'root','root');
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}
 ?>

<p>hello world!</p>

でテストしたところ,could not find driverとエラーが出たので,phpinfo();で確認. f:id:sh_lu0:20181208213709p:plain 確かにpdo_mysqlがない.

①解決法:dockerfileでpdo_mysqlをインストール

docker-compose.yml上にpdo_mysqlをインストールさせる指示は書けないので,
ディレクトリ構成を最終盤に変更して,
・docker-compose.ymlのwebをimage→buildに書き換える.
・web/Dockerfileの中でpdo_mysqlをインストールする.

すると f:id:sh_lu0:20181208213703p:plain
ちゃんとインストールできた.

ハマった点②ホストの指定先がlocalhostじゃダメ

ドライバーないよ問題を乗り越えたかと思ったら,今度はこのエラーが出た.

Error:SQLSTATE[HY000] [2002] No such file or directory

原因が分からずに散々ググってググって途方に暮れていたけど,hostの指定先がdocker上になっていないからダメだった(涙)

②解決法:hostをdocker-composeで設定した名前に変更

$db = new PDO('mysql:dbname=test_db;host=localhost';port=3306,'root','root');

↓変更

$db = new PDO('mysql:dbname=test_db;host=db','root','root');

docker-compose.ymlでDBコンテナ名をdbとしていたので,host=dbとすると,

繋がりました・・・!!

(portの設定もいらないみたいです.書くとエラーになりました.)

参考にしたサイト:
Docker Compose - docker-compose.yml リファレンス - Qiita
Docker for MacとDocker ComposeでささっとLAMP環境を作る - Qiita
ありがとうございます