takaya030の備忘録

PHP、Laravel、Docker などの話がメインです

Docker で Node.js + Express の開発環境を作成する

VirtualBox + Docker 環境で Node.js + Express を動作させたときの手順メモ

検証環境

Windows10 Home Edition
VirtualBox 5.2.22
Docker version 18.05.0-ce, build f150324
docker-machine version 0.14.0, build 89b8332
docker-compose version 1.20.1, build 5d8c71b

パッケージインストールのためのイメージ作成

VirtualBox の共有フォルダ内にパッケージをインストールしようとすると、シンボリックリンクが作成できずエラーになるため Docker イメージ内にインストールする

node.Dockerfile

FROM node:8-alpine
MAINTAINER takaya030

ENV HOME=/home/node

RUN mkdir $HOME/app
RUN chown -R node:node $HOME/*

USER node
WORKDIR $HOME/app

RUN yarn add express && \
    yarn add @types/express \
        typescript ts-loader tslint tslint-loader tslint-config-airbnb \
        webpack webpack-cli \
        webpack-node-externals \
        --dev

docker-compose.yml

version: "3"
services:
  node:
    build:
      context: .
      dockerfile: ./node.Dockerfile
    image: takaya030/node:8-alpine

イメージのビルド

$ docker-compose build node

作成したイメージから package.jsonyarn.lock を抽出

イメージからコンテナを作成し、 docker cp でホストOS側にコピーする

$ docker run --name temp-node takaya030/node:8-alpine /bin/true
$ docker cp temp-node:/home/node/app/package.json ./package.json
$ docker cp temp-node:/home/node/app/yarn.lock ./yarn.lock

node.Dockerfile の変更

インストールされるパッケージのバージョンを固定するため node.Dockerfile を変更する

--- a/node.Dockerfile   Sun Feb 10 18:26:36 2019
+++ b/node.Dockerfile   Sun Feb 10 19:20:49 2019
@@ -4,14 +4,10 @@
 ENV HOME=/home/node

 RUN mkdir $HOME/app
+COPY package.json yarn.lock $HOME/app/
 RUN chown -R node:node $HOME/*

 USER node
 WORKDIR $HOME/app

-RUN yarn add express && \
-       yarn add @types/express \
-               typescript ts-loader tslint tslint-loader tslint-config-airbnb \
-               webpack webpack-cli \
-               webpack-node-externals \
-               --dev
+RUN yarn install
+
+ENV PATH=$PATH:./node_modules/.bin

変更後の node.Dockerfile でイメージビルドできるか確認

$ docker-compose build node

各種設定ファイル

以下の各ファイルはこちらのサイトから引用させて頂きました qiita.com

webpack.config.dev.js

const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
    mode: 'development',
    entry: './src/server.ts',     // src下に書いていくので src/server.tsにしとく
    target: 'node',               // Module not found: Error: Can't resolve 'fs'とかいっぱい出たら、この行書き忘れ
    externals: [nodeExternals()], 
    devtool: 'inline-source-map',
    module: {
        rules: [
            {
                enforce: 'pre',
                loader: 'tslint-loader',
                test: /\.ts$/,
                exclude: [
                    /node_modules/
                ],
                options: {
                    emitErrors: true
                }
            },
            {
                loader: 'ts-loader',
                test: /\.ts$/,
                exclude: [
                    /node_modules/
                ],
                options: {
                    configFile: 'tsconfig.dev.json'
                }
            }
        ]
    },
    resolve: {
        extensions: [ '.ts', '.js' ]
    },
    output: {
        filename: 'server.js',
        path: path.resolve(__dirname, 'dist')
    }
};

webpack.config.prod.js

const path = require('path');
const nodeExternals = require('webpack-node-externals');

module.exports = {
    mode: 'production',
    entry: './src/server.ts',     // src下に書いていくので src/server.tsにしとく
    target: 'node',               // Module not found: Error: Can't resolve 'fs'とかいっぱい出たら、この行書き忘れ
    externals: [nodeExternals()], 
    module: {
        rules: [
            {
                enforce: 'pre',
                loader: 'tslint-loader',
                test: /\.ts$/,
                exclude: [
                    /node_modules/
                ],
                options: {
                    emitErrors: true
                }
            },
            {
                loader: 'ts-loader',
                test: /\.ts$/,
                exclude: [
                    /node_modules/
                ],
                options: {
                    configFile: 'tsconfig.dev.json'
                }
            }
        ]
    },
    resolve: {
        extensions: [ '.ts', '.js' ]
    },
    output: {
        filename: 'server.js',
        path: path.resolve(__dirname, 'dist')
    }
};

tsconfig.dev.json

{
  "compilerOptions": {
    "sourceMap": true,
    "noImplicitAny": true,
    "module": "es6",
    "target": "es5",
    "jsx": "react",
    "lib": ["es2018", "dom"],
    "moduleResolution": "node",
    "removeComments": true,
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "strictFunctionTypes": false
  }
}

tsconfig.prod.json

{
  "compilerOptions": {
    "noImplicitAny": true,
    "module": "es6",
    "target": "es5",
    "jsx": "react",
    "lib": ["es2018", "dom"],
    "moduleResolution": "node",
    "removeComments": true,
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "strictFunctionTypes": false
  }
}

tslint.json

{
    "extends": "tslint-config-airbnb",
    "rules": {
        "ter-indent": [true, 4]
    }
}

src/server.ts

こちらはサンプルのソースコードになります

import * as Express from 'express';

const app = Express();

app.get(
    '/',
    (req: Express.Request, res: Express.Response) => {
        return res.send('Hello world.');
    });

app.listen(
    3000,
    () => {
        console.log('Example app listening on port 3000!');
    });

export default app;

ビルドと実行

docker-compose.yml の変更

ビルドと実行のための設定を追加します

--- a/docker-compose.yml        Mon Feb 11 11:43:19 2019
+++ b/docker-compose.yml        Sun Feb 10 23:14:41 2019
@@ -5,3 +5,9 @@
       context: .
       dockerfile: ./node.Dockerfile
     image: takaya030/node:8-alpine
+    volumes:
+      - .:/home/node/app
+      - /home/node/app/node_modules
+    ports:
+      - "3000:3000"
+    command: node dist/server.js

ビルド

$ docker-compose run --rm node webpack --config webpack.config.dev.js

実行

$ docker-compose up -d

web ブラウザで http://192.168.99.100:3000 を開いて "Hello World." が表示されれば成功です

参考サイト

postd.cc

Docker で古い Laravel の開発環境を作成する

4年前に Laravel4.2 で作った Web アプリケーションの開発環境を Docker で作り直したときの手順メモ

検証環境

Windows10 Home Edition
VirtualBox 5.2.22
Docker version 18.05.0-ce, build f150324
docker-machine version 0.14.0, build 89b8332
docker-compose version 1.20.1, build 5d8c71b

Laravel4.2 の環境について

4年前に作成したときは以下の構成でした
当時は DockerVagrant は使用しておらず、VirtualBox に直接 CentOS をインストールして構築していました

CentOS 6.5
PHP 5.5.16
Laravel 4.2.16
MySQL 5.6.26
memcached 1.4.18

今回以下の内容で Docker 上に再構築します

CentOS 6.10
PHP 5.5.38
Laravel 4.2.22
MySQL 5.6.42
memcached 1.5

各種設定ファイル

GitHub のこちらのリポジトリにアップしてあります github.com

イメージのビルド

$ git clone https://github.com/takaya030/docker-centos6-lamp.git la42
$ cd la42
$ docker-compose build base
$ docker-compose build

コンテナの起動

$ docker-compose up -d

動作確認

web ブラウザで http://192.168.99.100 を開いて以下の画面が表示されれば正常に動作しています

f:id:takaya030:20190101225818p:plain

http://192.168.99.100/phpinfo.php にアクセスすると phpinfo が表示されます

f:id:takaya030:20190101225858p:plain

Laravel 4.2 のインストール

一旦コンテナを停止します

$ docker-compose stop

docker-compose.yml と同じ位置に webapp フォルダを作成します

$ mkdir webapp

docker-compose.yml を以下の通りに変更します

--- a/docker-compose.yml  Tue Jan 01 16:58:55 2019
+++ b/docker-compose.yml  Tue Jan 01 17:28:15 2019
@@ -4,7 +4,7 @@
     build: ./base
     image: takaya030/php:5.5
     volumes:
-      - ./itworks:/webapp
+      - ./webapp:/webapp
   web:
     build: ./web
     image: takaya030/web:5.5

コンテナを再起動します

$ docker-compose up -d

ssh を使って、ユーザー名: docker , パスワード: tcuser , ポート番号: 2022manage コンテナにログインします

$ ssh -p 2022 docker@192.168.99.100

composerLaravel をインストールします

$ composer create-project laravel/laravel /webapp v4.2.11

動作確認

web ブラウザで http://192.168.99.100 を開いて Laravel の Welcome ページが表示されるか確認します

f:id:takaya030:20190101230342p:plain

Laravelの設定

環境設定

/webapp/bootstrap/start.php を下記の通りに変更します

--- a/webapp/bootstrap/start.php       2019-01-02 11:21:29.136767400 +0900
+++ b/webapp/bootstrap/start.php       2019-01-03 12:27:58.733542500 +0900
@@ -26,7 +26,7 @@

 $env = $app->detectEnvironment(array(

-       'local' => array('homestead'),
+       'local' => array('dev-manage','dev-web'),

 ));

データベースの設定

/webapp/app/config/local/database.php を下記の通りに変更します

--- a/webapp/app/config/local/database.php     2018-12-31 16:40:43.421769900 +0900
+++ b/webapp/app/config/local/database.php     2019-01-03 12:40:17.927538800 +0900
@@ -22,24 +22,13 @@

                'mysql' => array(
                        'driver'    => 'mysql',
-                       'host'      => 'localhost',
-                       'database'  => 'homestead',
-                       'username'  => 'homestead',
-                       'password'  => 'secret',
+                       'host'      => 'mysql',
+                       'database'  => 'master',
+                       'username'  => 'dbuser',
+                       'password'  => 'dbuser',
                        'charset'   => 'utf8',
                        'collation' => 'utf8_unicode_ci',
                        'prefix'    => '',
-               ),
-
-               'pgsql' => array(
-                       'driver'   => 'pgsql',
-                       'host'     => 'localhost',
-                       'database' => 'homestead',
-                       'username' => 'homestead',
-                       'password' => 'secret',
-                       'charset'  => 'utf8',
-                       'prefix'   => '',
-                       'schema'   => 'public',
                ),

        ),

キャッシュの設定

以下の内容で /webapp/app/config/local/cache.php を作成します

<?php

return array(

    /*
   |--------------------------------------------------------------------------
   | Default Cache Driver
   |--------------------------------------------------------------------------
   |
   | This option controls the default cache "driver" that will be used when
   | using the Caching library. Of course, you may use other drivers any
   | time you wish. This is the default when another is not specified.
   |
   | Supported: "file", "database", "apc", "memcached", "redis", "array"
   |
   */

    'driver' => 'memcached',

    /*
   |--------------------------------------------------------------------------
   | Memcached Servers
   |--------------------------------------------------------------------------
   |
   | Now you may specify an array of your Memcached servers that should be
   | used when utilizing the Memcached cache driver. All of the servers
   | should contain a value for "host", "port", and "weight" options.
   |
   */

    'memcached' => array(

        array('host' => 'memcached', 'port' => 11211, 'weight' => 100),

    ),

);

