takaya030の備忘録

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

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

Docker + Kotlin で Hello, World

前回作成した kotlin がインストールされた Docker イメージを使って Hello, World を表示するまでの手順メモ

検証環境

Windows10 Home Edition
VirtualBox 5.2.16
docker-machine version 0.14.0, build 89b8332
docker-compose version 1.20.1, build 5d8c71b
Kotlin 1.2.61
Gradle 4.10

Docker イメージの作成について

こちらの記事の手順で作成する takaya030.hatenablog.com

ディレクトリ構成

hello は空のフォルダ

kotdev
|
+---base.Dockerfile
+---docker-compose.yml
+---hello

各種設定ファイル

base.Dockerfile

前回作成したものから変更はない

docker-compose.yml

前回作成したものに最後2行が追加されている

version: "2"
services:
  base:
    build:
      context: .
      dockerfile: base.Dockerfile
  manage:
    image: kotdev_base
    hostname: kotdev-manage
    ports: 
      - "2122:22"
    command: /usr/sbin/sshd -D
    volumes:
      - ./hello:/home/docker/hello

イメージのビルド

$ cd kotdev
$ docker-compose build base

コンテナの起動

$ docker-compose up -d

コンテナへログイン

ユーザー名 docker 、パスワード tcuser 、ポート番号 2122 でログイン

$ ssh docker@192.168.99.100 -p 2122

Gradle プロジェクトの作成

ログインしたコンテナ上で下記コマンドを実行

$ cd hello
$ gradle init

build.gradle を下記内容に編集する

/*
 * This file was generated by the Gradle 'init' task.
 *
 * This is a general purpose Gradle build.
 * Learn how to create Gradle builds at https://guides.gradle.org/creating-new-gradle-builds/
 */

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.2.61"
}

apply plugin: 'application'

mainClassName = 'code.example.HelloWorldKt'

repositories {
    jcenter()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8"
}

ソースファイルの作成

$ mkdir -p src/main/kotlin/code/example
$ touch src/main/kotlin/code/example/HelloWorld.kt

HelloWorld.kt を下記内容に編集する

package code.example

fun main(args: Array<String>) {
    println("Hello World!!")
}

ビルドと実行

ビルド

$ ./gradlew build
$ ./gradlew 

実行

$ ./gradlew run

> Task :run
Hello World!!

BUILD SUCCESSFUL in 0s
2 actionable tasks: 1 executed, 1 up-to-date

参考サイト

etc9.hatenablog.com

docker-compose で Kotlin の開発環境を構築する

Kotlin がインストールされたイメージ作成とコンテナ起動までの手順メモ

検証環境

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

ディレクトリ構成

kotdev
|
+---base.Dockerfile
+---docker-compose.yml

各種設定ファイル

base.Dockerfile

今回は sdkman を使用して kotlin , java , gradle をイメージビルド時にインストールしている

FROM ubuntu:18.04
MAINTAINER takaya030

