メモ > サーバ > 各論: 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」を参照