【Docker第8回】ハンズオン/PHPの環境構築/docker-composeで複数コンテナを一括で起動

【Docker第8回】ハンズオン/PHPの環境構築/docker-composeで複数コンテナを一括で起動

Dockerに入門しました。複数回に分けて備忘録として記載していきます。

本記事では、ハンズオン/PHPの環境構築/docker-composeで複数コンテナを一括で起動する手順について記載します。

【ソースコードはこちら】
>> docker-php2

【参考記事】


【関連記事】


構築環境

主な手順

docker-composeで複数のコンテナを一括で起動し、動作確認を実施するまでの手順


構築する環境

  • Nginx
  • PHP
  • phpmyadmin
  • mysql

ローカルの環境

PC M1 MacBook
Docker ・以下の手順で事前にインストールする
【Docker公式】概要説明とセットアップ
【簡易手順】Dockerのインストール

構成フロー/ディレクトリとファイルの準備

Dockerの構成フロー

# Dockerfile
自分で作る
Imageを自作するためのファイル

↓ build

# image
コンテナを起動する土台
DockerHubで公開されている

↓ run

# Container(コンテナ)
アプリケーションの実行環境
使い捨て可能
開始・停止・削除

作成するもの

PCで任意のDIRに以下の構成でディレクトリとファイルを作成します。

docker-php2
├── docker-compose.yml # file
├── nginx              # dir
│   └── nginx.conf     # file
├── php                # dir
│   ├── Dockerfile     # file
│   └── php.ini        # file
├── mysql              # dir
│   └── data           # dir
└── www                # dir
    └── html           # dir
    └── index.php      # file

 

Dockerfileの作成

【ソースコードはこちら】
>> Dockerfile


Dockerfileとは?

  • Dockerイメージをビルドするためのテキストファイル
  • Dockerfile内に記述された手順に従ってDockerfileを解析し、Dockerイメージを自動的に作成(ビルド)することができる
  • Dockerfileは、Dockerコマンドを使用してビルドされ、Dockerイメージが作成される

Dockerfileの構文

INSTRUCTION arguments

Dockerfileでは、Dockerイメージを構築するために必要な手順を指定することが可能

例えば、以下のような手順がある。

FROM:       ベースとなるイメージを指定
RUN:        コマンドを実行
COPY:       ファイルやディレクトリをコピー
ADD:        ファイルやディレクトリを追加
EXPOSE:     コンテナが使用するポートを指定
CMD:        コンテナが起動したときに実行するコマンドを指定
ENTRYPOINT: コンテナが起動したときに実行するコマンドを指定
# 実行例
# 以下のコマンドでは、Dockerfileが存在するディレクトリへのパスと、イメージの名前を指定している
$ docker build -t ---

docker-compose.ymlの作成

【ソースコードはこちら】
>> docker-compose.yml


エラー対応

M1 Macの場合、docker-compose.yml に以下を記載しないと、エラーになる場合がある

# for m1 mac
platform: linux/x86_64

volume

# volumes:
# Bind mount するディレクトリ。volume。docker run コマンドの-v/--volume に相当
# - "$PWD/app-server/src:/usr/src/app"

php.iniの作成

【ソースコードはこちら】
>> php.ini


index.phpの作成

【ソースコードはこちら】
>> index.php


コンテナの起動

# 該当のディレクトリに移動
$ cd docker-php2

# コンテナを起動
$ docker-compose up -d

# result
# 数分待った後、以下のメッセージが出れば、ビルド完了
:
:
Creating mysql ... done
Creating php-apache ... done
Creating phpMyAdmin ... done


# イメージの確認
$ docker images

# 事後確認
$ docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED       STATUS       PORTS                                NAMES
ec54a3f41aad   nginx:latest                   "/docker-entrypoint.…"   3 hours ago   Up 3 hours   0.0.0.0:8080->80/tcp                 docker-php2_nginx_1
30a49734dc0d   docker-php2_php                "docker-php-entrypoi…"   3 hours ago   Up 3 hours   9000/tcp                             docker-php2_php_1
5765883162b1   phpmyadmin/phpmyadmin:latest   "/docker-entrypoint.…"   3 hours ago   Up 3 hours   0.0.0.0:8888->80/tcp                 docker-php2_phpmyadmin_1
c5b526f70691   mysql:5.7                      "docker-entrypoint.s…"   3 hours ago   Up 3 hours   33060/tcp, 0.0.0.0:13306->3306/tcp   docker-php2_db_1

