57
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

docker-composeでPHPとMySQLを連携させてみる

Last updated at Posted at 2019-02-10

PHPとMySQLのコンテナをつくり、そのコンテナ間で連携できるものをdocker-composeを使って作っていきます。

前提

ホスト環境

macOS Mojave 10.14.2

ディレクトリ構成

├── docker-compose.yml
├── index.php
├── mysql
│   ├── Dockerfile
│   ├── mysql_conf
│       └── custom.cnf
├── php
    └── Dockerfile

手順

カスタムネットワークの作成

$ docker network create [network_name]

[network_name]には, 任意の名前を指定する

Dockerfile, docker-compose.ymlを書いていく

php/Dockerfile

PHP,Apacheのイメージを元に必要最低限の拡張モジュールをインストールします。

FROM php:7.2-apache
RUN apt-get update && \
  # PHPのExtensionをインストール.
  docker-php-ext-install pdo_mysql mysqli mbstring

WORKDIR /var/www/html

EXPOSE 80

mysql/Dockerfile

動くものを作りたいので、とりあえずイメージだけ

FROM mysql:8.0

docker-compose.yml

version: '3'
services:
  app:
    container_name: php
    build:
      context: ./php
      dockerfile: Dockerfile
    tty: true
    volumes:
      - ${PWD}:/var/www/html
    ports:
      - "80:80"
    network_mode: "sample-network" # 上で作成したカスタムネットワークの名前を記載する

  db1:
    container_name: mysql
    build:
      context: ./mysql
      dockerfile: Dockerfile
    environment:
      - MYSQL_ROOT_PASSWORD=pass
    volumes:
      # MySQLの設定ファイル
      - ./mysql/mysql_conf:/etc/mysql/conf.d
    network_mode: "sample-network"

networks:
  sample-network:

MySQLの設定ファイルを書く

MySQL8.0を実行した時, The server requested authentication method unknown to the clientエラーが発生したので, 一応下記の設定を追加しておく.

mysql/custom.cnf

[mysqld]
default_authentication_plugin=mysql_native_password

docker-composeを実行

バックグラウンドで実行させるため, -dオプションをつける

$ docker-compose up -d

PHP側の設定

確認用スクリプトを書く

index.php

<meta charset="UTF-8">
<title>テスト</title>
<?php
    try {
        # hostには「docker-compose.yml」で指定したコンテナ名を記載
        $dsn = "mysql:host=mysql;dbname=sample;";
        $db = new PDO($dsn, 'root', 'pass');

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

MySQL側の設定

コンテナ内に入る

$ docker container exec -it mysql /bin/sh

MySQLへ接続

パスワードは docker-compose.ymlの環境変数で指定

$ mysql -ppass

適当なデータベースとテーブルを作成

mysql> CREATE DATABASE sample;
mysql> USE sample;
mysql> CREATE TABLE test(id int AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));
mysql> INSERT INTO test (name) VALUES ('John');

ブラウザで確認

http://localhost:80/index.php へアクセス

データが表示されることが確認できるかと思います

57
55
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?