はてなの金次郎

とあるエンジニアの技術系ブログ

Docker ComposeでLaravelのお手軽開発環境構築

はじめに

Laravel #2 Advent Calendar 2018 の5日目の記事です。

qiita.com

Docker Composeの公式HPで「Quickstart: Compose and Django」や「Quickstart: Compose and Rails」のようにDjangoRailsのクイックスタートはあるのですが、Laravelのクイックスタートが残念ながらありませんでした。

そこで今回、Laravelの公式HPで公開されているチュートリアルBasic Task List」を元にDocker Composeのチュートリアル的なもの「Quickstart: Compose and Laravel」 を作成してみました。

コンテナ構成はLaravel + MySQL + Redisです。

コンテナ技術の動向

コンテナ技術の動向や有用性を知ることでコンテナを学ぶべき理由を改めて認識したいと思います。

コンテナ化したアプリケーションを活用するクラウドネイティブの流れが進行しています。
(中略)
インフラを意識せず、ソフトウェアやサービスの開発に集中することができ、結果として高品質なサービスを提供できる機会が高まりつつあるといえるでしょう。

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

サービスのコンテナ化というのはここ数年のWeb業界の一大トレンドというか完全に一般化してきています。
(中略)
ローカル環境でのテストや、CI上でのテストに関してもDockerを使用することが当然の流れのようになってきています。

qiita.com

全てのソフトウェアにコンテナ技術が適しているわけではありませんが、コンテナ技術はもはやデファクトスタンダードという言葉では表現できないものになっています。

まさに「衣・食・住・コンテナ」と言っても過言ではないでしょう。(過言です)

Docker Composeの便利さを体感してみる

まずは実際にDocker Composeで開発環境を構築してその便利さを体感してみてください。
わずか数コマンドで開発環境を構築できてしまいます。

ソースコードGitHubで公開しています。

github.com

まず、ソースコードをクローンします。

$ git clone https://github.com/jumpyoshim/quickstart-compose-and-laravel.git

環境変数を定義しているファイルをコピーし、Laravelのアプリケーションキーを生成します。

$ cp .env.example .env
$ php artisan key:generate

バックグラウンドで複数コンテナを起動します。

$ docker-compose up -d

これで開発環境の構築は完了です。 http://0.0.0.0:8000/ にアクセスしてみましょう。
アプリケーションの起動が確認できると思います。

f:id:gyuuuutan:20181202021716p:plain
ルートパスにアクセスしたときの画面

さらに、起動したコンテナでユニットテストを走らせることもできます。

$ docker-compose exec app bash
# composer test

Docker Composeによる開発環境構築

Dockerfileの作成

それではDocker Composeの開発環境構築の手順を紹介します。
まずはLaravelアプリケーションのDockerfileの作成です。

Docker は Dockerfile から命令を読み込み、自動的にイメージを構築できます。 Dockerfile はテキスト形式のドキュメントであり、コマンドライン上でイメージを作り上げる命令を全て記述します。ユーザは docker build を使い、複数のコマンド行の命令を順次実行し、イメージを自動構築します。

参考:http://docs.docker.jp/engine/reference/builder.html

FROM php:7-fpm

RUN set -x \
    && apt update \
    && apt install -y --no-install-recommends \
      git \
      wget \
    && docker-php-ext-install \
      pdo_mysql \
      mysqli \
      mbstring

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

ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

RUN mkdir /app
WORKDIR /app
ADD . /app/
  • FROM php:7-fpm:ベースイメージを指定します。DockerHubで公開されている公式イメージや、は独自のコンテナレジストリのイメージを指定します。セキュリティの観点から個人で公開しているイメージを指定するのはあまり望ましくないでしょう。
  • RUN set -x \ ...:必要なパッケージ群をインストールします。
  • RUN curl -sS ...Composerをインストールします。
  • RUN wget ...dockerizeをインストールします。dockerizeを利用することでコンテナの起動順を担保します。
  • RUN mkdir /appapp ディレクトリを作成します。
  • WORKDIR /app:ワーキングディレクトリを指定します。
  • ADD . /app/:カレントディレクトリのソースコード等を app ディレクトリにコピーします。

docker-compose.ymlの作成

次に docker-compose.yml を作成します。これは複数コンテナの管理を定義するファイルです。