動作確認



# docker-php2_nginx_1
# OK
curl http://localhost:8080/

# docker-php2_phpmyadmin_1
# OK
curl http://localhost:8888/

ブラウザで確認する方法

>> ブラウザでの動作確認


コンテナを停止

  • 動作確認して問題なければ、開発を開始する。
  • 作業終了後に以下の手順でコンテナを停止する。
    >> コンテナの停止

エラー対応

環境構築後にエラーの原因特定に苦戦しました。理由はタイポでした。以下に簡単に切り分け手順を記載します。

エラー内容:PHPINFOがブラウザに表示されない

起動中のコンテナにシェルで入って確認

# 起動しているコンテナの確認
# 以下は表示例
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30a49734dc0d docker-php2_php "docker-php-entrypoi…" 3 hours ago Up 3 hours 9000/tcp docker-php2_php_1
# コンテナIDを確認し、シェルで入る
$ docker exec -it 30a49734dc0d bash

# php -v
PHP 7.2.34 (cli) (built: Dec 11 2020 11:22:05) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
→ PHPの起動OK
# PHPが正常に起動しているかどうかを確認するために、以下のコマンドを実行
$ php -r 'echo "Hello, world!";'
Hello, world!r**t@30a49734dc0d:/var/www/html #
→ 正常起動していることを確認

# 「index.php」に記載ミスがないか確認
$ cd /var/www/html/
$ cat index.php
→ PHPの開始タグに「?」が抜けているというタイポを発見
→ タイポを修正
→ コンテナを立ち上げ直して改善

開発手順

次回以降はDocker上でPHPやMySQLの開発実装が簡単にできます。手順は以下の通り。

ex) phpmyadminでMySQLの開発をする場合

  • Dockerデスクトップを起動
  • 以下のコマンドで、コンテナを起動する
# ワークディレクトリ(今回のハンズオン環境では、「~/work/tutorial_docker/docker-php2」)
$ cd tutorial_docker/docker-php2

# コンテナを起動
$ docker-compose up -d

# ブラウザで以下のURLに遷移する
# 今回のハンズオン環境では「phpmyadmin(MySQL)」はポート8888を使用
http://localhost:8888/

# ブラウザでphpmyadminのログイン画面が表示されたら、以下の情報でログイン
ex)ログイン情報例
root
secret

開発が進んだ場合のMySQLデータについて

ローカルの永続ストレージに保管される

  • Dockerは永続化ストレージを利用することで、コンテナを停止してもデータが保持される
  • そのため、その都度、新しいコンテナイメージを作る必要はない
  • ただし、このハンズオン環境では永続データはローカルに保管されるため、重要なデータに関しては、今後はAWSのS3などに保管する案も検討が必要
  • なお、新しいパッケージやライブラリを追加する場合など、コンテナイメージを更新する必要がある場合もある

フォルダ構成

docker-php2
├── docker-compose.yml # file
├── nginx              # dir
│   └── nginx.conf     # file
├── php                # dir
│   ├── Dockerfile     # file
│   └── php.ini        # file
├── mysql              # dir phpmyadminで開発したデータは、以下に保管される
│   └── data           # dir 
└── www                # dir
    └── html           # dir
    └── index.php      # file

コンテナの停止コマンド

# コンテナIDの確認
$ docker ps

# コンテナを停止
$ docker stop

【参考】現在動いている Docker 環境から新しいコンテナを作成する手順

# Docker コンテナの現在の状態を確認
$ docker ps

# 現在のコンテナの情報をもとに、Docker イメージを作成
# コンテナの ID や名前を使用して、次のコマンドを実行
$ docker commit [CONTAINER_ID] [NEW_IMAGE_NAME]

# 新しいイメージを使用して新しいコンテナを作成
$ docker run --name [NEW_CONTAINER_NAME] -p [HOST_PORT]:[CONTAINER_PORT] -d [NEW_IMAGE_NAME]

[NEW_CONTAINER_NAME] は、新しいコンテナの名前を指定
[HOST_PORT] は、Docker コンテナを公開するポートを指定
[CONTAINER_PORT] は、Docker コンテナで公開されているポートを指定