Docker上にLaravel環境構築
普段はJavaとSpringBootで開発しているのですが、PHPカンファレンス2021にスタッフ参加したことでモチベーションがあがりLaravelでなにか作りたいなと思い、環境構築しました。
数年前にPHP開発をしたこともありましたが、Vagrantを利用した環境だったので昨今の当たり前環境を学ぼうという魂胆もあります。
以下の環境を作ろうと思います。
図らずともバージョンは8で統一されましたw
ディレクトリ構成
以下の構成としました。多分よくある構成かと思われます。
server
にはLaravelのソースが入る形となります。
root ├ docker-compose.yml ├ docker │ ├ php │ │ ├ php.ini │ │ └ Dockerfile │ ├ db │ │ ├ data │ │ ├ logs │ │ ├ sql │ │ └ my.cnf │ └ nginx │ └ default.conf └ server
docker-compose
詳しい解説はしませんが、PHP・Nginx・DBの3つのコンテナを立ち上げます。
version: '3' services: php: container_name: php build: ./docker/php volumes: - ./server:/var/www depends_on: - db nginx: image: nginx container_name: nginx ports: - 80:80 volumes: - ./server:/var/www - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php db: image: mysql:8.0.26 container_name: db environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: database MYSQL_USER: docker MYSQL_PASSWORD: docker TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: - ./docker/db/data:/var/lib/mysql - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf - ./docker/db/logs:/var/log/mysql - ./docker/db/sql:/docker-entrypoint-initdb.d ports: - 3306:3306
PHP
PHPのコンテナにはcomposerを入れたりaptでモジュールを入れたりする必要があるのでDockerfileを用意します。
aptで入れているモジュールやdocker-php-ext-installはよくわからんので個別に調べないとだな。。。
FROM php:8.0-fpm COPY php.ini /usr/local/etc/php/ RUN apt-get update \ && apt-get upgrade -y \ && apt-get install -y libicu-dev libzip-dev libonig-dev libssl-dev zip unzip \ && docker-php-ext-install zip pdo_mysql \ && pecl install xdebug \ && docker-php-ext-enable xdebug COPY --from=composer /usr/bin/composer /usr/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"
続いてphp.iniです。これも特段説明することはないのですが、xdebugを入れています。今後はIntellij IDEA(PHPStorm)を使った開発を想定しているのでデバッグできるように入れています。
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" [xdebug] xdebug.client_host = host.docker.internal xdebug.client_port = 9003 xdebug.idekey = PHPSTORM xdebug.mode = debug xdebug.start_with_request = yes
Nginx
Nginxの設定ファイルです。今まではApacheでPHPを動かしていたので実はNginxは初めてです。。触ってみたいと思っていたのでNginxにしています。なのであまり説明できません、ごめんなさい。。。
ただ、ポイントとするとnginxコンテナのルートがserverになっているのでnginxのルートが /var/www/public
=プロジェクトルート/server/public
ということです。
server { listen 80; index index.php index.html; root /var/www/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
MySQL
MySQLのデータを永続化するためにホストマシンに保持する形としています。sqlフォルダにDDLを配置しておけば起動時にテーブルを作ることも可能です。このあとTODOアプリを作ろうと思うのでDDLはこちらに配置することになります。
my.confもよくある設定だと思いますが、文字コード・ログ、スロークエリの出力についての設定です。
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-authentication-plugin = mysql_native_password log-error = /var/log/mysql/mysql-error.log slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 5.0 log_queries_not_using_indexes = 0 general_log = 1 general_log_file = /var/log/mysql/mysql-query.log [client] default-character-set=utf8mb4
プロジェクトの作成
Docker環境については以上でアプリケーションLaravelのプロジェクトを作っていきます。
コンテナを起動し、PHPコンテナでコマンドを実行します。
$ docker-compose up -d --build $ docker-compose exec php bash root@aafbcadd9d34:/var/www# composer create-project --prefer-dist laravel/laravel ./
しばらく待つと、serverディレクトが作られLaravelの各種ファイルが配置されます。
初期画面
ブラウザから http://localhost にアクセスするとLaravelの画面が表示されると思います。
昔の画面と違うんですね。もっとでかいLaravelって文字が真ん中にあった気がします。
まとめ
今回は初期画面が表示されるまでの環境構築になります。Dockerのおかげで非常にかんたんに構築することができますね。
次回以降はxdebugやRestAPIを作るところをやっていければと思います。
今回作った環境はGitHubにもアップしているので興味があれば参照してみてください。