Help us understand the problem. What is going on with this article?

5分で作るPHP開発環境(Docker-compose)

PHPの開発環境が欲しくて色々調べたところ、XAMPPなんて便利なものがあるらしい。
ただここはインフラエンジニアらしくdockerで作ることにした。
ネットに散々ナレッジは落ちてるが、環境が違ったり情報が古かったりと中々動いてくれなかったので、トラシューなども含めてメモしておく。

動作検証環境

  • macOS
    • Sierra vr10.12.6
  • docker
    • Docker version 19.03.1
  • docker-compose
    • docker-compose version 1.24.1

いいから早くさわらせろ

コンテナの起動

https://github.com/yuto-miyazawa/Docker-Compose
詳しくはREADMEを参照。
前提としてdocker,docker-composeコマンドは入れておくこと。

1.上記のgitリポジトリをお手元にclone
2.カレントディレクトリを「lamp」移動
3.下記のコマンドでコンテナを起動

docker-compose up -d

コンテナの起動確認

1.ブラウザでhttp://localhost に接続 -> hello world!が出ればok
2.ブラウザでhttp://localhost:8080 に接続 -> myphpadminの画面に飛べればok



dockerが起動しない場合

portが重複してる

dockerは使用するportをポートフォワーディングしている。

docker-compose.yml
    ports:
    - 8080:80  // 8080ポートで外部で受け、コンテナ内の80ポートへ流す

この場合、8080ポートがすでに使われている場合、dockerはコンテナを立ち上げることができない。
下記を試すと起動できるようになる可能性がある。

  1. 他のアプリケーションを停止する(Skypeとかは80を使うらしいので怪しい)
  2. 8080の箇所を別の使用されていないポートに書き換える




トラブルシューティング

以下構築時にハマった箇所のメモ

mysql-clientがapt-getできない

php/Dockerfile
apt-get install -y zlib1g-dev mysql-client

Debianはあるバージョンから「mysql-client」パッケージがなくなり「default-mysql-client」パッケージにかわったため、こちらをapt-getする

php/Dockerfile
RUN apt-get update \
  && apt-get install -y zlib1g-dev mysql-client \
  && docker-php-ext-install zip pdo_mysql


composer-setup.phpが古い

phpコンテナを立ち上げる際にこのファイルを読み込むのだが、ハッシュ値を確認しているため最新の値にしてやる必要がある。

php/Dockerfile
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"

https://getcomposer.org/download/
↑から最新のファイルを取得する

phpからmysqlに接続できない

phpからmysqlに接続しようとすると以下のエラーが出る。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

色々調べた結果、どうやらphpからmysqlコンテナを指定する場合、localhostではなくmysqlのコンテナ名を指定してやる必要があった。
今回の場合だとコンテナ名「mysql」を指定する。

// phpコンテナに入る
$ docker exec -it php /bin/bash

// mysqlに接続
mysql -u root -p -h mysql

.phpでmysqlに接続する場合も同様

$dsn = 'mysql:dbname=shop; host=mysql; charset=utf8';
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away