Docker | Docker上にLAMP環境を構築する ~ Docker Compose / Apache / MySQL / PHP
- 2022.11.16
- Docker

こんにちは!今回はDocker上にLAMP環境を構築していきたいと思います。
構成
LAMP(ランプ)は「OS:Linux」「Web:Apache」「DB:MySQL」「言語:PHP」といったオープンソースソフトウェアの構成を指します。
LAMPのほかにも、MAMPやXAMPPなどがあります。

いずれもDocker Hubにイメージが提供されているため、それぞれのDockerコンテナを生成し(1プロセス=1コンテナの考えに基づく)、Docker Composeでそれぞれを繋ぎ合わせます。
手順
今回利用するDocker Imageは以下の通りです。
・PHP(& Apache) [Link]
→ PHPイメージ内にApacheが内包されているため、PHPのイメージをPullする。
・MySQL [Link]
①DockerCompose用のフォルダを作成する
適当な場所で良いですが、今回はDドライブ直下に作成します。
このフォルダ名が、docker-compose実行後のcompose名になります。
mkdir dockerlamp
cd dockerlamp
以下のようなフォルダ構成にします。
D:
└─ dockerlamp
└─ docker-compose.yml
②作成したフォルダに docker-compose設定ファイルを作成する
yml(ヤムル)ファイルを作成します。
docker-compose.yml ↓
#----------------------------
# Docker Composeの系を指定
# 3系のDocker Composeを使用
#----------------------------
version: '3.7'
#----------------------------
#下記サービスが共有で利用するフォルダ
#----------------------------
volumes:
share_data:
#----------------------------
# サービスを記載する
# 例)php: や db: など。適当(わかりやすい)な文字ならOK
#----------------------------
services:
#----------------------------
#1:DBの設定
#----------------------------
mysql:
#1) pullするイメージを記載( :latestで最新)
image: mysql:5.7
#2) 作成するコンテナ名を指定
container_name:
LAMP_DB
#3) サーバ再起動後でも、コンテナを自動起動する
restart:
always
#4) MYSQLのユーザ設定
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test_db
- MYSQL_USER=test_user
- MYSQL_PASSWORD=test_password
#5) 共有データ領域(share_data)をマウントする
volumes:
- share_data:/var/lib/mysql
#6) 通信ポートを指定(<Client側から接続する際のPort>:<Container側のPort>)
ports:
- 3306:3306
#----------------------------
#2:PHP 及び Apache の設定
#----------------------------
php:
#1) 連携させるサービスを記載
depends_on:
- mysql
#2) pullするイメージを記載( :latestで最新)
image:
php:7.4.8-apache
#3) 作成するコンテナ名を指定
container_name:
LAMP_php
#4) サーバ再起動後でも、コンテナを自動起動する
restart:
always
#5) 通信ポートを指定(<Client側から接続する際のPort>:<Container側のPort>)
ports:
- 8080:80
③docker-composeを起動する
docker-compose up -d --build
Dockerコンテナが生成されたことを確認しました。

接続テスト ~Apache起動テスト~
この状態で「http://localhost:8080」に接続してみます。

現在、index.htmlが存在しないため、このような表示になります。
1)index.phpを作成してApacheの挙動を確認する
Dockerコンテナ「LAMP_php」のターミナルに接続します。
↓現在の場所
# pwd
/var/www/html
↓vimが入っていないのでインストール
# apt-get update
# apt-get install vim
↓index.phpを作成(touch index.phpからvimで編集でも可)
# vim index.php
2)index.phpを編集する
index.phpの中身↓
<?php
phpinfo();
?>
では改めて「http://localhost:8080」に接続します。

接続テスト ~DB接続テスト~
PHPコンテナからDBコンテナに接続します。
上記のDBコンテナ設定情報の一部は以下の通りです。
#4) MYSQLのユーザ設定
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test_db
- MYSQL_USER=test_user
- MYSQL_PASSWORD=test_password
1)mySQLコンテナのターミナルに接続し、mySQLを起動
mysqlを起動します。
mysql -u test_user -p
>> Enter password: 「test_password」を入力
2)テーブルを作成する
試行用として以下のようなテーブルを作成します。
mysql> Create Table test_db.test_table(id int, name varchar(10));
mysql> Insert into test_db.test_table values(1,'Apple');
mysql> Insert into test_db.test_table values(2,'Banana');
データが準備できました。
mysql> select * from test_db.test_table;
+------+--------+
| id | name |
+------+--------+
| 1 | Apple |
| 2 | Banana |
+------+--------+
2 rows in set (0.01 sec)
3)php.iniを設定
PHPコンテナに戻り、Mysqlと接続するための準備を行います。
php.iniが格納されるべきフォルダに移動したのち、php.ini-developmentをコピーします。
cd /usr/local/etc/php
cp php.ini-development php.ini
4)PDOのmysqlをインストールする
apt-getではインストールが出来ず詰まっていたのですが、どうやら以下のコマンドで入手するようです。
docker-php-ext-install pdo_mysql
4)PHPからデータ取得→表示を行う
PHPコンテナに戻り、/var/www/html フォルダの配下に「test.php」を作成します。
↓test.php
<?php
$dsn = 'mysql:host=mysql;dbname=test_db;';
$db = new PDO($dsn, 'test_user', 'test_password');
$sql = 'SELECT * FROM test_db.test_table;';
$stmt = $db->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($result);
?>
5)ブラウザから接続確認
http://localhost:8080/test.php に接続します。
以下のような出力結果が得られ、DBと接続できたことを確認しました。

まとめ
今回は Docker Composeを用いて「LAMP」環境を作成してみました。
Apacheやphpの細かな設定は省いていますが、大まかな動きは確認できました!
ではまた!
エラー: データの取得に失敗しました。
-
前の記事
Docker | Dockerコンテナを作成しよう(Apache) 2022.11.10
-
次の記事
Docker | Dockerコンテナを作成しよう(MySQL と phpMyAdmin) 2023.07.19