Compose とは、複数のコンテナを使う Docker アプリケーションを、定義・実行するツールです。Compose はアプリケーションのサービスの設定に、Compose ファイルを使います。そして、コマンドを1つ実行するだけで、設定した全てのサービスを作成・起動します。

参考:http://docs.docker.jp/compose/overview.html

version: '3'

services:
  db:
    image: mysql:5
    environment:
      MYSQL_DATABASE: tasklist
      MYSQL_ROOT_PASSWORD: secrets
  app:
    build: .
    command: >
      bash -c "dockerize -wait tcp://db:3306
      && composer install --no-plugins --no-scripts
      && php artisan migrate
      && php artisan serve --host=0.0.0.0 --port=8000"
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    env_file:
      - .env
    depends_on:
      - db
  redis:
    image: redis:5

services に開発環境を構成するコンテナを定義します。
今回は db, app, redis の3つのコンテナを定義します。
Nginxなどのコンテナを定義することでより本番環境に近い環境を構築することも可能です。

  • db:データベース名やパスワードを設定します。
  • app:先ほど作成したDockerfileを元にコンテナを起動します。Composerでライブラリのインストール、マイグレーション、アプリケーションの起動を追加で行います。
  • redis:特にイメージのカスタマイズが必要なければイメージの選択だけでもコンテナを起動できます。

おわりに

Docker Composeを利用することでお手軽に開発環境を構築できたかと思います。
Docker Composeを利用すれば以下のメリットを享受できます。

  • 複数のコンテナをコマンド1つで起動・停止が可能
  • コマンド実行時にコンテナ間の依存関係を意識する必要がない
  • コンテナの構成情報はCI/CDにもそのまま利用できる

Dockerは開発環境の構築だけではなく、本番環境のデプロイに使用すると価値が出てくる。開発時の環境分離だけに使用するとオーバーヘッドも大きく、本番環境と一致しないという欠点を抱えてしまう

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

当たり前ですが、開発環境は本番環境に合わせて構築するべきです。

例えば、Amazon ECS + ECS CLIで本番環境を構築する場合はDocker Composeによる開発環境構築はとても有効的だと思います。ECS CLIはdocker-compose.ymlの構成情報をもとにタスク定義を行い、タスクを実行するためです。

同じように、本番環境の構築にKubernetesを利用する場合はMinikubeが有効的だと思います。

とっても便利なDocker Composeですが、銀の弾丸ではありません。ソフトウェアにとって最適なインフラ構成、そして本番環境に最適な開発環境の構築ができるような力を身につけていきたいですね。

ES(ECMAScript)の基礎を学ぶハンズオンに参加してきました

はじめに

js-builders.connpass.com

JavaScript Buildersさん主催の「【初心者向け】JavaScriptの次のステップ、ES(ECMAScript)の基礎を学ぶハンズオン」にブログ枠で参加してきました。

今回参加した動機は VueやReactを学ぶ前にESをちゃんと抑えておきたかったから です。

普段の業務としてはPython/DjangoAPIの実装がメインでたまにインフラ構築といった感じで、JSはもちろんESとはあまり縁がありません。

しかし、将来的にはバックエンド、インフラ、フロントエンドをカバーできるようなエンジニアになりたいので今回の参加に至りました。

今回のイベントでは、JavaScriptをProgateや独学で学んだけど、その先のECMAScriptがわからない。 React.js or Vue.js を触り始めたけど、実はECMAScriptがわからない。 そんな方が基礎を学べる機会になる為のハンズオンを行います。

まさにぴったりの勉強会ですね!

感想

今回の勉強会のゴールが設定されていたのでそれに沿って振り返りたいと思います。

明日からドヤ顔でESの歴史を語れるようになる事

まず、ECMAScriptを一言で説明すると、

JavaScriptJScript の仕様差異を一般化するためにECMA Internationalという機関が JavaScriptを標準仕様化したものが ECMAScriptです。

