Memo

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

Advertisement