BETA

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

投稿日:2018-12-05
最終更新:2018-12-08
※この記事は外部サイト(https://sh-lu0.hatenablog.com/entry/2018/1...)からのクロス投稿です

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

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

Dockerをインストールする

Dockerインストール

作業ディレクトリ構成

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

db:DBサーバ用ディレクトリ
web:webサーバ用ディレクトリ
html:作業用ディレクトリ

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:  
      image: php:7.1-apache  
      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設定をコマンドで指定してた・・・)

いざDocker起動!

$docker-compose up-d  

起動しているか確認

$docker ps  


ちゃんと2つ起動してる!

client/index.phpにhelloworldを書いて.
docker-composeのportでホスト側8080を指定したので,
http://localhost:8080/ にアクセスすると,

繋がりました!

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

$docker-compose up  

とすると

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

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

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

PDOを使用してMySQLに接続

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

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

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();で確認.

確かにpdo_mysqlがない.

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

docker-compose.yml上にpdo_mysqlをインストールさせる指示は書けないので,ディレクトリ構成を

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

に変更して,docker-compose.ymlのwebもimage→buildに書き換える.

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

すると

ちゃんとインストールできた.

ハマった点②ホストの指定先が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
ありがとうございます.

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@shlu0の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!