とりあえずDockerに慣れる意味での簡易的な環境構築方法となります。
Docker初心者が書いているので、おかしな点など有りましたらご指摘いただけると助かります。
Dockerデスクトップをインストール
まずはDockerデスクトップをインストール。
インストール方法はこちらの記事様がわかりやすく解説して下さってます(Windowsです)
必要なファイルを準備
以下の構成でファイル・フォルダを作成。
┌─ html
│ └ index.php
├─ php.ini
└─ docker-compose.yml
※MySQLのフォルダは後で自動作成されるので作成不要。
なお、解説サイトによってはDocekerfile(imageの設計図のようなもの)を別途作成している場合もある。Docekerfileはオリジナルのimageを使用する場合等には必要だが、今回のように既存のimageをそのまま使用するだけなら無くてもOK。
各ファイルの中身
index.php
<?php echo "hello"; ?>
php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
docker-compose.yml(内容の意味については当記事下部に別途記載)
version: '3'
services:
php:
image: php:7.4.8-apache
volumes:
- ./php.ini:/usr/local/etc/php/php.ini
- ./html:/var/www/html
ports:
- 8080:80
mysql:
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test
- MYSQL_USER=test
- MYSQL_PASSWORD=test
- TZ=Asia/Tokyo
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=test
- PMA_PASSWORD=test
ports:
- 4040:80
volumes:
- ./phpmyadmin/sessions:/sessions
コンテナ起動
下記コマンドでimageの作成とコンテナ作成・起動が行われる。-d
はバックグラウンドで実行するためのオプション。
$ docker-compose up -d
起動が完了するとdocker-compose.yml等と同じ階層にmysqlフォルダが自動作成されている。
なお、起動中のコンテナ一覧は下記コマンドで確認できる。
$ docker ps
-a
オプションを付けてdocker ps -a
とすると、起動していないコンテナも表示される。
ちなみに、今回のようにdocker-compose.ymlに書かれた複数のコンテナを同時に作成・起動する場合はdocker-compose up
を使用するが、単一のコンテナの作成・起動であればrun
コマンドを使用する。そのあたり下記記事様がわかりやすくまとめて下さってます。
動作確認
http://localhost:8080/
にアクセスすると、index.phpの内容が表示されるはず。
http://localhost:4040/
にアクセスすると、phpMyAdminの管理画面が表示されるはず。
コンテナの停止・再開・削除
停止
$ docker-compose stop
再開
$ docker-compose start
削除
$ docker-compose down
なお、downによりコンテナは削除されるがimageが削除される訳ではないので、「stopで停止しstartで再開」でも、「downで削除しupで再作成」でも時間的にはあまり変わらない。
docker-compose.ymlの内容について
長いので上半分のみ。
version: '3'
services:
php:
image: php:7.4.8-apache
volumes:
- ./php.ini:/usr/local/etc/php/php.ini
- ./html:/var/www/html
ports:
- 8080:80
mysql:
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
version:
docker-compose.ymlの書式のバージョン。Docker Desktopがバージョンアップしても古い書式に対応できるように記載する。
services:
ここに「php」や「mysql」などのコンテナ名を書く。
image:
コンテナで使用するDocker Image を指定。
volumes:
少しややこしいので後述します。
ports:
ホストPCのポート番号とDockerコンテナのポート番号を紐づけるための設定。上記phpの設定で言うと8080がホストで80がコンテナのポート番号。
environment:
環境変数の設定。各コンテナに対しての設定を記述する。myaqlの場合ならパスワードやユーザー名などをここで設定している。
volumesについて
volumesでは何を設定する?
ホストPCのディレクトリを、Dockerコンテナのディレクトリにマウントするための設定など。
マウントとは?
機能としてはWindowsのショートカットフォルダ(Macならエイリアス)のイメージに近いと思う。Dockerコンテナ内のディレクトリにホストPC内のディレクトリを紐づけることで、DockerコンテナからホストPCのファイルへアクセスできるようになる。
マウントが必要な理由1:ファイル編集が簡単
例えばindex.phpの内容を編集する場合に、マウントしていればホストPC内のindex.phpを編集するだけでコンテナに自動反映される。
マウントが必要な理由2:データの永続化が出来る
通常、docker-compose down
コマンド等でコンテナを削除すると、当然コンテナ内のデータも消えてしまう。しかしマウントしていればホストPC内にデータが残っているので、コンテナを再作成した際などにそのまま使用できる。
実際にマウントできてるか確認する
今回のphpコンテナ(実際にはphp+appach)の例で言うと、volumesの2行目に./html:/var/www/html
と書かれている。これはホストPCの./html
とコンテナ内の/var/www/html
が対応していることを表している。
なので、docker-compose exec php bash
コマンドでコンテナの中に入ってみると、ホストPCのhtmlフォルダ内のindex.phpと同じものがコンテナ内の/var/www/htmlフォルダ内にあることが確認できる。
参考にさせて頂いた記事様