Docker ComposeでLAMP環境構築にチャレンジ(Mac)
- Dockerをインストールする
- 作業ディレクトリ構成(最終盤)
- docker-compose.yml(最終盤)
- web/Dockerfile(最終盤)
- index.php(最終盤)
- いざDocker起動!
- MySQLにログインしてDBを作成
- 無事ブラウザに表示されるまでの道のり
- ハマった点①pdo_mysqlがインストールできてない
- ①解決法:dockerfileでpdo_mysqlをインストール
- ハマった点②ホストの指定先がlocalhostじゃダメ
- ②解決法:hostをdocker-composeで設定した名前に変更
前回は本通りに掲示板を作成しました.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
起動しているか確認
$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;
無事ブラウザに表示されるまでの道のり
ぼつになったディレクトリ構成と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();で確認. 確かにpdo_mysqlがない.
①解決法:dockerfileでpdo_mysqlをインストール
docker-compose.yml上にpdo_mysqlをインストールさせる指示は書けないので,
・ディレクトリ構成を最終盤に変更して,
・docker-compose.ymlのwebをimage→buildに書き換える.
・web/Dockerfileの中でpdo_mysqlをインストールする.
すると
ちゃんとインストールできた.
ハマった点②ホストの指定先が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
ありがとうございます