メモ > サーバ > 各論: Docker > イメージの連携(Apache + PHP + MySQL 環境の構築)
イメージの連携(Apache + PHP + MySQL 環境の構築)
■MySQLのイメージを取得
※Apache+PHPのイメージにMySQLをインストール。
…という方法でも構築できるが、Dockerの場合は一般的に「Apache+PHPのイメージとMySQLのイメージを取得し、連携させる」のようにする。
$ docker container run --name mysql -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7 … MySQLのパスワードを「pass」にして起動。
$ docker container exec -it mysql bash … mysqlコンテナのターミナルに接続。
# mysql -u root -p … MySQLに接続。
$ docker container rm -f $(docker container ls -a -q) … 確認できたら終了。
「MYSQL_ROOT_PASSWORD」は環境変数と呼ばれるもの。これに値をセットすることで、コンテナに設定の指定を行うことができる。
環境変数は、コンテナのターミナルに接続して「env」と入力すれば一覧表示できる。
起動直後にMySQLにログインしようとすると、以下のエラーになることがある。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
何度か試していると以下のエラーに変わることがある。
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
さらに何度か試しているとログインできた。その後は普通にアクセスできる。
MySQLが完全に起動するまでタイムラグがあるみたい。焦らずに1〜2分程度待つ。
Dockerの公式MySQLイメージの使い方を徹底的に解説するよ - DQNEO起業日記
http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html
■PHPとMySQLの連携(準備)
※Apache+PHPのイメージに、MySQLを扱うためのライブラリを追加する。
それを新しいイメージとして保存する。
Dockerfileを作成。
FROM php:8.1-apache
RUN apt-get update
RUN apt-get install -y libonig-dev
RUN docker-php-ext-install pdo_mysql mysqli mbstring
イメージをビルド。
$ docker image build -t php:custom docker/test/php … Dockerfileをもとに、新しいイメージをビルド。
$ docker image ls … 作成されたイメージを確認。
■PHPとMySQLの連携
※ネットワークを作成し、そこに参加させることでコンテナを連携させることができる。
※PHPコンテナ起動時に「--link mysql:mysql」のように指定することで、コンテナを連携させることもできる。が、それは古い方法で非推奨。
$ docker network ls … ネットワークを確認。はじめは3つ。
NETWORK ID NAME DRIVER SCOPE
620a2ccffb63 bridge bridge local
8b789d2d1514 host host local
16b9ed4aa1c6 none null local
$ docker network create my_network … ネットワーク「my_network」を作成。
$ docker network ls … ネットワークの追加を確認。
NETWORK ID NAME DRIVER SCOPE
620a2ccffb63 bridge bridge local
8b789d2d1514 host host local
2234c63a488d my_network bridge local
16b9ed4aa1c6 none null local
$ docker container run --net my_network --name mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7
… ネットワークを指定してMySQLコンテナを起動。
MySQLのパスワードは「pass」にして、データベース「test」を作成する。
$ docker container run --net my_network --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:custom
… ネットワークを指定してPHPコンテナを起動。
$ docker container exec -it php bash … phpコンテナのターミナルに接続。
# exit
$ docker container exec -it mysql bash … mysqlコンテナのターミナルに接続。
# mysql -u root -p … MySQLに接続。(パスワードは上で指定した「pass」を入力する。)
mysql> SHOW DATABASES; … testデータベースを確認。(「MYSQL_DATABASE=test」によって自動作成されている。)
mysql> CREATE DATABASE test; … 別途データベースを作成する場合。
mysql> QUIT;
docker/test/code(/var/www/html)内に適当なデータベース管理ツールを設置し、テーブルを作成&データ登録&表示をテスト。
http://www.php-labo.net/download/new/db_admin/ の場合、以下の接続情報でアクセスできた。
define('HTTP_URL', 'http://127.0.0.1/db_admin/');
define('ADMIN_PASSWORD', '1234');
define('DATABASE_TYPE', 'mysql');
define('DATABASE_HOST', 'mysql');
define('DATABASE_PORT', '');
define('DATABASE_USER', 'root');
define('DATABASE_PASSWORD', 'pass');
define('DATABASE_CHARSET', '');
define('DATABASE_NAME', 'test');
以下で登録テスト。
CREATE TABLE address(
no INT,
name VARCHAR(80),
tel VARCHAR(80)
);
INSERT INTO address(no, name, tel) VALUES(1, '山田太郎', '090-1234-5678');
INSERT INTO address(no, name, tel) VALUES(2, "山田花子", "090-2345-6789");
SELECT * FROM address;
※DATABASE_CHARSETを指定すると、データ登録時に
「Incorrect string value: '\xE5\xB1\xB1\xE7\x94\xB0...' for column 'name' at row 1」
のエラーになった。
$ docker container ls … コンテナを確認する場合。
$ docker container rm -f $(docker container ls -a -q) … コンテナを終了する場合。
■次回起動時
以下で起動する。
ファイル共有している以外のデータは削除されているので、テーブルの作成などは都度必要。
$ docker container run --net my_network --name mysql -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_DATABASE=test -d mysql:5.7
$ docker container run --net my_network --name php -v $PWD/docker/test/code:/var/www/html -p 80:80 -d php:custom
以下でアクセスできる。
http://127.0.0.1/
http://127.0.0.1/db_admin/
■MariaDB
一例だが、以下のようにイメージ名を変更すればMariaDBを使える。
MYSQL_ROOT_PASSWORD や MYSQL_DATABASE の設定項目は、原則同じ名前で同じように使えるみたい。
mysql:5.7
↓
mariadb:10.2
■Docker Compose
上記の方法はコンテナの数が増えると作業が複雑になる。
よって通常はDocker Composeを使用して管理する。
詳細は後述の「Docker Compose」を参照。