【Laravel】Docker for WindowsでLaradock(+MySQL)に挑戦してみた。【備忘録】

はじめに

追記:あまりにもわかりにくい記事だったので改めて作りなおしました。この記事は個人的な備忘録とします。以下を参考にしていただければ幸いです。

【Laravel】Docker for WindowsでLaradock(+MySQL)の環境構築

Docker for WindowsでLaradockの環境構築をして、Webアプリが作れるところまで記載しております。

DBに関してはMySQLでphpmyadminも利用できるようにしています。

※まだできていませんが、PostgreSQLでの環境構築の格闘記録はこちらにあります。

【Laravel】Docker for WindowsでLaradock(+PostgreSQL)に挑戦してみた。

※僕の備忘録でもあり、構築できるようになるまでにかなり苦労したのでとても長文です。かなりのエラーを潰してきたので、部分部分かいつまんで参考にしていただければと思います。どなたかの参考になれば幸いです。※

参考記事

Windows10でLaradockを使ってLaravel 5.5環境を作る
https://qiita.com/sket88/items/4de708ce394179c61d8a

DockerでMySQL複数バージョンを共存させる
https://qiita.com/tanakaworld/items/427b94ea0435b5dccfa2

LaradockのMySQLに接続できなくてはまった話
https://qiita.com/dnrsm/items/4bd078c17bb0d6888647

laradockの環境設定からMySQL接続まで
https://qiita.com/yknsmullan/items/dea4102cf14b1b66e5af

docker起動でportが確保できないエラーの解決
https://nijoen.net/blog/773/

Dockerでコンテナの停止・削除ができなくなった時の対処法
https://qiita.com/musatarosu/items/31d6293a93e75ca6073e

docker docker-compose コマンド
https://qiita.com/souichirou/items/6e701f6469822a641bdd

参考書籍

環境構築

(Dockerのインストールは、書籍を参考にインストール)

フォルダ作成。

$ mkdir laravel_app 
$ cd laravel_app

git cloneコマンドでLaradockのダウンロード後、.envファイルの作成

$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env

.envファイルを編集(※MySQLのバージョンが8.0以上になっているとセキュリティの関係でDockerがうまく動作しないらしい)

MYSQL_VERSION=5.7
APP_CODE_PATH_HOST=../laravel-practice/ //後でインストールするlaravelの名前

コンテナの初期化(実行コマンド※Dockerアプリは起動した状態※)

$ docker-compose up -d nginx mysql workspace phpmyadmin

ここでエラー発生。

どうやら3306ポートが使えないらしい。.envファイル上で3306と記載の部分を3307に変更して再度compose upするも同様のエラー。(追記:XAMPPを起動していたのを見落としていました。それが原因。)

XAMPPでも3307のポートを使用しているので、念のためその後ポートは3306に戻す。

ためしに以下のコマンドで起動してみる。

docker-compose up

バカみたいに時間がかかったのでctrl+cで離脱。

docker-compose up -d nginx mysql

上記と同様(3306ポートが使えない。)のエラーが発生。

一応下記のコマンドでstatusがupになっていれば起動しているらしい。

$ docker ps

どうやらnginx,php-fpm,workspace,docker:dindは起動してる。記載のないphpmyadminとmysqlが起動していない。

$ docker-compose exec --user=laradock workspace bash
laradock@0b80605539aa:/var/www$

ただnginxとworkspaceは起動しているのでとりあえずログインを試みたところログインはできた。

composer create-project laravel/laravel laravel-practice --prefer-dist "5.5.*"

さらにLaravelプロフェクトの作成を試みる。下記ディレクトリに作成されていることを確認。
(ここで最低限、Docker自体は起動していることは確認。MySQLのエラー解決に関しては後述。)

exitでコンテナからログアウト。.envファイル(laradock側の共有ディレクトリ)に以下を追記。

DB_HOST=mysql

サービスの終了

docker-compose stop

再起動

docker-compose up -d nginx mysql workspace phpmyadmin

やはり3306ポートエラーになる。

XAMPPを終了して3307に変更して再起動。(ここでXAMPPを切り忘れていたことに気付く。)

mysqlが起動した!!どうやらXAMPPと干渉しあってたっぽい。。。(3306はなんなんだ。。。)

Dockerを使う際はXAMPPを停止しましょう。

ただphpmyadminはエラーで起動できていないので、laravel-practiceの.envファイルを編集して再起動。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