セッションの設定

以下の内容で /webapp/app/config/local/session.php を作成します

<?php

return array(

    /*
   |--------------------------------------------------------------------------
   | Default Session Driver
   |--------------------------------------------------------------------------
   |
   | This option controls the default session "driver" that will be used on
   | requests. By default, we will use the lightweight native driver but
   | you may specify any of the other wonderful drivers provided here.
   |
   | Supported: "file", "cookie", "database", "apc",
   |            "memcached", "redis", "array"
   |
   */

    'driver' => 'memcached',

);

動作確認

manage コンテナにログインして以下の artisan コマンドが動作するか確認します

$ php artisan cache:clear
Application cache cleared!

$ php artisan migrate:install
Migration table created successfully.

phpMyAdmin について

web ブラウザで http://192.168.99.100:8080 にアクセスすると phpMyAdmin のログイン画面が表示されます
サーバ: mysql , ユーザ名: dbuser , パスワード: dbuser でログイン可能です

f:id:takaya030:20190103180856p:plain

Windows + VirtualBox に構築した minikube のホストVMのストレージを移動する

Windows + VirtualBoxminikubeKubernetes クラスタを作成した場合、仮想ディスクファイル disk.vmdk は C: ドライブに作られます
自分の環境では C: ドライブの空き容量が少ないため、 disk.vmdk を D: ドライブに移動させてみました

