今回はLaravelの環境をDockerで作った時に陥りやすいミスを紹介します!
Laravelをインストールして、いつも通りに設定したのに何かうまくコマンドが動かない。
php artisan migrateがなぜかエラーが出る!解決しましょう!!
以下のバージョンでやります。
Laravel 8.x
mysql 8.x
php 8.x
Table of Contents
結論
今回の場合はLaravelの.envの書き方が悪かったのです。
間違えていた.envの書き方↓
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE={データベース名}
DB_USERNAME={データベースユーザ名}
DB_PASSWORD={データベースPW}
修正した.envの書き方↓
DB_CONNECTION=mysql
DB_HOST={container名}
DB_PORT=3306
DB_DATABASE={データベース名}
DB_USERNAME={データベースユーザ名}
DB_PASSWORD={データベースPW}
そう、DB_HOSTにはコンテナ名を書かないといけなかったんですね!
通常のLarvelだと、127.0.0.1(ローカルホスト)とかにローカル環境の時はなると思います。
しかしよく考えたら今回はDockerで環境を作っているので、接続するのはphpのコンテナから、mysqlのコンテナに接続をしないといけないわけですね….
そりゃそうだ。
ではもう少し詳しくどんな環境で作ったのか紹介しましょう。
Dockerの準備
まずdocker_compose.yaml
version: "3.8" #yamlのバージョン 2021/10/12 時点最新 https://docs.docker.com/compose/compose-file/
services:
php:
container_name: test_code_php #container名の指定
#image: {image名} 今回はbuildがあるのでコメントアウト
build: ./docker/php #Dockerfileのあるディレクトリのpathを指定
tty: true #docker-compose upでコンテナを起動させた時に、コンテナを起動させ続ける
networks: #サービスごとにどのネットワークに接続するのかを指定
- default #docker network lsで確認可能
ports:
- ${MY_IP}:${WEB_PORT}:80 #ホストIP:ホスト:コンテナ ${WEB_PORT}のポートがきたら、80のポートを使う
volumes: #pathをvolumeとしてマウントする。
- ${PROJECT_PATH_HOST}:/var/www/html
mysql:
container_name: test_code_mysql
#image:
build: ./docker/mysql
tty: true
expose: #マシン上にポートを露出するが公開はされない。リンクされたサービスのみアクセスができる
- "3306" #mysqlにアクセスが可能
volumes:
- ./DBdata:/var/lib/mysql
- ./conf/mysql/my.cnf:/etc/mysql/conf.d/my.cnf #my.cnfにmysqlの設定ファイルを書いてマウントする
environment: #環境変数の追加
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DB_NAME}
MYSQL_USER: ${MYSQL_USER_NAME}
Code language: PHP (php)
docker-compose.yamlで変数を読んでいたので、.envに書き込みます。
PROJECT_PATH_HOST=./html
MY_IP=127.0.0.1
WEB_PORT=80
MYSQL_PASSWORD=test123
MYSQL_DB_NAME=test_code
MYSQL_USER_NAME=root
そしてDockerfileも書いていきます。
mysqlのDockerfile
FROM mysql:8.0.26
Code language: CSS (css)
phpのDockerfile
今回のプロジェクト名はlaravel_test_codeです。
FROM php:8.0-apache-buster
RUN apt-get update
# composerのインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer
# other tools install
RUN apt-get install -y vim \
&& apt-get install -y \
git \
unzip
# ドキュメントルートをpublic配下に指定
ENV APACHE_DOCUMENT_ROOT /var/www/html/laravel_test_code/public
ENV APACHE_DOCUMENT_ROOT /var/www/html/laravel_test_code/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
# ドライバのインストール
RUN docker-php-ext-install pdo_mysql mysqli
## mod_rewriteを有効化する
RUN cd /etc/apache2/mods-enabled \
&& ln -s ../mods-available/rewrite.load
Code language: PHP (php)
いい感じですね。
それでは作業進めていきましょう!
各自必要な形でファイルの中身を修正してください。
- docker/php/Dockerfile のプロジェクト名を修正
- docker-compose.yamlのcontainer_nameを指定
- .envファイルの修正
- laravelの.envの修正(インストール後)
環境作成
では準備ができたので、コマンドを叩いていきましょう。
docker-compose build
docker-compose up
#コンテナにログイン
docker exec -it test_code_php bash
#Laravelのインストール(初期操作以外は必要無し)
composer create-project laravel/laravel laravel_test_code "8.*"
#このままだとアクセスできないので権限を変更
chmod 777 -R storage/
Code language: PHP (php)
はい!ここでphp artisan migrateをするとエラーになるはず!
しっかりlaravelの.envを書いていきましょう!
大体必要なところは以下だと思います。
APP_NAME={プロジェクト名}
DB_CONNECTION=mysql
DB_HOST={コンテナ名}
DB_DATABASE={DB名}
DB_USERNAME={ユーザ名}
DB_PASSWORD={パスワード名}
大体docker-compose.yamlファイルで定義したところだと思います!
では、ログインしてmigrationしてみます。
docker exec -it {コンテナ名} bash
cd {プロジェクト名}
php artisan migrate
ほい!これで良い感じかと思います!
なれたらすぐにできるかと思います!
まとめ
過去にエラーあったけど何が問題だったかわからない。
なにかあったけどなあ….
あるあるだと思います。
そんな時はエラーメモでも作ってみましょう。