owned mediaウェブ制作に役立つコンテンツを発信中!

Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#1:Docker環境構築

最終更新日: Update!!
ここ最近はウェブアプリーケーション開発のプロジェクトに参画させていただくことも増えてきており、メインはデザインとフロントエンドになるのですが、バックエンド側も触る機会もたくさんあり、環境構築も含め色々とまとめておきたいと思います。第一回である今回は最初にDockerを使った開発環境の構築からみていきます。   まずは今回の開発環境のファイル・ディレクトリ構成です。ここでは下記の構成を前提に進めていきます。アプリケーション関連はbackendディレクトリに、Docker関連はserverディレクトリに格納しています。backendディレクトリ直下がドキュメントルートになるのですが、Laravelのアプリケーションフォルダと公開用のpublicディレクトリは分けている形になります。serverディレクトリには各種イメージの設定ファイルや、DockerのコマンドをまとめたMakefileなどを入れています。
backend
  ┣ laravel
    ┣ Laravelアプリケーションファイル
    ┗ ....
  ┣ public
    ┣ 静的リソースファイルなど
    ┣ index.php
    ┗ ....
  ┗ index.php
server
  ┣ docker
    ┣ mailer
      ┗ Dockerfile
    ┣ mariadb
      ┣ my.cnf
      ┗ Dockerfile
    ┣ nginx
      ┣ default.conf
      ┗ Dockerfile
    ┣ php
      ┣ .msmtprc
      ┣ php.ini
      ┗ Dockerfile
    ┣ phpmyadmin
      ┗ Dockerfile
  ┣ .env
  ┣ docker-compose.yml
  ┗ Makefile
  それでは、この構成で必要なファイルを作成していきます。    
1. docker-composeファイルと.envファイル作成
最初にプロジェクトごとの環境変数を設定できるよう、.envファイルを作成していきます。ここで設定したプロジェクト名はDockerのイメージやコンテナなどに付与されて、複数のプロジェクトが並行で進められる場合に便利です。 【server/.env】
PROJECT_NAME=プロジェクト名
  次に、docker-compose.ymlファイルを作成します。これはDockerの環境設定を行うもので、イメージのビルドやコンテナ起動などでdocker-composeコマンドを使って実行できるようになります。開発環境を共有する場合には必須となります。 【server/docker-compose.yml】
version: "3.8"
services:
  app:
    build: ./docker/php
    container_name: ${PROJECT_NAME}_app
    image: ${PROJECT_NAME}_app
    volumes:
      - ../backend:/work
      - ./docker/php/.msmtprc:/root/.msmtprc
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
  web:
    build: ./docker/nginx
    container_name: ${PROJECT_NAME}_web
    image: ${PROJECT_NAME}_web
    ports:
      - 8000:80
    volumes:
      - ../backend:/work
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    working_dir: /work
  db:
    build: ./docker/mariadb
    container_name: ${PROJECT_NAME}_db
    image: ${PROJECT_NAME}_db
    ports:
      - 33060:3306
    volumes:
      - db-store:/var/lib/mysql
  smtp:
    build: ./docker/mailer
    container_name: ${PROJECT_NAME}_smtp
    image: ${PROJECT_NAME}_smtp
    ports:
      - 1025:1025
      - 8025:8025
  phpmyadmin:
    build: ./docker/phpmyadmin
    container_name: ${PROJECT_NAME}_phpmyadmin
    image: ${PROJECT_NAME}_phpmyadmin
    ports:
      - 8888:80
    links:
      - db
    volumes:
      db-store:
        name: ${PROJECT_NAME}_db-store
  各種設定の詳細は割愛しますが、イメージやコンテナ名に最初に設定したプロジェクト名の変数を当てています。また、ウェブサーバーのvolumesにbakcendディレクトリを指定することで、Dockerコンテナ内でインストールしたファイルなどがローカル環境に同期するようにしておきます。上記では、ウェブサーバー(nginx)、PHP、データベース(MariaDB)、phpMyAdmin、ウェブメーラーが使えるようにしており、それぞれのポート番号も任意で設定しておきます。    
