🐳

Docker上でLaravelのプロジェクトを作成するまで 後半

2023/02/07に公開

2022年8月から株式会社アルゴリズムのインターン生としてお世話になっている石田佳介です。

前回の記事の内容を覚えているでしょうか?

まだ見てない方はこちらの記事からご覧ください

前回の記事では、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は以上です。

ビルド

ここからビルドしていきます。
ビルドとは、コンパイルされたものを元に、実行可能ファイルやパッケージを作成する処理や操作のことを言います。
今回は、これまで作成したDockerfiledocker-compose.ymlをビルドします。
docker-compose.ymlDockerfileを参照しているので、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です

DockerLaravelプロジェクトを作成することができました!
お疲れ様でした!

Algorithm's Tech Blog

Discussion