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