🚴‍♂️

DevContainerで作るLaravel環境

2024/03/28に公開

概要

4月から新たな場で働くことになりLaravelを使うことになりました。
そこで環境作りをどのようにしようかなと考えていたら知り合いのエンジニアから
「DevContainerはいいぞ」というアドバイスをいただいたのでいざ使ってみたよって記事です。

注意

DevContainerとは?

開発環境をコンテナ化することで、
ローカル環境は汚染されないし開発PCが増えても構築が容易にできるといったものです。
https://code.visualstudio.com/docs/devcontainers/containers

僕は前までVue3を使っていたのでローカルのVSCodeはVue3の拡張機能を入れていました。
だけど今回PHPを開発することになり、環境を作る際にごちゃごちゃするのは嫌だなぁって理由で利用しました。
後単純にパソコンを2台持っているので開発環境を同期できるのはまーじで楽です。

導入手順

前提

・Docker/docker-composeが利用できる
・VSCodeが利用できる

ディレクトリ構成

|-- .devcontainer(devcontainer.json)
|-- docker -- php(Dockerfile/php.ini)
|      |----- nginx(default.conf)
|-- src
|-- .git(ディレクトリ全体をリポジトリとして想定)
docker-compose.yml

1.docker-compose.ymlを作成

自分はdocker-composeを使って複数のコンテナを作り、
その内の1つをDevContainer環境として使うことにしました。

まず初めに任意のディレクトリ配下に「docker-compose.yml」を作成します。

docker-compose.yml
version: '3'
services:
  nginx:
    image: nginx:1.25.4
    ports:
      - 8000:80
    volumes:
      - ./src:/var/www/src
      - ./docker/nginx:/etc/nginx/conf.d
    depends_on:
      - app
  app:
    build: 
      context: ./docker/php
      dockerfile: Dockerfile
    volumes:
      - ./:/var/www

今回はnginx用のコンテナとapp(php)コンテナを用意しました。
また必要に応じてDBコンテナを増やしたりもできます。

DockerFile
DockerFile
# イメージを取得
FROM php:8.2-fpm

# VITEのためにポートの穴あけ
EXPOSE 5173

# 独自のphp.iniファイル(PHPの設定ファイル)を 
# コンテナ内の/usr/local/etc/php/ディレクトリにコピー
COPY php.ini /usr/local/etc/php/

# パッケージやPHPの拡張モジュールをインストールするコマンド を実行
RUN apt-get update && apt-get install -y \
	git \
	curl \
	zip \
	unzip \
    && docker-php-ext-install pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"

RUN apt-get install -y nodejs npm && npm install n -g
php.ini
php.ini
[PHP]
post_max_size = 100M
upload_max_filesize = 100M
variables_order = EGPCS
default.conf
default.conf
server {
  listen 80;
  # ドキュメントルートを設定
  root /var/www/src;
  # インデックスファイルを設定
  index index.php;

  location / {
    root /var/www/src;
    index index.php;
    try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    fastcgi_param HTTP_PROXY "";
    fastcgi_pass app:9000; 
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

基本は下記記事を参考に作りました。ありがとうございます!
https://qiita.com/shikuno_dev/items/f236c8280bb745dd6fb4

2.必要な拡張機能をインストールする

下記2つの拡張機能をインストールしてください。
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

3.devcontainerに必要なファイルを用意する

docker-compose.ymlを用意したディレクトリをVSCodeで開き、
「.devcontainer」というディレクトリを作成します。その後、「devcontainer.json」を作成します。

devcontainer.json
{
    "name": "laravel-app",
    // ターゲットのdocker-compose.ymlファイル
    "dockerComposeFile":"../docker-compose.yml",
    // 開発環境のコンテナ
    "service": "app",
    // コンテナ作成時に開くフォルダ
    "workspaceFolder": "/var/www"
}

ポイントは2点あります。
1点目は「service」に紐づく値です。この値はdocker-composeで記述したいずれかのコンテナ名に
する必要があります。今回はappなのでappコンテナ内で開発環境を作成しますが、
nginxにするとnginxコンテナ内で作業することになります。

2点目は「workspaceFolder」です。そのままですが記述したパスで作業することになります。
例えばこのパスを「/var」に変えると、VSCodeのフォルダがvarから見た表示になります。

4.DevContainerを起動(reOpenする)

画面左下にある緑の「><」マークをクリックし、「ReOpen in Container」をクリックします。
すると画面が暗転しコンテナ内に接続します。
成功するとフォルダが「var/www」配下になり作業をすることができます。

失敗するとエラーログが表示されます。僕は大体Dockerのファイル共有の項目に引っかかっていました。
DockerDesktopの場合「Settings > Resources > File sharing」に
エラーとなったパスを追加し再度挑戦すると成功しました。

使い方&気づき

DevContainerの使い方

正直僕はDockerFileやconfigファイルといった設定に関するファイルの書き方が全然分かりません!
例に漏れずdevcontainer.jsonも沢山Keyがあってよく分かりませんが、便利な書き方があります。

例えば拡張機能を追加する際は「歯車マーク > Add to devcontainer.json」をクリックするだけで
勝手に記述してくれます。

同じようにSettingもできるかなと思いましたが、こちらはadd to jsonしかありませんでした。
が、これだけやってくれたら十分です。

Laravel環境の作り方

Composer自体はDockerFileでインストールできているはずなので、
リモート接続後にLaravelプロジェクトをインストールしましょう!

なおプロジェクト名は今回だと「src」にすることでいい感じにマウントされます。

Githubとの連携

今回コンテナにマウントする際、
敢えてdocker-compose.ymlなどの設定ファイルやdevcontainer.jsonを加えています。

狙いとしては下記になります。

ソース全体をGithubのリポジトリにする
↓
git Cloneした時にワンポチで環境構築できる
(また、リモート接続した際に同じディレクトリ構成にすることにより随時Pushできる!)

なお僕がハマったこととしてリモート接続をするとGithubの連携ができず、Source Controlの表示が
「Initialize Repository」となってしまうことがありました。

原因としては当初はボリュームのマウントを個別に設定していたことにより
「.git」ディレクトリがマウントされていなかったからでした。

結局「.git」ディレクトリをマウントすることできちんと同期が取れるようにはなったのですが、
そもそも自分の運用方法が正しいのか・・・?もっといい方法があるんじゃないの?と思ってたりします。
もし良い方法があればご教授いただければ幸いです。

なおこの記事を書いている最中に下記の記事を読んでいたのですが、
あくまでもローカルのGitの設定だけええ感じにするだけで、
ディレクトリの管理は逐次管理しろよー!ってことな気がしてきましたw
https://qiita.com/yuriacats/items/c9e1b25172e70e220ea1

リモート接続したらユーザーが変わり逐次設定する必要があるから、
その設定をローカルと同期するよ!という意味でしょうか。
自分のGitに対する知識がまだまだだなと感じた瞬間でした。

Discussion