前回の記事では、Dockerfile
と各種コンテナの設定ファイルを記述しました。
今回の記事では、docker-compose
について学んでいきます。
意外と難しくはないので頑張っていきましょう。
前回作成したディレクトリと、その中に入っているファイルは以下の通りでした。
practice
docker
app
Dockerfile
php.ini
db
Dockerfile
my.cnf
web
Dockerfile
default.conf
app
,db
,web
それぞれのdockerイメージであるDockerfile
を作成しました。
ちなみに、ディレクトリを3つに分けているのは、web3層アーキテクチャの構造をわかりやすくしているからです。
web3層アーキテクチャについては、以下の記事に詳しく書かれているので、ご覧ください
Docker Composeとは
この3つのコンテナが存在しています。
app
,web
,db
の3つがコンテナがあります。その複数のコンテナを1つ1つ起動するとめんどくさいですよね。
この複数のコンテナを一括管理できるのが、Docker Compose
です
業務では複数のサーバが互いに連携していますから、これは便利です。
そう考えると、こちらのDocker Compose
のアイコンは意味が出てきますよね。
タコの足に乗ってるのがコンテナで、それを足でオペレーティングしているイメージですね。
このDocker Compose
に関する設定などを記述するファイルをdocker-compose.yml
と言います。
このファイルは、プロジェクト直下に作成してください。
practice
docker
app
Dockerfile
php.ini
db
Dockerfile
web
Dockerfile
default.conf
docker-compose.yml
そしてそのdocker-compose.yml
に以下のコードを記述します。
version: "3.9"
services:
app:
build:
context: .
dockerfile: ./docker/app/Dockerfile
volumes:
- ./src/:/app
web:
build:
context: .
dockerfile: ./docker/web/Dockerfile
ports:
- 8080:80
depends_on:
- app
- db
volumes:
- ./src/:/app
db:
platform: linux/x86_64
build:
context: .
dockerfile: ./docker/db/Dockerfile
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel_db
TZ: 'Asia/Tokyo'
volumes:
- /var/lib/docker/volumes/
mailhog:
image: mailhog/mailhog
ports:
- target: 8025
published: ${MAILHOG_PUBLISHED_PORT:-8025}
protocol: tcp
mode: host
volumes:
mysql-volume:
面食らうかもしれませんが、1個1個解説していきます
まず、1番上でバージョン指定をしていることがわかると思います。
services
services
を定義して、その1つ下げたインデントに、app
,web
,db
,mailhog
があります。
このように表現することで今回使用するサービス(コンテナとも言える)がこの4つであることを表現しています。
ちなみにこのファイルは、YAML
ファイルなので、インデントを使った階層構造で内容を表現します。
build
これはビルドするファイルの位置を指定しています。ここでは相対パスを指定します。
context
公式ドキュメントによると、以下のように書かれています。
docker buildコマンドを実行したときの、カレントなワーキングディレクトリのことを ビルドコンテキスト(build context)と呼びます。 デフォルトで Dockerfile は、カレントなワーキングディレクトリにあるものとみなされます。 ただしファイルフラグ(-f)を使って別のディレクトリとすることもできます。 Dockerfileが実際にどこにあったとしても、カレントディレクトリ配下にあるファイルやディレクトリの内容がすべて、ビルドコンテキストとして Docker デーモンに送られることになります。
長々書いてありますが、要約すれば、docker buildコマンドを実行する場所ですね。
このコマンドは必須コマンドです
このcontext
コマンドを使うことで、ビルドを実施する場所を指定しています。
volumes
ボリュームとは、データを永続化するたに利用する仕組みのことを言います。
もし、誤ってコンテナを削除してしまった時、DBの情報などが消えたらヤバいですよね。
それを防ぐために、このvolumes
が活躍してくれます。
仕組みとしては以下のようになっています。
1. Dockerが元々用意してくれている「データ領域」という仕組みを利用する
2. 指定されたボリューム名のデータ領域をコンテナ側にマウントします。
この2つの仕組みを使うことで、データが永続化されます。
実際に、データ領域を見てみましょう
docker volume ls
DRIVER VOLUME NAME
local 1b221b5b808ftbe15718ed4f46713519e2b495b4764c97ebd1bfd7bbdee03823
local 02b4c4cf95faeb2cdc5678b795d2b44beb8b1d8243181bc0c355eac2e3a29a8f
.
.
.
このように表示されている部分がデータ領域です。
OSをlinux
に指定しているなら、/var/lib/docker/volumes/
に指定してください。
今回はcentOSを指定してるので、/var/lib/docker/volumes/
に指定します。
docker-compose.yml
は以上です。
ビルド
ここからビルドしていきます。
ビルドとは、コンパイルされたものを元に、実行可能ファイルやパッケージを作成する処理や操作のことを言います。
今回は、これまで作成したDockerfile
やdocker-compose.yml
をビルドします。
docker-compose.yml
でDockerfile
を参照しているので、docker-compose.yml
をビルドしていけば、自動的にDockerfile
もビルドされます
このコマンドをターミナル上で打ってみてください。
docker compose build
少し時間がかかるので待っててくださいね。
無事成功したらビルドはOKです。
実際にLaravelのプロジェクトを作成する
ビルドが完成したら以下のコマンドをターミナルで叩いてください。
docker compose up
このコマンドは、コンテナを作成してスタートをするためのコマンドです。
無事立ち上がりました。
次に、以下のコマンドを叩いてください
docker compose exec app bash
このコマンドは、アプリケーションコンテナに入ります。
入れたらここにLaravel
プロジェクトを作成します
laravel new (好きなプロジェクト名を入力してください)
これができたら、
http://localhost:8081/
に遷移してみてください。
これでLaravelプロジェクトが完成していたらOKです
Docker
でLaravel
プロジェクトを作成することができました!
お疲れ様でした!