Docker ComposeでLaravelのお手軽開発環境構築
はじめに
Laravel #2 Advent Calendar 2018 の5日目の記事です。
Docker Composeの公式HPで「Quickstart: Compose and Django」や「Quickstart: Compose and Rails」のようにDjangoやRailsのクイックスタートはあるのですが、Laravelのクイックスタートが残念ながらありませんでした。
そこで今回、Laravelの公式HPで公開されているチュートリアル「Basic Task List」を元にDocker Composeのチュートリアル的なもの「Quickstart: Compose and Laravel」 を作成してみました。
コンテナ構成はLaravel + MySQL + Redisです。
コンテナ技術の動向
コンテナ技術の動向や有用性を知ることでコンテナを学ぶべき理由を改めて認識したいと思います。
コンテナ化したアプリケーションを活用するクラウドネイティブの流れが進行しています。
(中略)
インフラを意識せず、ソフトウェアやサービスの開発に集中することができ、結果として高品質なサービスを提供できる機会が高まりつつあるといえるでしょう。
サービスのコンテナ化というのはここ数年のWeb業界の一大トレンドというか完全に一般化してきています。
(中略)
ローカル環境でのテストや、CI上でのテストに関してもDockerを使用することが当然の流れのようになってきています。
全てのソフトウェアにコンテナ技術が適しているわけではありませんが、コンテナ技術はもはやデファクトスタンダードという言葉では表現できないものになっています。
まさに「衣・食・住・コンテナ」と言っても過言ではないでしょう。(過言です)
Docker Composeの便利さを体感してみる
まずは実際にDocker Composeで開発環境を構築してその便利さを体感してみてください。
わずか数コマンドで開発環境を構築できてしまいます。
まず、ソースコードをクローンします。
$ 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/ にアクセスしてみましょう。
アプリケーションの起動が確認できると思います。
さらに、起動したコンテナでユニットテストを走らせることもできます。
$ 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 /app
:app
ディレクトリを作成します。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版 (アスキードワンゴ)
- 作者: Michal Jaworski,TarekZiade,稲田直哉,芝田将,渋川よしき,清水川貴之,森本哲也
- 出版社/メーカー: ドワンゴ
- 発売日: 2018/02/26
- メディア: Kindle版
- この商品を含むブログを見る
当たり前ですが、開発環境は本番環境に合わせて構築するべきです。
例えば、Amazon ECS + ECS CLIで本番環境を構築する場合はDocker Composeによる開発環境構築はとても有効的だと思います。ECS CLIはdocker-compose.ymlの構成情報をもとにタスク定義を行い、タスクを実行するためです。
同じように、本番環境の構築にKubernetesを利用する場合はMinikubeが有効的だと思います。
とっても便利なDocker Composeですが、銀の弾丸ではありません。ソフトウェアにとって最適なインフラ構成、そして本番環境に最適な開発環境の構築ができるような力を身につけていきたいですね。
ES(ECMAScript)の基礎を学ぶハンズオンに参加してきました
はじめに
JavaScript Buildersさん主催の「【初心者向け】JavaScriptの次のステップ、ES(ECMAScript)の基礎を学ぶハンズオン」にブログ枠で参加してきました。
今回参加した動機は VueやReactを学ぶ前にESをちゃんと抑えておきたかったから です。
普段の業務としてはPython/DjangoでAPIの実装がメインでたまにインフラ構築といった感じで、JSはもちろんESとはあまり縁がありません。
しかし、将来的にはバックエンド、インフラ、フロントエンドをカバーできるようなエンジニアになりたいので今回の参加に至りました。
今回のイベントでは、JavaScriptをProgateや独学で学んだけど、その先のECMAScriptがわからない。 React.js or Vue.js を触り始めたけど、実はECMAScriptがわからない。 そんな方が基礎を学べる機会になる為のハンズオンを行います。
まさにぴったりの勉強会ですね!
感想
本日のハンズオンのゴール!
— ミミ@ROLO広報担当 (@rolotokyo) 2018年11月26日
・明日からドヤ顔でESの歴史を語れるようになる事
・ESの基礎がわかるようになる事#js_builders
今回の勉強会のゴールが設定されていたのでそれに沿って振り返りたいと思います。
明日からドヤ顔でESの歴史を語れるようになる事
まず、ECMAScriptを一言で説明すると、
JavaScript と JScript の仕様差異を一般化するためにECMA Internationalという機関が JavaScriptを標準仕様化したものが ECMAScriptです。
( -`ω-)どや!
講師の村瀬さんが言語の成り立ちから今までバージョン遷移まで詳しく教えてくださりました。
ESは毎年6月にメジャーアップデートがあるかなり開発がさかんな言語みたいで、バージョンごとの豆知識も教えていただきました。
- ES6:主流なバージョン
- ES7:主要な2機能がリリースされたが、どっちも使わなくていいらしい
- ES2017:Async Awaitを使うためにバージョンアップする場合もあるんだとか
- ES2018:最近リリースされたばかりなので実績が少なく使用者は少ない
とりあえずES6を抑えておくのが基本らしいです。
この記事もわかりやすかったです。
JavaScriptを始めるならまずは読んでおくべきサイトらしいです。
ECMAScriptについてはこちら。
ESの基礎がわかるようになる事
ESの基礎を理解するためにJSのハンズオンでJSの基礎を理解してからESのハンズオンでESを理解するという流れでした。
JSはここが使いづらかったからESではこう改善された のようにストーリー仕立てで覚えることができてかなり理解が捗りました。
普段Pythonを書いている身としては、JSの基本仕様にはかなり驚かされることが多かったです。 class構文がなかったりconstがなかったりモジュールのインポートができなかったり...
ここらへんがESのアップデートでプログラミング言語としての基本仕様を満たしてきたんだなと感じました。 また、ESの構文はかなり書き方に柔軟性があるなと思ったのと、ワイルドカードインポートが認められているのが少し驚きましたね。
為藤さんのハンズオンの説明やサンプルがすごくわかりやすかったので、ESはほとんど触ったことありませんでしたがその場で理解できました。
ハンズオンのソースコードは JavaScript BuildersさんのSlackチャンネルで公開されているので気になる方はコンパスのページからとんで確認してみてください。
あと、ハンズオンはPlayCodeを使ってやったのですがすごい便利でした。
おわりに
2時間半とは思えないほど凝縮された内容で、これが無料で受けられたので運営の方々には感謝しかありません。
会場提供してくださったナンバーナインさんにも感謝です!
次のステップとしてReactかVueを頑張っていきたいです。
ちなみに次回の勉強会にもブログ枠として参加予定なのでお願いしますー!
Developers.IO 2018に参加してきました
Developers.IO 2018とは
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を紹介するトークがありましたが、スマホアプリ開発に携わっている身としていち早く試してみたいサービスです。
気になる点としては、サポートされているSDKがiOS、Android、JavaScriptである点と(Pythonない)、
Q . AWS AppSyncではどのようなアプリケーション開発言語がサポートされていますか?
A . AWS AppSync SDK では iOS、Android、JavaScript がサポートされています。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 DynamoDB、Amazon 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:変化の激しい環境でビジネス競争力を向上させる具体的な方法
- コント調の発表がユニークでとても面白かったです。
- バリューストリームマッピングワークショップ参加してみたいです。