( -`ω-)どや!

講師の村瀬さんが言語の成り立ちから今までバージョン遷移まで詳しく教えてくださりました。

ESは毎年6月にメジャーアップデートがあるかなり開発がさかんな言語みたいで、バージョンごとの豆知識も教えていただきました。

  • ES6:主流なバージョン
  • ES7:主要な2機能がリリースされたが、どっちも使わなくていいらしい
  • ES2017:Async Awaitを使うためにバージョンアップする場合もあるんだとか
  • ES2018:最近リリースされたばかりなので実績が少なく使用者は少ない

とりあえずES6を抑えておくのが基本らしいです。

この記事もわかりやすかったです。

qiita.com

JavaScriptを始めるならまずは読んでおくべきサイトらしいです。

developer.mozilla.org

ECMAScriptについてはこちら。

developer.mozilla.org

ESの基礎がわかるようになる事

ESの基礎を理解するためにJSのハンズオンでJSの基礎を理解してからESのハンズオンでESを理解するという流れでした。

JSはここが使いづらかったからESではこう改善された のようにストーリー仕立てで覚えることができてかなり理解が捗りました。

普段Pythonを書いている身としては、JSの基本仕様にはかなり驚かされることが多かったです。 class構文がなかったりconstがなかったりモジュールのインポートができなかったり...

ここらへんがESのアップデートでプログラミング言語としての基本仕様を満たしてきたんだなと感じました。 また、ESの構文はかなり書き方に柔軟性があるなと思ったのと、ワイルドカードインポートが認められているのが少し驚きましたね。

為藤さんのハンズオンの説明やサンプルがすごくわかりやすかったので、ESはほとんど触ったことありませんでしたがその場で理解できました。

ハンズオンのソースコードJavaScript BuildersさんのSlackチャンネルで公開されているので気になる方はコンパスのページからとんで確認してみてください。

あと、ハンズオンはPlayCodeを使ってやったのですがすごい便利でした。

playcode.io

おわりに

2時間半とは思えないほど凝縮された内容で、これが無料で受けられたので運営の方々には感謝しかありません。

会場提供してくださったナンバーナインさんにも感謝です!

no9.co.jp

次のステップとしてReactかVueを頑張っていきたいです。

ちなみに次回の勉強会にもブログ枠として参加予定なのでお願いしますー!

js-builders.connpass.com

Developers.IO 2018に参加してきました

Developers.IO 2018とは

dev.classmethod.jp

Developers.IOは、クラスメソッド株式会社が主催するイベントです。 Developers.IO 2018のテーマは「AWS」でした。

  • 立ち見が発生してしまったこと
  • カンファレンス用のWifiがなかったこと
  • 懇親会の食べ物がすぐになくなってしまったこと

は少し残念でしたが、AWSといえばクラスメソッドさん、クラスメソッドさんといえばAWSということもあり、どのセッションもとても勉強させていただきました。

印象に残ったセッション

セッションの概要と感想をまとめました。

次世代モバイル向けクラウドサービスAWS AppSyncを使って店舗スタッフと顧客の体験を最大化する方法

RESTの次のパラダイムとして注目されているGraphQLをベースとしたAWSマネージドサービスAppSyncの紹介と、AppSyncを自社サービスのチャット機能に採用したという話でした。

AppSyncを利用したスキーマファースト開発でスマホアプリの開発効率が向上したとのこと。

特に印象に残ったのはAppSyncを利用したモバイルエンジニアの感想で、

  • GraphQLの前提知識が必要だが、手軽に利用できたのが良かった
  • リクエストが1つで済むので、多くの場合で実装がシンプルになる
  • クライアントが自動生成されるので、アプリの実装は少なくて済む
  • アプリ側で必要なプロパティだけを指定して取得できるので効率的
  • 特にクロスプラットフォームでUIが異なる場合などに適している

といったことが列挙されていました。
PyCon JP 2018でもAppSyncを紹介するトークがありましたが、スマホアプリ開発に携わっている身としていち早く試してみたいサービスです。

気になる点としては、サポートされているSDKiOSAndroidJavaScriptである点と(Pythonない)、

Q . AWS AppSyncではどのようなアプリケーション開発言語がサポートされていますか?

A . AWS AppSync SDK では iOSAndroidJavaScript がサポートされています。JavaScript のサポート範囲には、React や Angular などのウェブフレームワーク、および React Native や Ionic といったテクノロジーが含まれます。また、AppSync GraphQL エンドポイントへの接続にオープンソースクライアントを使用して、一般的な HTTP ライブラリやシンプルな CURL コマンドなど、その他のプラットフォームも利用できます。

https://aws.amazon.com/jp/appsync/product-details/

AuroraなどのRDBMSを利用する場合、Lambdaを利用する必要があり、

  • 最大処理時間5分問題
  • 複数回起動問題
  • コールドスタート問題

などのLambdaの制約が付きまとう点です。

Q . AWS AppSync で複雑なクエリを実行するにはどうすればよいですか?

A . AWS AppSync で利用できるデータソースでは、GraphQL を使用することで、Amazon DynamoDBAmazon Elasticsearch Service、AWS Lambda によって提供される機能を最大限活用できます。インデックス作成や条件チェックといった機能とマッピングテンプレートによって、DynamoDB から包括的な結果が返されます。あいまい検索、位置情報検索などの Amazon Elasticsearch Service のユースケースもアプリケーションで利用できます。さらに、Lambda を使用した連続的なリクエストやバッチリクエストによって、Amazon Aurora などの他のソースからもデータを返すことができます。

https://aws.amazon.com/jp/appsync/product-details/

クラスメソッドさんがチャット機能で利用したように適切なユースケースで利用すると効果を発揮しそうです。

5つのユースケースから理解するAWSのデータベースサービスの勘所

データベースサービスの使い分け

ユースケース データベースサービス
一般Webシステム Aurora, ElastiCache
サーバーレス DynamoDB
データ分析 Redshift, Athena, Aurora Parallel Query
IoT IoT Analytics, Redshift, Athena
レコメンデーション Neptune

Aurora - 複雑なクエリが必要な場合 - 同時多数アクセスがありうる場合(コネクションプールを活用する)

ElastiCache - 高速に読み書きが求められる場合

DynamoDB - 複雑なクエリが必要な場合 - 同時接続数が安定しており初回起動時間が長くても問題がない場合

Redshift データ分析で大容量データ(TB〜PB)を扱う必要があり、明確に分析対象が決まっている場合(PostgreSQL互換インターフェースをもつ)

Athena データ分析で大容量データ(TB〜PB)を扱う必要があり、明確に分析対象が決まっていない場合(Prestoを使用してS3ファイルへ並列にアクセスする)

IoT Analytics 多数のデバイスからの接続があり、デバイスのデータを継続的に登録する必要がある場合

Neptune 既存の行動データを元に推奨するアイテムを抽出したい場合

様々なユースケースでデータベースサービスを適切に使い分けるということを学んだセッションでした。

多くの場合はRDBMSで要件を満たすことができるかもしれないが、使い慣れたデータベースを選択するのはアンチパターンであり、RDBMSでは最適ではないかもしれないことを念頭に置くことが大切ということ学びました。

聞いたセッション

コンテナジャーニー〜AWSにおける段階式コンテナ運用〜

  • CI/CDの構築にCodePipline, CodeCommit, CodeBuildを使っている以外はほとんど同じ構成で自信にさせていただきました。

基礎から応用までじっくり学ぶ「AWSでのネットワークの作り方」

  • ランチセッションだったのであまりメモれませんでしたが、ネットワークに疎い自分でもわかりやすい内容でした。

クラスメソッドにおけるWebAPIエンジニアリングの基本的な考え方と標準定義

  • 会社として標準定義があるのはさすがクラスメソッドさんという印象で、RESTをファイルシステムメタファと捉えるのは新鮮でした。
  • RESTは一定の原則こそあれどかなり自由度が高く、定義するのはかなり大変だと思うので、RESTフレームワークにのっかちゃうという選択肢もアリかなと感じました。

AWSのセキュリティ設定がどうなっているか抜け漏れなくちゃんと確認する方法

  • insightwatchというクラスメソッド提供の無料セキュリティチェックサービスの紹介でした。
    ご利用中のAWSアカウントを無料でチェックし、セキュリティのガイドラインに沿った運用なのか、数分で確認いただけます ということでどこまで無料でできるかわかりませんが、便利そうです。

DevOps:変化の激しい環境でビジネス競争力を向上させる具体的な方法

  • コント調の発表がユニークでとても面白かったです。
  • バリューストリームマッピングワークショップ参加してみたいです。

今からでも遅くない 基礎から学ぶサーバーレス開発 -キホンの『キ』-

  • サーバーレスが注目されるまでの経緯をオンプレの時代から丁寧に解説されており、とてもわかりやすかったです。
  • ローカル環境構築のし辛さやアプリケーションフレームワークの不在といったサーバーレス開発のつらみの話が興味深かったです。