sh_lu0
shlu0.qrunch.io

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

2018/12/05に投稿
この投稿は別サイトからのクロス投稿です(クロス元:https://sh-lu0.hatenablog.com/en...

前回は本通りに掲示板を作成しました.
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
ありがとうございます.

関連記事

コメントはありません。
sh_lu0
shlu0.qrunch.io
機械系大学院生/ゲームとアイドルが生きがい/ プログラミング修行中/
フォロー
フォロワー
ブログを開設

クランチで技術ブログを
始めてみませんか?

この先は、クランチへのアカウント登録、及びログインが必要なページになります。

Markdownの書き方
見出し # 見出し(h1)
## 見出し(h2) , ### 見出し(h3) ...
リスト - 箇条書き
   - タブでインデント
番号付きリスト 1. テキスト
2. テキスト
改行 行末に半角スペース2つ
リンクの挿入 [タイトル](https://xxx.com)
引用 > テキスト
コード挿入 ```cpp:title
code
```
画像の挿入 ![代替テキスト](URL "タイトル")
太字 **テキスト**
斜体 *テキスト*
打消し線 ~~テキスト~~
水平線 ***
技術ブログを開設
ログイン