検証環境

Windows10 Home Edition
VirtualBox 5.2.16
minikube version: v0.30.0

Kubernetes クラスタの停止

Kubernetes クラスタが停止しているか確認します

C:\>minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

起動中の場合は下記のコマンドで停止します

C:\>minikube stop

disk.vmdk の移動

disk.vmdk は通常 C:\Users\<ユーザー名>\.minikube\machines\minikube\ に作られます
今回はそれを D: ドライブに移動します

D:\>mkdir D:\minikube\machines\minikube
D:\>copy C:\Users\takaya030\.minikube\machines\minikube\disk.vmdk D:\minikube\machines\minikube

.vbox ファイルの編集

C:\Users\<ユーザー名>\.minikube\machines\minikube\minikube\minikube.vbox で設定されている disk.vmdk ファイルのパスを変更します

--- minikube.vbox.orig  2018-10-27 18:00:04.040947200 +0900
+++ minikube.vbox       2018-10-27 18:59:28.318609900 +0900
@@ -9,7 +9,7 @@
   <Machine uuid="{e1ded2f8-93e5-4dd0-b5b0-ca75477afc5b}" name="minikube" OSType="Linux26_64" snapshotFolder="Snapshots" lastStateChange="2018-10-27T09:00:04Z">
     <MediaRegistry>
       <HardDisks>