2. ウェブサーバー用コンテナ作成
では続けてDockerの環境を作成していきます。まずはウェブサーバーのイメージを用意します。server/docker/nginxディレクトリ内にDockerfileを下記の通り作成します。 【server/docker/nginx/Dockerfile】
FROM nginx:1.18-alpine
  あわせてウェブサーバーの設定ファイルも用意しておきます、Dockerのコンテナ内で設定しなくても良いようにローカル側でファイルを作成しコンテナ側と同期されるようにします。こちらはDockerfileと同じ階層に作成します。 【server/docker/nginx/default.conf】
server {
  listen 80;
  server_name example.com;
  root /work;

  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Content-Type-Options "nosniff";

  index index.php;

  charset utf-8;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location = /favicon.ico { access_log off; log_not_found off; }
  location = /robots.txt { access_log off; log_not_found off; }

  error_page 404 /index.php;

  location ~ \.php$ {
    fastcgi_pass app:9000;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
  }

  location ~ /\.(?!well-known).* {
    deny all;
  }
}
  これでDockerのウェブサーバー環境の準備ができました。    
3. アプリケーション用コンテナ作成
続いてDocker側でPHPを使えるようにしていきます。こちらもイメージを指定してビルドされるようにしていきます。ウェブサーバーの時と同様に、server/docker/phpディレクトリ内にDockerfileを下記の通り作成します。 【server/docker/php/Dockerfile】
FROM php:8.1-fpm-buster
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

ENV COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer

COPY --from=composer:1.10 /usr/bin/composer /usr/bin/composer

RUN apt-get update && \
  apt-get -y install git unzip msmtp msmtp-mta libzip-dev libicu-dev libonig-dev && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  docker-php-ext-install intl pdo_mysql zip bcmath

RUN curl -sSLO https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 \
  && chmod +x mhsendmail_linux_amd64 \
  && mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail

COPY ./php.ini /usr/local/etc/php/php.ini

WORKDIR /work
  イメージのインストールと合わせて、Laravelのインストールで必要となる「composer」のインストールや、そのほか必要なモジュールなどもインストールされるようにします。   そして、PHPの設定ができるファイルも用意します。メモリサイズやファイルアップロードの制限など、このファイルで調整できるようにします。 【server/docker/php/php.ini】
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 2000M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8

[Date]
date.timezone = Asia/Tokyo

[mysqlnd]
mysqlnd.collect_memory_statistics = on

[Assertion]
zend.assertions = 1

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = Japanese

[mail function]
sendmail_from = info@example.com
sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=smtp:1025"
  最後にメールサーバーの設定もPHP側で行います。下記のように設定ファイルを同階層に作成します。 【server/docker/php/.msmtprc】
# Set default values for all following accounts.
defaults
auth off
#tls on
#tls_trust_file /etc/ssl/certs/ca-certificates.crt
syslog on
logfile ~/.msmtp.log
aliases /etc/aliases

# mailtrap
account mailhog
host smtp
port 1025
from info@example.com
user username
password password

# Set a default account
account default : mailhog
  PHPのイメージと各種設定が準備完了です。まだまだ続きます。。    
4. データベース用コンテナ作成
次はデータベースを使えるようにしていきます。これまで同様にDockerfileを用意してイメージをビルドできるようにします。この時にデータベースにログインするユーザーやパスワード情報も設定します。後ほどLaravelのインストール時に必要となりますので、合わせて控えておくようにします、この部分はプロジェクトの環境変数として持たせておいてもよさそうですね。 【server/docker/mariadb/Dockerfile】
FROM mariadb:10.7

ENV MYSQL_DATABASE=laravel_local \
  MYSQL_USER=admin \
  MYSQL_PASSWORD=secret \
  MYSQL_ROOT_PASSWORD=secret \
  TZ=Asia/Tokyo