⇓以下のように編集

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3307
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

再起動してみてもphpmyadminのエラーは変わらず。

ダメもとでコンテナにログインしてmigrateしたところ下記のようなエラー。
そもそもartisanコマンドすら利かないことが判明。。。

$ docker-compose exec --user=laradock workspace bash
laradock@0b80605539aa:/var/www$ php artisan migrate
Could not open input file: artisan

localhostへアクセスしてもnot found。hostsファイルやらDockerの初期設定にも間違いがあるかもしれない。

戦いは続く…

再挑戦編

phpmyadminとの格闘

PCを再起動してからDockerを再起動してみる。

phpmyadminは変わらず起動しない。
※0.0.0.0:8080のバインドに失敗しました:ポートは既に割り当てられています

netstat -ano | find ":8080"
find: ‘:8080’: No such file or directory

このコマンドでポートで何が使用されているかわかるらしいが何も反応せず。。。

docker ps -a

調べると以前のプロセスもこのコマンドでチェックできるとのことで実行。

7 weeks agoとめちゃくちゃ怪しいログを発見。

docker rm `docker ps -a -q`

こちらで停止できるとのことだが
Error response from daemon: You cannot remove a running container
(デーモン(メモリ上の常駐ソフトウェア)からのエラー応答:実行中のコンテナを削除できません)

終了できそうなコマンドを一通り入力。

docker-compose kill
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

再起動するも変わらないので、まだ削除されていないコンテナがあるっぽい。。。

docker ps //起動中のコンテナを表示。
docker rm --force <コンテナID> //指定のコンテナを強制終了

見つけたコンテナを強制終了して再起動するもport被りの状況は変わらず。。。

docker-compose up -d

ためしに上記コマンド。(鬼時間かかる。。。おそらく3時間くらい待った。)長すぎるので割愛。最後の文が赤字の時点でアウト。。。

以下の通り何も表示されない。待った意味。。。一旦ステイ。。。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

MySQLとの格闘

たまたまこんなものを見つける。(いつ入れたのか全く覚えていない。これが干渉している??)

見つけた。どうやらLaravelを学習する際に入れた模様。

一応MAMPインストールした過去があったのでこちらの共存も気になったが、起動してなければ特にコンフリクト(衝突)することはないそうなので追求せず。

とりあえずこいつを停止してみた。

おそらくこいつのせいでXAMPPのポートも3306で起動できず、3307に変更せざるを得なかったんだなと気づく。

とりあえず3306にDocker内のファイルを変更してみる。mysqlは3306でも起動するようになった!!

残る問題はphpmyadminとartisanコマンドの実行だ。。。

artisanコマンドとの格闘

laradock@48ebb9bcd534:/var/www$ php artisan serve
Could not open input file: artisan
$ cd laravel-practice
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>

ディレクトリが違うだけだった。。。

が、http://127.0.0.1:8000にアクセスしてもエラー。

コンテナからexitしてもしやと思いコンテナに入らずにアクセス。

表示された。(これであってるのか。。。??) 追記:コンテナで環境構築してるのでartisan serveは不要なのを後に知る。

ためしにdockerを終了してからアクセスしたところ表示されないので合ってるっぽい。とりあえず構築成功??

マイグレートも失敗。これはテーブル作成などもしてないからなんとなく理解できる。

php artisan migrate

phpmyadminとの格闘②

docker-compose.ymlのphpmyadminのポート番号を8081に変更。

//ポートのみ変更した場合
phpmyadmin:
      build: ./phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - MYSQL_USER=root
        - MYSQL_PASSWORD=password
        - MYSQL_ROOT_PASSWORD=password
    ports:
    - 8081:80

//サーバ名を調べるのに試行錯誤したパターン。※ログインエラー。
mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=DB
        - MYSQL_HOST=DB
        - MYSQL_USER=root
        - MYSQL_PASSWORD=password
        - MYSQL_ROOT_PASSWORD=password
        - TZ=${WORKSPACE_TIMEZONE}

phpmyadmin:
      build: ./phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - PMA_HOST=mysql
        - PMA_USER=root
        - PMA_PASSWORD=password
      ports:
        - 8081:80

全てきれいにdoneになった。泣 (そして一体8080ポートは何に使用しているんだろうか。。。)

http://localhost:8081でphpmyadminへアクセス。

サーバ名。。。わからずログインできず。。。