-        <HardDisk uuid="{eb3d5ff2-a1ed-40e9-9835-c15ecd031216}" location="C:/Users/takaya030/.minikube/machines/minikube/disk.vmdk" format="VMDK" type="Normal"/>
+        <HardDisk uuid="{eb3d5ff2-a1ed-40e9-9835-c15ecd031216}" location="D:/minikube/machines/minikube/disk.vmdk" format="VMDK" type="Normal"/>
       </HardDisks>
       <DVDImages>
         <Image uuid="{88d3ec5f-1bfe-4ab3-afd3-085df99077cc}" location="C:/Users/Minoru/.minikube/machines/minikube/boot2docker.iso"/>

Kubernetes クラスタの起動

C:\>minikube start

参考サイト

takaya030.hatenablog.com

minikube で Windows 上に Kubernetes 環境を作る

minikube で Web アプリケーションの開発環境を作成する手順メモ 今回はフレームワークをインストールする前段階まで

検証環境

Windows10 Home Edition
VirtualBox 5.2.16
minikube version: v0.30.0
kubectl v0.12.0

minikube と kubectl のインストール

minikube のダウンロード

下記のリンクから最新の Windows 用の exe minikube-windows-amd64 をダウンロードします。(2018年10月27日現在の最新バージョンは v0.30.0 です) https://github.com/kubernetes/minikube/releases

