Dockerに入門しました。複数回に分けて備忘録として記載していきます。
本記事では、ハンズオン/PHPの環境構築/docker-composeで複数コンテナを一括で起動する手順について記載します。
【ソースコードはこちら】
>> docker-php2
【参考記事】
- 【Udemy】米シリコンバレーDevOps監修!超Docker完全入門(2022)【優しい図解説とハンズオンLab付き】
- 【Udemy】現役Webエンジニアが教えるPHP,MySQL,dockerを使用したフルスクラッチ開発
【関連記事】
- 【第1回】Dockerインストール→Linux(CentOS7)を起動
- 【第2回】Linuxの概要/GCPでUbuntuをインストール
- 【第3回】WEBサーバを構築(Nginx)/ネットワークの概要
- 【第4回】WEBアプリ構築/Dockerでの環境構築準備
- 【第5回】Dockerの概要
- 【第6回】Dockerのインストール・作成・起動・停止
- 【第7回】PHPの開発環境を構築(PHPとApacheのみ)
- 【第8回】PHPの開発環境を構築(docker-composeで複数コンテナを一括で起動)
- 【第9回】PHPの環境構築_その2_(環境構築自動化)
構築環境
主な手順
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 コンテナで公開されているポートを指定