DockerでPHP+Apache+MariaDBの環境を構築してみた

スポンサーリンク

表題の通りです。

さっそくはじめて行きます!

フォルダ構成

├── mariaDB
│   ├── Dockerfile
│   ├── MariaDB.repo
│   ├── mariadb.sh
│   ├── my.cnf
│   ├── mysql
│   └── sql
│       ├── dcl.sql
│       ├── ddl.sql
│       └── dml.sql
└── php
    ├── Dockerfile
    └── html
        └── index.php

MariaDBの構築

MariaDB構築用のDockerfileを作成します。

# centos 7.8
FROM centos:7

# MariaDB Repository
COPY ./MariaDB.repo /etc/yum.repos.d/MariaDB.repo

# MariaDB install
RUN yum install -y MariaDB-server MariaDB-client

# MariaDB setting
COPY ./my.cnf /etc/my.cnf.d/
COPY ./mariadb.sh /mariadb.sh
RUN chmod +x /mariadb.sh

# set volume
VOLUME [ "/var/lib/mysql" ]

# open port
EXPOSE 3306

# run shell
ENTRYPOINT ["/mariadb.sh"]

次に、MariaDBの最新版をMariaDBのリポジトリからダウンロードします。

MariaDB.repoファイルを作成してください。

# MariaDB 10.4 CentOS repository list - created 2020-08-15 17:14 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

続いて、my.cnfファイルを作成します。

[mysqld]
port=3306
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/error.log
datadir=/var/lib/mysql

続いて、mariadb.shを作成します。

#! /bin/bash

mysql_install_db
mkdir -p /var/run/mysql /var/lib/mysql var/log/mysql
chown -R mysql:mysql /var/run/mysql /var/lib/mysql /var/log/mysql

/usr/bin/mysqld_safe --datadir='/var/lib/mysql' & sleep 20

mysql -u$MARIADBUSER -p$MARIADBPASSWORD < /tmp/ddl.sql
mysql -u$MARIADBUSER -p$MARIADBPASSWORD < /tmp/dcl.sql
mysql -u$MARIADBUSER -p$MARIADBPASSWORD < /tmp/dml.sql

tail -f /dev/null

ddlとdclとdmlを作成します。

まずはddlです。

CREATE DATABASE sample_db DEFAULT CHARACTER SET utf8;

CREATE TABLE sample_db.sample_table(id int, name varchar(10), age int);

次にdclです。

GRANT ALL PRIVILEGES ON sample_db.* TO 'sample_db'@'localhost'  IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'sample_db'@'%'  IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'  IDENTIFIED BY 'password' WITH GRANT OPTION;

次にdmlです。

INSERT INTO sample_db.sample_table VALUES (1, 'sample1', 31);
INSERT INTO sample_db.sample_table VALUES (1, 'sample2', 32);
INSERT INTO sample_db.sample_table VALUES (1, 'sample3', 33);
INSERT INTO sample_db.sample_table VALUES (1, 'sample4', 34);
INSERT INTO sample_db.sample_table VALUES (1, 'sample5', 35);

ビルドします。

docker build --tag mariadb:1.0 .

コンテナを生成します。

docker run -d -e DBNAME=sample_db -e MARIADBUSER=root -e MARIADBPASSWORD=password -v {ディレクトリ}/mariaDB/sql:/tmp -v {ディレクトリ}/mariaDB/mysql:/var/lib/mysql:rw --name mariadb01 mariadb:1.0

ディレクトリは任意のものに置き換えてください。

PHP+Apacheの構築

PHP+Apache構築用のDockerfileを作成します。

# CentOS 7.8
FROM centos:7

# yum update  and  yum clean cache
RUN yum update -y && yum clean all

# Repository
# EPEL
RUN yum install -y epel-release
# remi
RUN yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# Install apache
RUN yum install -y httpd

# Install PHP
RUN yum -y install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-xml php-gd php-fpm php-mysqlnd php-opcache php-pecl-zip libzip5

# Always start httpd
RUN systemctl enable httpd

phpファイルを作成していきます。

<?php
    $username = 'root';
    $password = 'password';

    try {
        $database = new PDO('mysql:host=172.17.0.2;dbname=sample_db;charset=UTF8;', $username, $password);
    } catch(PDOException $e) {
        print('ERROR:'.$e->getMessage());
        exit;
    }

    $sql = 'SELECT * FROM sample_table';
    $statement = $database->query($sql);
    $records = $statement->fetchAll();
    $statement = null;
    $database = null;
?>

<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>サンプル</title>
    </head>
    <body>
        <?php
            if ($records) {
                foreach ($records as $record) {
                    $name = $record['name'];
                    print htmlspecialchars($name, ENT_QUOTES, "UTF-8");
                }
            }
        ?>
    </body>
</html>

次に、ビルドします。

docker build --tag php:1.0 .

コンテナを生成します。

docker run -itd --tmpfs /tmp --tmpfs /run -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v {ディレクトリ}/html:/var/www/html --stop-signal SIGRTMIN+3 --name app1 -p 10000:80 --link mariadb01:db01 app1:1.0 /sbin/init

ディレクトリは任意のものに置き換えてください。

動作確認

http://localhost:1000/にアクセスしてください。

以下のように値が表示されれば正常に動作しています。

Docker実践ガイド 第2版 impress top gearシリーズ | 古賀 政純 | 工学 | Kindleストア | Amazon
Amazonで古賀 政純のDocker実践ガイド 第2版 impress top gearシリーズ。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。
仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん (Compass Booksシリーズ) | 小笠原 種高 | コンピュータ・IT | Kindleストア | Amazon
Amazonで小笠原 種高の仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん (Compass Booksシリーズ)。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。

docker
スポンサーリンク
エンジニアの日記

コメント