Linphoneユーザ管理ウェブフロントエンド:Vol.1

Linphoneユーザ管理ウェブフロントエンドをLaravelにより作成します。php-fpmのDockerコンテナ内にlaravel-authをインストール、これをベースにLinphoneのユーザ認証・データベースに合うようにコードを修正・ファイルを追加します。

linphone_am_users

データベース管理にphpmyadminを使用するため、nginx、mariadb, phpmyadminコンテナも必要となります。

以下その手順です。

  1. Dockerネットワークの作成
  2. Docker-Composeファイルの作成
  3. Dockerfileの作成
  4. laravel-authのインストール

ログイン画面

linphone_am_login

ユーザホーム画面

linphone_am_home

Laravel GitHub

Laravelドキュメント

https://laravel.com/docs/7.x

laravel-auth

1. Dockerネットワークの作成

各コンテナ共通のネットワークbr0を作成します。

$ docker network create --driver=bridge --subnet=172.18.0.0/16 br0

2. Docker-Composeファイルの作成

nginx, mariadb, phpmyadmin, php-fpmから成る Docker-Composeファイル を作成します。各イメージ毎に Laravel に必要な追加パッケージ、機能拡張などは別途 Dockerfile で指定します。

注) Letsencrypt+nginxリバースプロキシーによるDockerコンテナを稼働していることが前提条件。以下も参照のこと。

docker-compose.yml

version: '3'

services:
  mariadb:
    container_name: laravel-mariadb
    image: mariadb
    restart: always
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxxxx
      - MYSQL_DATABASE=laravel
      - MYSQL_USER=laravel
      - MYSQL_PASSWORD=xxxxxxxx
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.5

  # nginx
  nginx:
    container_name: nginx
    image: nginx:alpine
    tty: true
    environment:
      - VIRTUAL_HOST=test.site.com
      - VIRTUAL_ROOT=/var/www/html
      - VIRTUAL_PORT=80
      # - VIRTUAL_PROTO=fastcgi
      - LETSENCRYPT_HOST=test.site.com
      - LETSENCRYPT_EMAIL=ficus.online@gmail.com
    volumes:
      # shared nginx default.conf between host and container
      - ./nginx_default.conf:/etc/nginx/conf.d/default.conf
      # shared the directory /var/www/html in php-fpm container
      - ./html/laravel-auth:/var/www/html
      # shared the directory /var/www/html in phpmysql-fpm container
      - ./html/phpmyadmin:/var/www/html/phpmyadmin
    external_links:
      - nginx-proxy-letsencrypt
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.6
        
  # php-fpm-laravel
  php-fpm-laravel:
    container_name: php-fpm-laravel
    build: 
      context: ./docker_files
      dockerfile: php7.2-fpm-alpine-laravel      
    tty: true
    expose: 
      - "9000"
    ports:
      - 8000:8000
    volumes:
      # for laravel php framework
      - ./html:/var/www/html
    depends_on:
      - laravel-mariadb
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.7

  # phpmyadmin-fpm
  phpmyadmin:
    container_name: phpmyadmin-fpm
    build: 
      context: ./docker_files
      dockerfile: phpmyadmin-alpine
    tty: true
    expose: 
      - "9000"
    environment:
      - PMA_HOST=laravel-mariadb
      - PMA_PORT=3306
      - PMA_ABSOLUTE_URI=http://localhost/phpmyadmin
    volumes:
      - ./html/phpmyadmin:/var/www/html
      - /sessions
    depends_on:
      - laravel-mariadb
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.8

networks:
  proxy-tier:
    external:
      name: br0

volumes:
  shared:
    external: true   

3. Dockerfileの作成

Laravel に必要なパッケージ・機能拡張を含んだイメージファイルを作成するため、別途 Dockerfile で標準イメージをカスタマイズします。

phpmyadmin:Dockerfile

$ mkdir docker_files
$ cd docker_files

$ nano phpmyadmin-alpine 

FROM phpmyadmin/phpmyadmin:fpm-alpine
RUN apk add --no-cache bash nano \
    && docker-php-ext-install mysqli \
    && docker-php-ext-enable mysqli

Laravel:Dockerfile

$ nano php7.2-fpm-alpine-laravel

FROM php:7.2-fpm-alpine
    # Set working directory
    WORKDIR /var/www/html

    RUN apk add --no-cache bash nano libpng-dev freetype-dev libjpeg-turbo-dev zip libxml2-dev icu-dev nodejs-current npm \
        && docker-php-ext-install mysqli \
        && docker-php-ext-enable mysqli \
        && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
        && docker-php-ext-install -j$(nproc) gd pdo pdo_mysql zip \
        && docker-php-ext-enable gd pdo pdo_mysql zip \
        && docker-php-ext-install intl \
        && docker-php-ext-enable intl

    # Install Composer and Laravel
    COPY composer_installer.sh /var/www/html
    RUN ./composer_installer.sh && mv composer.phar /usr/local/bin/composer
    RUN chown -R www-data:www-data /var/www/html
    RUN composer global require laravel/installer \
        && ln -s /root/.composer/vendor/laravel/installer/bin/laravel /usr/local/bin/laravel

Laravel に必要な composer のインストールスクリプトを作成します(以下参照)。

$ nano composer_installer.sh

#!/bin/sh

EXPECTED_CHECKSUM="$(wget -q -O - https://composer.github.io/installer.sig)"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]
then
    >&2 echo 'ERROR: Invalid installer checksum'
    rm composer-setup.php
    exit 1
fi

php composer-setup.php --quiet
RESULT=$?
rm composer-setup.php
exit $RESULT

4. laravel-authのインストール

ホストマシンのhtmlフォルダ内(docker-composeファイルを格納しているディレクトリ)でgit cloneコマンドにより、laravel-authをダウンロードします。

$ git clone https://github.com/jeremykenedy/laravel-auth.git laravel-auth

laravel-authディレクトリに移動し、.envファイルを作成します。

$ cd laravel-auth
$ cp .env.example .env

.envファイルでデータベースとsmtpメールサーバの設定をします。事前にデータベースの作成とsmtpメールサーバの情報が必要となります。

DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
DB_DATABASE=laravelAuth
DB_USERNAME=your_user_name
DB_PASSWORD=your_password

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=xxxxxxxxxxxxxx
MAIL_PASSWORD=xxxxxxxxxxxxxx
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=from@example.com
MAIL_FROM_NAME="${APP_NAME}"

以下コマンドにより各コンテナを起動します。

$ docker-compose up -d

Laravelコンテナに入ります。

$ docker exec -ti php-fpm-laravel bash

laravel-authディレクトリに移動し以下コマンドを実行します。

# cd laravel-auth

# composer update

# php artisan vendor:publish --tag=laravelroles && php artisan vendor:publish --tag=laravel2step
# chmod -R 755 ../laravel-auth
# php artisan key:generate
# php artisan migrate
# composer dump-autoload
# php artisan db:seed

# npm install

# npm run dev 
or 
#npm run production

Laravelによるローカルサーバを起動します。

# php artisan serve --host 172.18.0.9
Laravel development server started: http://172.18.0.9:8000
PHP 7.2.24 Development Server started at Fri Apr  3 00:13:36 2020

ホストマシンからhttp://127.0.0.1:8000にアクセスして以下デフォルト画面が表示されるか確認して下さい。

laravel001

php artisan serve inside docker

Docker PHP-Core-Extensionsドキュメント

次のVol.2で修正コード、追加ファイルを記載します。