Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#1:Docker環境構築
最終更新日: Update!!
ここ最近はウェブアプリーケーション開発のプロジェクトに参画させていただくことも増えてきており、メインはデザインとフロントエンドになるのですが、バックエンド側も触る機会もたくさんあり、環境構築も含め色々とまとめておきたいと思います。第一回である今回は最初にDockerを使った開発環境の構築からみていきます。
まずは今回の開発環境のファイル・ディレクトリ構成です。ここでは下記の構成を前提に進めていきます。アプリケーション関連はbackendディレクトリに、Docker関連はserverディレクトリに格納しています。backendディレクトリ直下がドキュメントルートになるのですが、Laravelのアプリケーションフォルダと公開用のpublicディレクトリは分けている形になります。serverディレクトリには各種イメージの設定ファイルや、DockerのコマンドをまとめたMakefileなどを入れています。
これでDockerの環境構築が完了しました。次回記事ではこの環境にLaravelをインストールしてアプリケーションの開発ができるように準備していきます。上記環境では一応バックエンド側の開発環境が整っているので、Laravel以外のPHPフレームワークや、WordPressなどのCMSの開発環境としても使えますので、とても便利ですね。
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 : mailhogPHPのイメージと各種設定が準備完了です。まだまだ続きます。。
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の開発環境としても使えますので、とても便利ですね。
sponserd
keyword search
recent posts
- Shopifyでのテーマ開発に便利なローカル環境を構築する#2:Shopify CLI
Shopifyでのテーマ開発に便利なローカル環境を構築する#2:Shopify CLI
- Shopifyでのテーマ開発に便利なローカル環境を構築する#1:Shopify Theme Kit
Shopifyでのテーマ開発に便利なローカル環境を構築する#1:Shopify Theme Kit
- Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#7:動的ルーティングとデータベース更新処理
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#7:動的ルーティングとデータベース更新処理
- Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#6:ミドルウェアの設定と認証ページ作成
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#6:ミドルウェアの設定と認証ページ作成
- Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#5:ログイン認証機能の実装
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#5:ログイン認証機能の実装
- Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#4:ログイン認証ユーザー作成
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#4:ログイン認証ユーザー作成
- Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#3:静的ページの作成とルーティング
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#3:静的ページの作成とルーティング
- Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#2:Laravelのインストール
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#2:Laravelのインストール
categories