パソコン情報

もう許して!Docker?Docker Compose?って、Windows10がいいの?Linuxがいいの?Laravel開発環境を準備したいだけなのに悩む

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の開発環境を構築することはできましたが、理解するまでには長い時間が必要そうです。