もう何番煎じかわかりませんが、毎回調べてその都度ハマるのはもう嫌なので、自分の記録として残します。
docker-composeで以下の環境を作成します。
- Apache 2.4
- PHP 7.x
- MySQL 5.7 or 8.0
Docker image
以下の公式イメージを使います。
PHP: https://hub.docker.com/_/php/
MySQL: https://hub.docker.com/_/mysql/
PHPはApacheが入っているもの(7.2-apache-stretch等)を利用します。
ディレクトリ構造
.
│ docker-compose.yml
│
├─src
│ ソースコード
│
└─docker
│
└─php
Dockerfile
docker-compose.yml
version: '3'
services:
app:
build: ./docker/php
volumes:
- ./src:/var/www/html
ports:
- 80:80
mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- 3306:3306
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
解説
services:
app:
volumes:
- ./src:/var/www/html
mysql:
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
Dockerのコンテナは、内部の操作はコンテナの停止と共に破棄されてしまうため、特にDBコンテナではデータの永続化をする必要があります。
アプリケーションのソースコードはservices.app.volumesでローカルのディレクトリをマウントしているため、コンテナ内の操作とローカルの操作がリアルタイムに反映しあいます。
DBのデータの永続化は、以前はデータ格納用コンテナを別途用意していましたが、トップレベルのvolumesセクションでnamed volumeを指定することで簡単にできるようになりました。
今回はdbdataという名前のnamed volumeを作成し、mysqlのデータディレクトリにマウントしています。
postgresqlの場合は以下のようにします。
volumes:
- "dbdata:/var/lib/postgresql/data"
named volumeは全てのコンテナから参照できます。
Dockerfile
FROM php:7.2-apache-stretch
RUN apt-get update \
&& apt-get install -y libpq-dev \
&& docker-php-ext-install pdo_mysql pdo_pgsql
公式のphpイメージにはpdoがインストールされていないため、追加する必要があります(1敗)。
起動
docker-compose up -d
以上