【Docker】Docker ~ LAMP ~

■ はじめに

https://dk521123.hatenablog.com/entry/2022/01/14/102719
https://dk521123.hatenablog.com/entry/2022/02/22/000000
https://dk521123.hatenablog.com/entry/2022/04/29/000000

の続き。

今回は、LAMP(Linux/Apache/MySQL/PHP)環境を
Dockerfile/Docker composeで環境構築してみる。

目次

【1】ファイル構造
 1)Dockerfile と Docker Composeについて
【2】Dockerfile
 1)Dockerfileを単体で動かしてみる
 2)後片付け
【3】compose.yml
【4】その他ファイル
 1)index.php
【5】動作確認
 1)起動する
 2)確認
 3)後片付け

【1】ファイル構造

+ Dockerfile
+ compose.yml
+ htdocs
  + index.php

1)Dockerfile と Docker Composeについて

Dockerfileも使う必要がある場合

* Docker composeでは対応できないケース
* 詳細な設定をしたいケース

今回の必要性

* PHPからMySQLに接続するためのライブラリが必要で
 接続環境を作るため

【2】Dockerfile

FROM php:8.2.5-apache

# extension
RUN apt-get update \
    && docker-php-ext-install pdo_mysql

1)Dockerfileを単体で動かしてみる

[1] 作成したDockerイメージをビルドする

docker image build . -t lamp-demo

# 確認
docker images

作成したDockerイメージを起動する

docker container run -d -p 8080:80 lamp-demo

# 確認
docker container ps -a

2)後片付け

Step1:コンテナ名またはコンテナIDを調べる

docker container ps -a
CONTAINER ID   IMAGE ...
75c7385c81ac   lamp-demo ...

Step2:コンテナ停止

# [構文] docker container stop [ContainerName / ContainerID]
docker container stop 75c7385c81ac

Step3: コンテナの削除

# [構文] docker container rm [ContainerName / ContainerID]
docker container rm 75c7385c81ac
# 確認
docker container ps -a

Step4: Dockerイメージの削除

# [構文] docker image rm [DockerImageName]
docker image rm lamp-demo
# 確認
docker images

【3】compose.yml

version: "3.8"

# service
services:
  # web
  web:
    build: .
    container_name: web
    volumes:
      - ./htdocs:/var/www/html
    ports:
      - "8080:80"
    depends_on:
      - mysql
  # phpmyadmin
  phpmyadmin:
    image: phpmyadmin
    container_name: phpmyadmin
    environment:
      PMA_HOST: mysql
    ports:
      - "8081:80"
    depends_on:
      - mysql
  # db
  mysql:
    image: mysql:8.0.28
    platform: linux/x86_64
    container_name: db
    ports:
      - "3306:3306"
    volumes:
      - mysql_db:/var/lib/mysql
      # - ./config/mysql/data:/var/lib/mysql
      # - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: 'Asia/Tokyo'
# volumes
volumes:
  mysql_db: {}

【4】その他ファイル

1)index.php

<?php
try {
  $db = new PDO('mysql:host=mysql;dbname=mysql', 'root', 'password');
  $message = 'Hello, world. Connected to MySQL';
  print $message;
} catch (PDOException $e) {
  $message = 'Failed to connect MySQL(' . $e->getMessage() . ')';
  print $message;
}
?>

【5】動作確認

1)起動する

docker compose up -d

2)動作確認

[1] phpmyadmin

* phpmyadmin を確認するために、以下のURLにアクセスする
 + user name: root
 + user passowrd: password

http://localhost:8081/

[2] PHP / Apache

* PHP / Apache を確認するために、以下のURLにアクセスする
 => 「Hello, world. Connected to MySQL」が表示されたらOK

http://localhost:8080/

[3] わざと間違えての動作確認

1) index.php を以下のように異なるパスワード「NGpassword」を設定する
~~~~
try {
  $db = new PDO('mysql:host=mysql;dbname=mysql', 'root', 'NGpassword');
~~~~

2) 「docker compose up -d --build」で再度立ち上げ直す

3) 以下のURLにアクセスする
 => 「Failed to connect MySQL(SQLSTATE[HY000] [1045] Access denied for user ...」
  が表示されたらOK

http://localhost:8080/

[4] MySQLを接続する

# 方法1:直接繋ぐ
sudo apt install mysql-client-core-8.0
mysql -u root -ppassword -h 127.0.0.1
mysql> \q
Bye

# 方法2:Docker内部に接続し、コンテナ内から接続
# docker container exec -it <MySQLのコンテナ名> bash
docker container exec -it db bash
mysql -u root -ppassword -h 127.0.0.1
mysql> \q
Bye

# 方法3:phpmyadmin から接続する

3)後片付け

# 一括停止する
docker compose down
# 停止する
# docker compose stop

docker compose ps

# 削除
docker compose rm

関連記事

Docker ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/24/160044
Docker ~ Windows / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2017/09/23/235818
Docker ~ Linux / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2018/04/10/234030