DockerでLaravel8(PHP7.4, Nginx, MySQL5.7)の最低限の環境構築
こちらを参考にさせていただきました。
Docker環境
ディレクトリ構成
project
┣ docker
┃ ┣ db
┃ ┣ nginx
┃ ┗ php
┣ server
┗docker-compose.yml
serverにlaravelプロジェクトが入る想定です。
各種ファイル作成
docker-compose.yml
version: '3' services: php: container_name: php build: ./docker/php volumes: - ./server:/var/www/html nginx: image: nginx container_name: nginx ports: - 50080:80 volumes: - ./server:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php db: image: mysql:5.7 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/sql:/docker-entrypoint-initdb.d ports: - 53306:3306
ポートが絶対に被らないよう
nginx -> 50080
mysql -> 53306
に変更しています。
/nginx/default.conf
server { listen 80; index index.php index.html; root /var/www/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; fastcgi_param PATH_INFO $fastcgi_path_info; } }
php/Dockerfile
FROM php:7.4-fpm COPY php.ini /usr/local/etc/php/ #Composer install RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer RUN apt-get update \ && apt-get install -y \ git \ zip \ unzip \ vim RUN apt-get update \ && docker-php-ext-install pdo_mysql ENV COMPOSER_ALLOW_SUPERUSER 1 ENV COMPOSER_HOME /composer ENV PATH $PATH:/composer/vendor/bin WORKDIR /var/www RUN composer global require "laravel/installer"
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese"
コンテナ起動
$ docker-compose up -d
mysqlが起動失敗したので、エラーを確認
$ docker-compose up
バックグラウンド起動を辞めると、途中のエラーが分かります。
エラー内容
Operating system error number 22 in a file operation.
ぐぐったところ
docker-compose.ymlに
db: image: mysql:5.7 ...中略 command: --innodb-use-native-aio=0 #この1行追加
でOKそうです。
一度dbディレクトリのデータを削除し、再度コンテナ起動
$ docker-compose up -d Starting php ... done Starting db-host ... done Starting nginx ... done
無事起動完了
Laravelプロジェクト作成
作業コンテナに入る
$ docker-compose exec php bash /var/www# composer create-project --prefer-dist laravel/laravel .
しばらく待ちます。
Package manifest generated successfully. 73 packages you are using are looking for funding. Use the `composer fund` command to find out more! > @php artisan key:generate --ansi Application key set successfully.
成功文が出たら
http://localhost:50080にアクセス
Laravelのトップ画面が表示されればOK
DB作成
一度コンテナから出て、DBコンテナに接続します。
$ docker-compose exec db bash
コンテナ
/# mysql -u root -p // docker-compose.ymlのMYSQL_ROOT_PASSWORD Enter password: root // データベース作成 mysql> create database laravel; mysql> quit; /# exit;
次にLaravel側の設定をします。
.env
DB_CONNECTION=mysql # DB_HOST=127.0.0.1 DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel # さっき作ったDB名 DB_USERNAME=root DB_PASSWORD=root
設定出来たら再びPHPコンテナへ
$ docker-compose exec php bash /var/www# cd html /var/www/html# php artisan migrate
無事マイグレーションが完了すればOK
まとめ
Laradock使ってて、重いし謎のエラー出るしで嫌になったので
今後はこの最小構成をベースにLaravel触っていきたい。