RUN apt-get update -y \
  && apt-get install -y curl zip unzip sudo tar tzdata openssh-server openssh-client \
  && apt-get clean \
  && rm -fr /var/lib/apt/lists/*

# timezone, ssh
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
  && sed -i '/pam_loginuid\.so/s/required/optional/' /etc/pam.d/sshd \
  && ssh-keygen -A \
  && mkdir /run/sshd

# create docker user
RUN useradd -m -d /home/docker -s /bin/bash -u 1000 -g 50 docker \
  && echo 'docker:tcuser' | chpasswd \
  && echo 'docker ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# install sdkman
USER 1000
WORKDIR /home/docker
RUN curl -s https://get.sdkman.io | bash
RUN /bin/bash -l -c "source /home/docker/.sdkman/bin/sdkman-init.sh;sdk install java;sdk install kotlin;sdk install gradle"

USER root
WORKDIR /root

CMD ["true"]

docker-compose.yml

version: "2"
services:
  base:
    build:
      context: .
      dockerfile: base.Dockerfile
  manage:
    image: kotdev_base
    hostname: kotdev-manage
    ports: 
      - "2122:22"
    command: /usr/sbin/sshd -D

イメージのビルド

$ cd kotdev
$ docker-compose build base

コンテナの起動

$ docker-compose up -d

コンテナへログイン

ユーザー名 docker 、パスワード tcuser 、ポート番号 2122 でログイン

$ ssh docker@192.168.99.100 -p 2122

動作確認

コンテナ上で kotlin , java , gradle が使用可能か確認

docker@kotdev-manage:~$ kotlin -version
Kotlin version 1.2.61-release-89 (JRE 1.8.0_181-b02)

docker@kotdev-manage:~$ java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (Zulu 8.31.0.1-linux64) (build 1.8.0_181-b02)
OpenJDK 64-Bit Server VM (Zulu 8.31.0.1-linux64) (build 25.181-b02, mixed mode)

docker@kotdev-manage:~$ gradle -version

Welcome to Gradle 4.10!

Here are the highlights of this release:
 - Incremental Java compilation by default
 - Periodic Gradle caches cleanup
 - Gradle Kotlin DSL 1.0-RC3
 - Nested included builds
 - SNAPSHOT plugin versions in the `plugins {}` block

For more details see https://docs.gradle.org/4.10/release-notes.html


------------------------------------------------------------
Gradle 4.10
------------------------------------------------------------

Build time:   2018-08-27 18:35:06 UTC
Revision:     ee3751ed9f2034effc1f0072c2b2ee74b5dce67d

Kotlin DSL:   1.0-rc-3
Kotlin:       1.2.60
Groovy:       2.4.15
Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM:          1.8.0_181 (Azul Systems, Inc. 25.181-b02)
OS:           Linux 4.9.93-boot2docker amd64

参考サイト

qiita.com stackoverflow.com

追記

この Docker イメージを使って Hello, World を実行してみた takaya030.hatenablog.com

Windows に Go言語(golang) の開発環境を構築する

Go言語のインストールと IDE の設定までの手順メモ

検証環境

Windows10 Home Edition

Go言語のインストール

ダウンロード

こちらのサイトから Windows版のアーカイブファイルをダウンロードする (2018年3月31日現在、最新バージョンは 1.10.1)
今回はインストーラ(msi)を使わず、zip から手動でインストールした
Downloads - The Go Programming Language

インストール

ダウンロードした zip を適当なディレクトリに解凍する (以下、D:\prog\go に解凍したものとして説明する)

環境変数

"システムのプロパティ" → "詳細設定" → "環境変数" で GOROOTGOPATHPATH環境変数を設定する
設定の基準は下記の通り

GOROOT

Go言語のインストール先のパス (今回は D:\prog\go)

GOPATH

go get で取得するパッケージやプロジェクトの配置先 (例、D:\home\takaya030\go)

PATH

%GOROOT%\bin%GOPATH%\bin を PATH に追加する

動作確認

go versiongo help が動作するか確認する

D:\>go version
go version go1.10.1 windows/amd64

D:\>go help
Go is a tool for managing Go source code.

Usage:

        go command [arguments]

The commands are:

        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        bug         start a bug report
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         download and install packages and dependencies
        install     compile and install packages and dependencies
        list        list packages
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages

Use "go help [command]" for more information about a command.

Additional help topics:

        c           calling between Go and C
        buildmode   build modes
        cache       build and test caching
        filetype    file types
        gopath      GOPATH environment variable
        environment environment variables
        importpath  import path syntax
        packages    package lists
        testflag    testing flags
        testfunc    testing functions

Use "go help [topic]" for more information about that topic.

開発ツールのインストール

D:\>go get -u -v github.com/Masterminds/glide
D:\>go get -u -v github.com/nsf/gocode
D:\>go get -v -v github.com/uudashr/gopkgs/cmd/gopkgs
D:\>go get -u -v github.com/rogpeppe/godef
D:\>go get -u -v sourcegraph.com/sqs/goreturns
D:\>go get -u -v github.com/golang/lint/golint
D:\>go get -u -v github.com/lukehoban/go-find-references
D:\>go get -u -v github.com/lukehoban/go-outline
D:\>go get -u -v golang.org/x/tools/cmd/gorename
D:\>go get -u -v github.com/newhook/go-symbols
D:\>go get -u -v golang.org/x/tools/cmd/guru
D:\>go get -u -v github.com/derekparker/delve/cmd/dlv

Visual Studio Code のインストール

ダウンロード

こちらのサイトから Windows版のアーカイブファイルをダウンロードする (2018年3月31日現在、最新バージョンは 1.21.1)
今回はインストーラ(exe)を使わず、zip から手動でインストールした
code.visualstudio.com

インストール

ダウンロードした zip を適当なディレクトリに解凍する (以下、D:\prog\VSCode-win32-x64-1.21.1 に解凍したものとして説明する)

パスの設定

D:\prog\VSCode-win32-x64-1.21.1\binPATH に追加する

動作確認

コマンドプロンプトcode と入力して Visutal Studio Code が起動するか確認する

D:\>code

f:id:takaya030:20180401193158p:plain

Visual Studio Code の Go言語拡張のインストール

"拡張機能" から Go for Visual Studio Code をインストールする
f:id:takaya030:20180401193337p:plain

動作確認

Go言語のソースコードを編集してメソッド名などが補完されるか確認する
f:id:takaya030:20180401193542p:plain
ブレークポイントを設定したデバッグが可能か確認する
f:id:takaya030:20180401193627p:plain

参考サイト

qiita.com
qiita.com
github.com

docker-machin upgrade のときにローカルの boot2docker.iso を使う

docker-machine upgrade を実行することで GitHub から最新の boot2docker.iso がダウンロードされ Docker ホスト OS (CoreOS) が更新されるが、あらかじめダウンロード済みの boot2docker.iso を使う場合の手順メモ

検証環境

Windows10 Home Edition

VirtualBox 5.2.8

Docker version 18.02.0-ce, build fc4de447b5

docker-machine.exe version 0.13.0, build 9ba6da9

アップグレード前のホストOSの確認

$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
dev    -        virtualbox   Running   tcp://192.168.99.100:2376           v17.10.0-ce

boot2docker.iso のダウンロード

GitHub から任意のバージョンの iso をダウンロードする
(今回自分がダウンロードのは v17.12.1-ce)
Releases · boot2docker/boot2docker

ホストOSのアップグレード

  1. ダウンロードした boot2docker.isoC:\Users\<ユーザー名>\.docker\machine\cache フォルダにコピー
  2. docker-machine upgrade を実行
$ docker-machine upgrade dev
Starting machine so machine can be upgraded...
Starting "dev"...
(dev) Check network to re-create if needed...
(dev) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(dev) Waiting for an IP...
Machine "dev" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Waiting for SSH to be available...
Detecting the provisioner...
Upgrading docker...
Stopping machine to do the upgrade...
Upgrading machine "dev"...
Copying C:\Users\takaya030\.docker\machine\cache\boot2docker.iso to C:\Users\takaya030\.docker\machine\machines\dev\boot2docker.iso...
Starting machine back up...
(dev) Check network to re-create if needed...
(dev) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(dev) Waiting for an IP...
Restarting docker...

アップグレードの確認

$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
dev    *        virtualbox   Running   tcp://192.168.99.100:2376           v17.12.1-ce

備考

上記手順はアップグレード(バージョンアップ)のみで可能。ダウングレードする場合は docker-machine create で新たに VM を作成する必要がある

参考サイト

stackoverflow.com

MSYS2 の golang 環境に dep をインストール

検証環境

Windows10 Home Edition

msys2-x86_64-20170918

$ go version
go version go1.9.1 windows/amd64

dep とは

glide に代わる golang のパッケージ管理ツール
github.com

dep のインストール

以下のコマンドで $GOPATH/bindep.exe がインストールされる

$ go get -u github.com/golang/dep/cmd/dep

$GOPATH/bin にパスを通す

.bashrc などに下記の設定を追加しておく

export PATH=$GOPATH/bin:$PATH

動作確認

$ dep --help
Dep is a tool for managing dependencies for Go projects

Usage: "dep [command]"

Commands:

  init     Set up a new Go project, or migrate an existing one
  status   Report the status of the project's dependencies
  ensure   Ensure a dependency is safely vendored in the project
  prune    Pruning is now performed automatically by dep ensure.
  version  Show the dep version information

Examples:
  dep init                               set up a new project
  dep ensure                             install the project's dependencies
  dep ensure -update                     update the locked versions of all dependencies
  dep ensure -add github.com/pkg/errors  add a dependency to the project

Use "dep help [command]" for more information about a command.

参考サイト

qiita.com
qiita.com