minikube のインストール

ダウンロードしたファイルは minikube.exe とリネームしてパスの通ったフォルダにコピーします。

minikube の config 設定

デフォルトの vm driver を VirtualBox にするため、コマンドプロンプトで以下のコマンドを入力

C:\>minikube config set vm-driver virtualbox

設定内容の確認

C:\>minikube config view
- vm-driver: virtualbox

kubectl のインストール

下記 URL から kubectl.exe をダウンロードしてパスの通ったフォルダに配置します https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/windows/amd64/kubectl.exe

Kubernetes クラスタの作成

minikube startKubernetes クラスタを作成します。このコマンドは %USERPROFILE% と同じドライブ(大抵 C ドライブ)で実行しないとエラーになります。
デフォルトでは --memory 2048 --disk-size 20g と開発環境としてはサイズが小さいのでそれぞれ倍にしました

C:\>minikube start --memory 4096 --disk-size 40g

コマンド入力後、数分待つとクラスタが作成されます

Kubernetes クラスタの確認

kubectl version で以下のようにサーバーバージョンが取得できた場合、Kubernetes クラスタが正常に作成されています

C:\>kubectl version
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.0", GitCommit:"0ed33881dc4355495f623c6f22e7dd0b7632b7c0", GitTreeState:"clean", BuildDate:"2018-09-27T17:05:32Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.0", GitCommit:"fc32d2f3698e36b93322a3465f63a14e9f0eaead", GitTreeState:"clean", BuildDate:"2018-03-26T16:44:10Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

minikube ipクラスタの IP アドレスが確認できます

C:\>minikube ip
192.168.99.100

minikube sshクラスタにログインできます

C:\>minikube ssh
                         _             _
            _         _ ( )           ( )
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

クラスタ内でも docker コマンドが使用可能です

$ docker -v
Docker version 17.12.1-ce, build 7390fc6

$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/coredns                         1.2.2               367cdc8433a4        8 weeks ago         39.2MB
k8s.gcr.io/kubernetes-dashboard-amd64      v1.10.0             0dab2435c100        2 months ago        122MB
k8s.gcr.io/kube-proxy-amd64                v1.10.0             bfc21aadc7d3        7 months ago        97MB
k8s.gcr.io/kube-apiserver-amd64            v1.10.0             af20925d51a3        7 months ago        225MB
k8s.gcr.io/kube-scheduler-amd64            v1.10.0             704ba848e69a        7 months ago        50.4MB
k8s.gcr.io/kube-controller-manager-amd64   v1.10.0             ad86dbed1555        7 months ago        148MB
k8s.gcr.io/etcd-amd64                      3.1.12              52920ad46f5b        7 months ago        193MB
k8s.gcr.io/kube-addon-manager              v8.6                9c16409588eb        8 months ago        78.4MB
k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64     1.14.8              c2ce1ffb51ed        9 months ago        41MB
k8s.gcr.io/k8s-dns-sidecar-amd64           1.14.8              6f7f2dc7fab5        9 months ago        42.2MB
k8s.gcr.io/k8s-dns-kube-dns-amd64          1.14.8              80cc5ea4b547        9 months ago        50.5MB
k8s.gcr.io/pause-amd64                     3.1                 da86e6ba6ca1        10 months ago       742kB
gcr.io/k8s-minikube/storage-provisioner    v1.8.1              4689081edb10        11 months ago       80.8MB

デフォルトで VirtualBox の共有フォルダ機能で C:\Users 以下が /c/Users にマウントされています

