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

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

More than 1 year has passed since last update.

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 へアクセス

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

fujitak
Why not register and get more from Qiita?
  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
No 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
ユーザーは見つかりませんでした