COPY ./my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf
  今回はデータベースサーバーのイメージにMariaDBを使いましたが、プロジェクトによってはMySQLを使うケースも多いかと思います。その際にバージョンによってはM1チップを搭載したMacの環境でエラーが出ることもあるようです。バージョンを変えることで対応できるのですが、MariaDBのイメージを使うことも有効な選択肢になります。   その後はウェブサーバー、PHPと同じくデータベースの設定ファイルも用意します。 【server/docker/mariadb/my.cnf】
[mysqld]
# character set / collation
character_set_server = utf8mb4

# timezone
default-time-zone = SYSTEM

# Error Log
log-error = mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = mysql-general.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
  データベースの方はこれでOKです、この後はブラウザ側でMySQLを操作できるツールやウェブメールのテスト環境を用意していきます。    
5. phpMyAdmin用コンテナ、メールサーバー用コンテナ作成
必須ではないのですが、あればとても便利なので合わせて環境構築しておきます。それぞれイメージをビルドできるように下記の通り、Dockerfileを作成します。 【server/docker/phpmyadmin/Dockerfile】
FROM phpmyadmin/phpmyadmin

ENV PMA_ARBITRARY=1 \
  PMA_HOST=db \
  PMA_USER=root \
  PMA_PASSWORD=secret
  【server/docker/mailer/Dockerfile】
FROM mailhog/mailhog
  今回はそれぞれ、phpMyAdminとmailhogを使いました。MySQLの操作にはクライアントアプリを使ったり、メールサーバーにはテスト用の外部SMTPサーバーを使うこともあるようですが、Docker内で完結する場合にはこういった形で用意しておきます。   これで各種ファイルの準備ができましたので、ここからイメージをビルドしてコンテナを起動するまでを見ていきます。    
6. Dockerのビルド、コンテナ起動
下記コマンドで「docker-compose.yml」を使ったコマンドを実行し、ビルドしていきます。
$ cd server
$ docker-compose up -d --build
  初回ビルド時は時間がかかりますが、問題なく進むと思いますのでしばらく待ちます。コンテナが起動するとローカールサーバーにアクセスして表示チェックを行います。WEBサーバーコンテナのボリュームマウントのディレクトリにHTMLやPHPファイルを作成し確認します。上記環境では、それぞれ下記のポート番号でアクセスできるように設定しています。 (ローカルサーバー)http://localhost:8000/ (phpMyAdmin)http://localhost:8888/ (ウェブメーラー)http://localhost:8025/   表示確認ができれば、合わせて下記コマンドでイメージや起動中のコンテナ一覧などもチェックしておきます。環境変数で指定したプロジェクト名が設定されているとOKです。   ・イメージ一覧
$ docker images

REPOSITORY .......
プロジェクト名_db .......
プロジェクト名_app .......
プロジェクト名_phpmyadmin .......
プロジェクト名_web .......
プロジェクト名_smtp .......
  ・起動中コンテナ一覧
$ docker ps

....... NAMES
....... プロジェクト名_db
....... プロジェクト名_app
....... プロジェクト名_phpmyadmin
....... プロジェクト名_web
....... プロジェクト名_smtp
  ・ボリューム一覧
$ docker volume ls

....... VOLUME NAME
....... プロジェクト名_db-store
 
  これでDockerの環境構築が完了しました。次回記事ではこの環境にLaravelをインストールしてアプリケーションの開発ができるように準備していきます。上記環境では一応バックエンド側の開発環境が整っているので、Laravel以外のPHPフレームワークや、WordPressなどのCMSの開発環境としても使えますので、とても便利ですね。
  • はてなブックマーク
  • Pocket
  • Linkedin
  • Feedly

この記事を書いた人

Twitter

sponserd

    keyword search

    recent posts

    • Twitter
    • Github
    contact usscroll to top
      • Facebook
      • Twitter
      • Github
      • Instagram