$ ls -la /c/Users
ls: cannot read symbolic link '/c/Users/All Users': Protocol error
total 61
dr-xr-xr-x 1 docker docker  4096 May 31 14:01  .
drwxr-xr-x 3 root   root       0 Oct 27 03:08  ..
lrwxrwxrwx 1 docker docker     0 Apr 11  2018 'All Users'
dr-xr-xr-x 1 docker docker  8192 May 31 14:06  Default
dr-xr-xr-x 1 docker docker  8192 May 31 14:06 'Default User'
drwxrwxrwx 1 docker docker     0 Oct  2  2016  Default.migrated
drwxrwxrwx 1 docker docker  8192 May 31 14:10  DefaultAppPool
drwxrwxrwx 1 docker docker 28672 Oct 26 14:57  takaya030
dr-xr-xr-x 1 docker docker  4096 May 31 13:52  Public
-rwxrwxrwx 1 docker docker   174 Apr 11  2018  desktop.ini

minikube ssh でログインした場合 exit でログアウトします

$ exit
logout

C:\>

Kubernetes クラスタの停止

minikube stop で停止します

C:\>minikube stop
Stopping local Kubernetes cluster...
Machine stopped.

最後に

minikube で作成したクラスタdocker-machine create で作成した Docker ホストVM と同じ感覚で使えそうです
次回はクラスタ上で Laravel を動かしてみます

参考サイト

qiita.com blog.1q77.com github.com

Google App Engine PHP 7.2 で siler を動かしてみる

先日 PHP の Web フレームワーク siler の開発環境を Docker で作成しましたが、今回は GAE にデプロイして動作確認してみました

検証環境

Windows10 Home Edition
VirtualBox 5.2.16
Docker version 18.05.0-ce, build f150324
docker-machine version 0.14.0, build 89b8332
docker-compose version 1.20.1, build 5d8c71b

siler の開発環境について

こちらの記事の手順で作成します。今回はこれに GAE のデプロイ設定を追加します takaya030.hatenablog.com

ディレクトリ構成

前回から app.yamlgcloud_config フォルダが追加されています

siler
|---app.Dockerfile
|---data.Dockerfile
|---docker-compose.yml
|---php72.Dockerfile
|   
|---data
|   |---www
|       |---app.yaml
|
|---composer
|
|---gcloud_config

各種設定ファイル

差分のみ掲載

data.Dockerfile

--- data.Dockerfile.old Sun Oct 14 17:38:22 2018
+++ data.Dockerfile     Sun Oct 14 15:23:43 2018
@@ -2,6 +2,7 @@
 LABEL maintainer "takaya030"

 RUN mkdir -p /data \
-       && mkdir -p /home/docker/.composer
-VOLUME ["/data","/home/docker/.composer"]
+       && mkdir -p /home/docker/.composer \
+       && mkdir -p /root/.config
+VOLUME ["/data","/home/docker/.composer","/root/.config"]
 CMD ["true"]

docker-compose.yml

--- docker-compose.yml.old      Sun Oct 14 17:41:04 2018
+++ docker-compose.yml  Sun Oct 14 16:20:07 2018
@@ -7,6 +7,7 @@
     volumes:
       - ./data:/data
       - ./composer:/home/docker/.composer
+      - ./gcloud_config:/root/.config
   base:
     build:
       context: .
@@ -25,3 +26,9 @@
     command: ["composer","serve"]
     depends_on:
       - base
+  sdk:
+    image: google/cloud-sdk:alpine
+    volumes_from:
+      - data
+    working_dir: "/data/www"
+    command: ["gcloud","version"]

data/www/app.yaml

このファイルは新規追加となります

runtime: php72
api_version: 1

data イメージのリビルド

data.Dockerfile を変更したのでリビルドする

$ docker-compose build data

起動確認

data コンテナの作り直しと動作確認のため一度ローカルで起動します

$ docker-compose up -d

gcloud 設定

下記コマンドで App Engine のアカウントおよびプロジェクトの設定を行います

$ docker-compose run --rm sdk gcloud init --console-only

プロジェクトの設定完了後、追加で以下の設定を行います

