WEBデータベースを作成するために旅に出てしまったら、マイクロソフトの呪縛から逃れたくなり、PHPとMySQLなどを習得しようという流れになり、
OSの疑問
開発環境にWindows10マシン?Linuxマシン?
ってなったら、VirtualBoxだとか、Dockerとか色々とでてきました。一つ調べると分からない専門用語が沢山出てきて迷子になってしまっているようです。
とりあえずやってみるしかないので、今回は、VirtualBox上のUbnutu18.04を使って、Docker-Composeをインストールして、Laravelの初期画面を出すまでをやってみたいと思います。
VirtualBoxにUbuntu18.04をインストール準備
https://pctips.jp/server/windows10-virtualbox-ubuntu-setup/
VirtualBoxという仮想環境に、LinuxであるUbuntu18.04をインストールした段階からスタートします。
ココがポイント
Windows10マシンを使っているが、Linux環境
普通にインストールしたので、WEBサーバーも起動してない状態で、ブラウザから確認しても何も見えない状況からのスタートです。
Docker Composeっての使えば便利とか?
VirtualBoxでのDockerとか、LinuxでのDockerとか・・・よく意味がわかりませんが、さくらインターネットさんの解説ページで理解できる図がありました。
今回のDockerをインストールする先は、仮想マシンの方ですが、仮想マシンの中でのOSは、Ubuntuな訳で、Ubuntuの中では、仮想マシンを使わないのがDocker・・・
つまり、仮想マシンを使わない状態で、Dockerってのは動かせる物だと思っていれば間違いないかと。
Dockerの中では、コンテナってのがあって、Wordpressとか、Mysqlとかのアプリを自由に稼働させられるらしい!?(まだ実験してないので疑心)
そして、
参考
Docker Composeってのは、複数のコンテナで構成されるアプリケーションを、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールだそうな!?
自分の理解では、OSのプラットフォームを選ばずに、自分で構築した環境も簡単に他のマシンで復元できる???ってことでいいのでしょうかね。
DockerとDocker Composeのインストール
$ docker --version
インストールされたバージョンを見ると、19.03.6のようです。
次に、docker-composeをインストールしました。
$ sudo apt install docker-compose
バージョンを確認してみました。
$ docker-compose -v
バージョンは、1.17.1のようです。
sudoなしでもdockerを使用可能に設定
sudoなしでもDockerを使えるようにしておいた方がよいという有志のアドバイスから下記のように実行
$ sudo groupadd docker
既に、dockerグループはあるよって言われました。
Laravel開発環境の設定
下記のサイトを参考に手順を進んでみました。
本当に助かります。(感謝)
ディレクトリ作成
どのように、どこに構築して良いのかわかりませんが、rootと同じ階層に、ディレクトリを作成しました。
下記のようにディレクトリやファイルを設置しました。
全てGUI環境でやりたかったのですが、権限の関係で、全てコマンドラインから作業しました。
ファイル作成
すべてコマンドラインからですが、vi使ってファイルを作成しましたが、WEBからコピペすることができました。
● docker-compose.yml
version: '3' services: web: image: nginx:1.15.6 ports: - '8000:80' volumes: - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html
● default.conf
server { listen 80; root /var/www/html; index index.html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; }
● index.html
<h1>docker-compose-laravel</h1> <p>Served by Nginx</p>
動作確認
WEBサーバーのNginxの起動はちゃんとできたようです。
PHPの設定と動作確認
● docker-compose.yml
version: '3' services: web: image: nginx:1.15.6 ports: - '8000:80' depends_on: - app volumes: - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html app: image: php:7.2-fpm volumes: - .:/var/www/html
● default.conf
server { listen 80; root /var/www/html; index index.php index.html index.htm; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
● index.php
<h1>docker-compose-laravel</h1> <p>Served by Nginx</p> <?php phpinfo();?>
phpの場合は、拡張子をphpにしないと動きませんので注意が必要ですね。
ファイルの設定が終わったら、
docker-compose up -d
でブラウザで確認すると、下記のようになります。
MySQLの準備
データベースは、MySQLを使おうとおもいますが、準備ができればLaravelをインストールできるらしい。
docker-compose.ymlを下記のように変えて
docker-compose up -d
version: '3' services: web: image: nginx:1.15.6 ports: - '8000:80' depends_on: - app volumes: - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html app: image: php:7.4-fpm volumes: - .:/var/www/html depends_on: - mysql mysql: image: mysql:5.7 environment: MYSQL_DATABASE: sample MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql volumes: mysql-data:
別のターミナルを起動して、mysqlの起動確認をしました。
mysql>でのログインは、ROOTの方じゃない、ユーザー名とパスワードになります。
なんか、すごくめんどくさくて心が折れそうです。
Laravelのインストール
(1)docker/phpディレクトリを作成し、そこにDockerfileを作成
FROM php:7.4-fpm # install composer 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 \ && apt-get install -y libpq-dev \ && docker-php-ext-install pdo_mysql pdo_pgsql WORKDIR /var/www/html
(2)docker-compose.ymlの編集
app:部分のimage: php:7.4-fpmで既にPHPはインストールされているから?、それに変えて、Dockerfileがあるディレクトリを指定し、Dockerfileをもとにイメージを作成するように定義しなおすらしい。
version: '3' services: web: image: nginx:1.15.6 ports: - '8000:80' depends_on: - app volumes: - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html app: build: ./docker/php volumes: - .:/var/www/html depends_on: - mysql mysql: image: mysql:5.7 environment: MYSQL_DATABASE: sample MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql volumes: mysql-data:
(3)laravelプロジェクトの作成作業
自分の場合は、ディレクトリをdocker-compose-laravelに移動してから下記のコマンドを実行しました。
docker-compose up -d
を行って、
docker-compose exec app bash
そして、
composer create-project --prefer-dist laravel/laravel my-laravel-01
(4)Lravelプロジェクトを作成されたディレクトリを確認
自分の場合は、docker-compose-laravelの中に、my-laravel-01というディレクトリが自動で作成されました。
LaravelとMySQLの接続
(1)my-laravel-01内の.envファイルの一部を編集
※.envファイルは自分の環境では、
ls -a
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=sample DB_USERNAME=user DB_PASSWORD=password
自分が、docker-compose.ymlにて設定したユーザー名やパスワードを設定します。
(2)コマンド実行
docker-compose down
docker-compose up -d
docker-compose exec app bash
コンテナに入ったのちに、下記のコマンド実行してマイグレーション実行
cd my-laravel-01
php artisan migrate
この接続する前に、エラーが出てしばらくエラーの意味が分かりませんでした。
分かった事は、docker-compose.ymlないに記載されたデータベース情報が現時点のMySQLのサーバー情報ではないってことです。
あとで良く調べてみますが、MySQLをコンテナにした時点の物らしいです。docker-compose.ymlの内容と合わせる為には、コンテナの上書きが必要なのかもしれません。
NginxをLaravel設定にする
docker/web/default.confを編集して、my-laravel-01/public/index.phpに設定するようです。
具体的には、rootのパスを変えただけです。
server { listen 80; root /var/www/html/my-laravel-01/public; index index.php index.html index.htm; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
docker-compose down
docker-compose up -d
さて、やっとLaravelの初期画面とご対面だ!
なにやら、Laravelのlogファイルがパーミッションエラーを出しているようです。
my-laravel-01ディレクトリにあるstorageディレクトリの権限をrootじゃなく自分に変えてあげればいいようです。
cd my-laravel-01 chown -R ma2n2n2:ma2n2n storage chmod -R 775 storage
自分の環境では、UbuntuのGUI環境があるのですが、結局ターミナルから権限を変更しました。
GUI環境からの変更は、権限の変更もできないという状態でした。しかし、CUIから権限を変更したら、GUIからでも変更が可能になりました。(当たり前か!?)
権限が変更されたら、無事に下記のLaravelの初期画面がでました。
実際にやってみた!まとめ
自分は、コマンドを覚えてガシガシやれるタイプではないので、GUI環境を準備して、Laravel開発環境を準備しようと考えましたが、結局は、コマンド使って作業をするしか方法がない事が多いです。
Windowsマシンのように見た目で作業をすることは難しいですね。
そして、理解が難しいのが、Docker-composeという仕組み。
想定では、コンテナにして、いつでも実行できるという感じですが、どうやってコンテナにする?どうやってコンテナから呼び出す?どうやって実行する?などの理解が未だにふわふわしています。
とりあえずLaravelの開発環境を構築することはできましたが、理解するまでには長い時間が必要そうです。