Docker Compose でLAMP環境を構築してみる

公開日:

目次

Docker Compose で LAMP環境を構築してみたので、どうやって構築したのかを備忘録として残しておきたいと思います。LAMP環境とは Linux + Apache + MySQL + PHP で作成された開発環境のことです。

バージョン情報

docker -v とターミナル上で実行して確認できるバージョンは以下です。

docker -v
Docker version 20.10.8, build 3967b7d

PHPは 8.0.13 、MySQLは5.7 の環境を作成します。

ディレクトリ構造

ディレクトリ構造は以下のようになります

.
├── config
│   ├── mysql
│   │   ├─ data
│   │   └── my.cnf
│   └── web
│       └── Dockerfile
├── docker-compose.yml
└── html
    └── app
        └── index.php

docker-compose.yml の作成

作成した docker-compose.yml は以下になります。

version: "2"
# service
services:
  # web
  web:
    build: ./config/web
    ports:
      - "8080:80"
    volumes:
      - ./html/app:/var/www/html
    restart: always
    depends_on:
      - mysql
  # db
  db:
    image: mysql:5.7
    platform: linux/x86_64
    container_name: db
    user: "1000:50"
    ports:
      - "3306:3306"
    volumes:
    - ./config/mysql/data:/var/lib/mysql
    - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: root
    command: --innodb-use-native-aio=0

PHP(Apache)環境の作成

PHP(Apache)の環境は公式イメージを利用してDockerfile を作成して環境を作成します。

Dockerfile は以下のように作成しました。

FROM php:8.0.13-apache

# extension
RUN apt-get update \
    && docker-php-ext-install pdo_mysql

# composer
RUN curl -S https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer \
    && composer self-update

# node
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash \
    && export NVM_DIR="$HOME/.nvm" \
    && . $NVM_DIR/nvm.sh \
    && nvm install v14.16.0 \
    && nvm use v14.16.0 \
    && nvm alias default v14.16.0 \
    && npm install -g npm

a-blog cms 公式のDocker イメージを参考に、不必要そうなところは削除しました。

MySQL 環境の作成

MySQLは自分でDockerfileを用意することはせず、公式のイメージを利用します。 文字コードと照合順序だけ、設定ファイルを用意して変更しています。

# my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

Docker Compose の起動

ここまで設定できたら、Docker を起動します。以下のコマンドで起動できます。

docker compose up -d

dockerを起動すると、./config/mysql/data ディレクトリ配下にデータベース関連のファイルが沢山作成されます。これは、docker-compose.yml の db の volumes の設定で同期しているためです。これにより、docker compose stopdocker compose down などでコンテナの停止や削除をしてもデータが永続化されます。

/app/index.php に以下のコードを記述してブラウザから http://localhost:8080 にアクセスすると表示が確認できます。

<?php
 
phpinfo();

次に MySQL の接続確認をしていきます。

まず、以下のコマンドで Docker で作成した db コンテナに接続します。パスワードの入力が求められるため、docker-compose.yml の MYSQL_ROOT_PASSWORD: root で指定した root を入力してエンターを押します。

mysql -u root -p

パスワードが合っていると以下のようにMySQLに接続できます。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

以下のようにサンプルのデータベースとテーブルを作成してテストデータを挿入します。

mysql> create database sample;
Query OK, 1 row affected (0.04 sec)

mysql> use sample;
Database changed
mysql> show tables;
Empty set (0.01 sec)

mysql> CREATE TABLE users (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id));
Query OK, 0 rows affected (0.14 sec)

mysql> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| users            |
+------------------+
1 row in set (0.01 sec)

mysql> INSERT INTO users (name) VALUES ("hoge"),("fuga"),("piyo");
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from users;
+----+------+
| id | name |
+----+------+
|  1 | hoge |
|  2 | fuga |
|  3 | piyo |
+----+------+
3 rows in set (0.02 sec)

テストデータが挿入できました。最後に、PHP(Apache)から MySQL に接続してデータをブラウザ上に表示してみましょう。/app/index.php に以下を記述します。

/app/index.php

<?php
try {
    $dsn = 'mysql:host=db;dbname=sample;';
    $db = new PDO($dsn, 'root', 'root');

    $sql = 'SELECT * FROM users;';
    $stmt = $db->prepare($sql);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    var_dump($result);
} catch (PDOException $e) {
    echo $e->getMessage();
    exit;
}

mysql:host=〇〇 の部分は、docker-compose.yml でMySQLコンテナのサービス名として指定してた db を使用します。PHP の記述ができたら ブラウザで http://localhost::8080 にアクセスしてみます。

先程、挿入したデータが表示できているのがわかると思います。

まとめ

これで Docker で LAMP環境を作成する作業が一通りできました。Docker による環境構築は会社の詳しい人が設定してくれた設定ファイルをよくわからずに使用しているので、今回1から環境を作成してみてDocker に関する理解が多少深まったと思います。ですがまだ、Apache のドキュメントルートを変更する方法や、データベースにデータを挿入するときに日本語が入力できないという課題がありますので、これらを解決する方法がわかったらまたブログにしたいと思います。

ではまた。