$ docker-compose run --rm sdk gcloud config set core/disable_usage_reporting true
$ docker-compose run --rm sdk gcloud config set component_manager/disable_update_check true
$ docker-compose run --rm sdk gcloud config set metrics/environment github_docker_image

設定内容は以下のコマンドで確認します

$ docker-compose run --rm sdk gcloud info

Cloud Build API の有効化

GAE/PHP7.2 はデプロイ時に Cloud Build API にアクセスします。有効化していない場合は事前にコンソールで有効化します

f:id:takaya030:20181014185618p:plain

デプロイ

下記コマンドで GAEsilerソースコードをデプロイします ( -v で指定しているバージョン番号は任意で OK です)

$ docker-compose run --rm sdk gcloud app deploy -v d001

デプロイに成功した場合、以下のメッセージが表示されます

File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://siler-test.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

動作確認

デプロイ成功時のメッセージに表示されている URL にアクセスして Hello World が表示されれば成功です

f:id:takaya030:20181014185703p:plain

参考サイト

y-ohgi.hatenablog.com qiita.com

PHP最速フレームワーク siler を docker で動かしてみる

PHPbotAPI サーバーを作成するためにコンパクトなフレームワークを探したところ siler を見つけました
こちらのページによると PHP 最速フレームワークだそうです
開発環境つくりがてら Docker で動作させてみました

検証環境

Windows10 Home Edition
VirtualBox 5.2.16
Docker version 18.05.0-ce, build f150324
docker-machine version 0.14.0, build 89b8332
docker-compose version 1.20.1, build 5d8c71b

ディレクトリ構成

siler
|---app.Dockerfile
|---data.Dockerfile
|---docker-compose.yml
|---php72.Dockerfile
|   
|---data
|   |---www
|
|---composer

各種設定ファイル

php72.Dockerfile

php 7.2 + composer のイメージを作成する Dockerfile

FROM php:7.2-alpine
LABEL maintainer "takaya030"

RUN apk add --update --no-cache --virtual .persistent-deps \
        ca-certificates \
        curl \
        tar \
        libpng \
        libxml2 \
        sudo \
        xz \
        git \
        unzip

# create docker user
RUN adduser -S -u 1000 -g 50 docker \
    && echo 'docker:tcuser' | chpasswd

# install composer
RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer

# modify php.ini
RUN mv $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini \
    && sed -i -e "s/;date.timezone *=.*$/date.timezone = Asia\/Tokyo/" $PHP_INI_DIR/php.ini

ENV COMPOSER_HOME /home/docker/.composer

RUN mkdir -p /data/www
VOLUME ["/data"]
WORKDIR /data/www

USER 1000

ONBUILD ADD ./data /data

CMD ["true"]

data.Dockerfile

baseapp が参照するボリュームコンテナのイメージを作成する Dockerfile

ROM busybox
LABEL maintainer "takaya030"

RUN mkdir -p /data \
    && mkdir -p /home/docker/.composer
VOLUME ["/data","/home/docker/.composer"]
CMD ["true"]

app.Dockerfile

アプリケーションサーバーのイメージを作成する Dockerfile

FROM takaya030/php72-alpine
LABEL maintainer "takaya030"

EXPOSE 8000

CMD ["composer","serve"]

docker-compose.yml

version: "2"
services:
  data:
    build:
      context: .
      dockerfile: data.Dockerfile
    volumes:
      - ./data:/data
      - ./composer:/home/docker/.composer
  base:
    build:
      context: .
      dockerfile: php72.Dockerfile
    image: takaya030/php72-alpine
    volumes_from:
      - data
  app:
    build:
      context: .
      dockerfile: app.Dockerfile
    volumes_from:
      - data
    ports:
      - "8000:8000"
    command: ["composer","serve"]
    depends_on:
      - base

data イメージのビルド

最初に data のイメージを作成します

$ cd siler
$ docker-compose build data