(その後かなり格闘した末。。。)laravel-practiceの.envに従い入力したところログインに成功。
サーバ:mysql
ユーザー:default
パスワード:secret

以下参照

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3307
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

喜びも束の間。データベースを作成する特権がありません。と表示。

.envファイルにこんな記載があるのを思い出す。ユーザーrootでパスワードrootを入力したところログイン。編集もできた◎

MYSQL_ROOT_PASSWORD=root
mysql -u root -p root //こちらからもアクセス可能
create database default; //DB作成

ところがコンテナ内でmigrateはできず。。。

次はちゃんと教材見ながらトライしてみよう。。。挑戦はまだまだ続く。。。

日を改め再チャレンジ

PostgreSQLでサイトの表示まではできたので、再度チャレンジ。(以下参考。)

【Laravel】Docker for WindowsでLaradock(+PostgreSQL)に挑戦してみた。

compose upの前に.envファイルを編集。

APP_CODE_PATH_HOST=../laravel #laravelのプロジェクトファイル名に書き換え
DATA_PATH_HOST=../data #複数データを参照してしまう可能性があるため
COMPOSE_PROJECT_NAME=docker_mysql #dockerのコンテナ名を変更
MYSQL_VERSION=5.7 #latestから変更
DB_HOST=mysql #追記

さらにdocker-compose.ymlのphpmyadminのポート番号を8081に変更。(MySQL Notifierも毎回起動するので停止させておく。)

コマンド実行。もはや1つもdoneされない状況に。。。泣 前は表示されなかったのに。

$ docker-compose up -d nginx mysql workspace phpmyadmin

【ERROR: Service ‘php-fpm’ failed to build: The command ‘/bin/sh -c if [ ${INSTALL_IMAGEMAGICK} = true ]; then apt-get install -y libmagickwand-dev imagemagick && pecl install imagick && docker-php-ext-enable imagick ;fi’ returned a non-zero code: 100】でサービス ‘php-fpm’の構築に失敗しているとのこと。

以下の記事を参考に、php-fpmディレクトリのDockerfileにて以下をImageMagickの欄に追記。再度試したところdoneと表示◎

apt-get update && \

laravelのバージョンを教本だと5.5のところあえて6.8で今回はチャレンジ。成功。

$ docker-compose exec workspace composer create-project --prefer-dist laravel/laravel . "6.8.*"
Application key set successfully.

Laravelアプリ トップ画面 http://localhost/
phpmyadmin トップ画面 http://localhost:8081/

以下でphpmyadminにログイン。DBにdocker_mysqlがあること確認。

サーバ名:mysql
ユーザー名:root
パスワード:root

Laravel側の.envファイルを編集。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=docker_mysql
DB_USERNAME=root
DB_PASSWORD=root

コントローラー作成

コントローラー作成はOK

$ docker-compose exec workspace php artisan make:controller ArticleController
Controller created successfully.

DB作成

マイグレーションファイルの作成。

$ docker-compose exec workspace php artisan make:migration create_articles_table --create=articles
Created Migration: 2020_03_24_092458_create_articles_table

マイグレート。初めてマイグレートに成功◎laravel側の.envファイルをrootユーザーで記入したからっぽい。

$ docker-compose exec workspace php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.13 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.13 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.07 seconds)
Migrating: 2020_03_24_092458_create_articles_table
Migrated: 2020_03_24_092458_create_articles_table (0.05 seconds)

これでやっとアプリ制作に取り掛かれるようになった。。。泣

追記:備忘録

Dockerで環境構築後のXAMPPエラー(未解決)

いつもどおりC:\xampp\apache\conf\httpd.confの252行目を編集したところXAMPPが403エラーになり機能しなくなりました。。。

documentRoot "C:/xampp/htdocs/ドメイン名/public_html"
<Directory "C:/xampp/htdocs/ドメイン名/public_html">

試しに以下もトライしてみるも同様にエラーでした。

documentRoot "C:/xampp/htdocs/ドメイン名/public_html/wordpress"
<Directory "C:/xampp/htdocs/ドメイン名/public_html/wordpress">

先日Dockerの環境構築をしたためと思われる。。。

C:\xampp\apache\conf\extra\httpd-vhosts.conf に以下を追記。エラー。。。

<Directory "C\...">
AllowOverride All
Require all granted
</Directory>

変わらず。。。

参考サイト

XAMPP(Apache 2.4以降)で403エラー(Access forbidden!)が消えない場合の対処法

 

コメントを残す