base イメージのビルド

次に base のイメージを作成します

$ docker-compose build base

siler のインストール

base イメージを使って data/www/ フォルダに siler をインストールします (コマンドの最後にピリオドがついています)

$ docker-compose run --rm base composer create-project siler/project .

app イメージのビルド

サンプルアプリケーションを動作させるためのイメージをビルドします

$ docker-compose build app

動作確認

以下のコマンドでアプリケーションサーバーが起動します

$ docker-compose up -d

web ブラウザで http://192.168.99.100:8000 にアクセスして Hello World が表示されれば成功です f:id:takaya030:20181013232107p:plain

参考サイト

github.com

docker-compose で Mojolicious 8.0 の開発環境を構築

Mojolicious 8.0 がリリースされたので早速 Docker で動作させてみました

検証環境

Windows10 Home Edition
VirtualBox 5.2.16
docker-machine version 0.14.0, build 89b8332
docker-compose version 1.20.1, build 5d8c71b
perl 5.28.0

ディレクトリ構成

mojo
|---app.Dockerfile
|---base.Dockerfile
|---docker-compose.yml
|   
|---app
    |---cpanfile

各種設定ファイル

base.Dockerfileperl の設定などのスタティックな部分のイメージを作成し、 app.Dockerfile で変更の多いソースコードを追加するかたちをとることでイメージのビルドが最小限になるようにしています

base.Dockerfile

FROM perl:5.28.0
LABEL maintainer "takaya030"

WORKDIR /tmp

RUN apt-get update -y && \
    apt-get clean && \
    rm -fr /var/lib/apt/lists/*

# install carton
RUN cpanm Carton

# create docker user
RUN useradd -d /home/docker -m -s /bin/bash -u 1000 -g 50 docker

USER 1000

RUN mkdir -p /home/docker/app
WORKDIR /home/docker/app

ONBUILD ADD ./app /home/docker/app

CMD ["true"]

app.Dockerfile

FROM takaya030/perl:5.28.0
LABEL maintainer "takaya030"

EXPOSE 3000

CMD ["carton","exec","plackup","-p","3000","myapp.pl"]

docker-compose.yml

version: "2"
services:
  base:
    build:
      context: .
      dockerfile: base.Dockerfile
    image: "takaya030/perl:5.28.0"
    volumes:
      - ./app:/home/docker/app
  app:
    build:
      context: .
      dockerfile: app.Dockerfile
    volumes:
      - ./app:/home/docker/app
    ports:
      - "3000:3000"
    command: ["carton","exec","plackup","-p","3000","myapp.pl"]
    depends_on:
      - base

app/cpanfile

requires 'Plack', '1.0047';
requires 'Mojolicious', '8.0';

base イメージのビルド

最初に base のイメージを作成します

$ cd mojo
$ docker-compose build base

Mojolicious と Plack のインストール

base イメージを使って app フォルダに MojoliciousPlack をインストールします

$ docker-compose run --rm base carton install

Mojolicious のアプリケーション作成

以下のコマンドでサンプルアプリケーションを作成します

$ docker-compose run --rm base carton exec -- mojo generate lite_app myapp.pl

app イメージのビルド

サンプルアプリケーションを動作させるためのイメージをビルドします

$ docker-compose build app

動作確認

以下のコマンドで Plack サーバーが起動します

$ docker-compose up -d

web ブラウザで http://192.168.99.100:3000 にアクセスして以下の画面が表示されれば成功です f:id:takaya030:20170530233327p:plain http://192.168.99.100:3000/perldoc を開くと Mojolicious の perldoc が表示されます f:id:takaya030:20180923000945p:plain

最後に

app イメージには今回のサンプルアプリケーションの動作に必要なものがすべて含まれているので、別の環境で動作させたい場合はこのイメージをコピーするだけで OK です

参考サイト

Mojolicious - Perl real-time web framework

takaya030.hatenablog.com