1. Qiita
  2. Items
  3. docker

複数コンテナDockerをGitlab-CIを使ってAWSのElastic Beanstalkにデプロイする

  • 4
    Like
  • 0
    Comment

はじめに

この記事はDockerその2アドベントカレンダーの17日目です。
複数コンテナDockerをGitlab-CIを使ってAWSのElastic Beanstalkにデプロイする話を書きます。

Gitlabサーバの構築や、Gitlab-CI-Runnerを使えるようにする話は他の記事を参照してください。
また今回の記事を書くにあたり、レポジトリをGithubで公開しています。

https://github.com/tetuyosi/template

説明の節目でタグをつけていますので、何をやっているか詳細を知りたいという奇特な方はバージョン履歴を追ってください。
ローカル環境にPHP/composer/docker/docker-composeがインストールされていることとします。
以下は、MAC+Mac For Dockerの最新版で確認しています。

アジェンダ

  1. ローカル開発環境を作る
  2. デプロイ先のElasticBeanstalk(以後EB)環境を作る
  3. .gitlab-ci.ymlを作成
  4. トリガーとなるレポジトリへプッシュ

ローカル開発環境を作る

nginx + lumen(php) + mysql で作りました。
ローカル環境では Dockerで作ったmysqlを使い、デプロイ時は、RDSを使うという想定です。

v0.0.1(source)

これを実行するには

$ git clone -b v0.0.1 git@github.com:tetuyosi/template.git
$ cd template
$ cd src
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
  - Installing doctrine/inflector (v1.1.0)
    Downloading: 100%

(略)

$ cd ..
$ docker-compose up -d

とやります。 停止するときは

$ docker-compose down

を使いましょう。

ここでcomposer install が面倒なので自動化します。
docker-composeをしてコンテナに入ってcomposerを行うコマンドを追加します。
このコマンドでコンテナ起動することとします。

v0.0.2(source)

$ git clone -b v0.0.2 git@github.com:tetuyosi/template.git
$ bin/dc.sh
### Booting containers
Creating network "template_default" with the default driver
Creating template_db_1
Creating template_app_1
Creating template_nginx_1

Do not run Composer as root/super user! See https://getcomposer.org/root for details
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
  - Installing doctrine/inflector (v1.1.0)
    Downloading: 100%

(略)

phpunit/phpunit suggests installing ext-xdebug (*)
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
Generating autoload files
$ 

毎回ライブラリをダウンロードするのは面倒なので、composerのライブラリをキャッシュします。
キャッシュ用のgzファイルは以下の手順で作ります。

まず、src/composer.jsonに以下の設定を追加します。

    "config":{
        "cache-dir": "../.composer/cache"
    }

vendorフォルダが作られた状態だとライブラリが作られないので一旦削除します。

$ rm -Rf src/vendor

コンテナを起動します。ライブラリダウンロードでしばらく待ちます。

$ bin/dc.sh
(略)
Generating autoload files
$ docker-compose exec app ash
/var/www/html # cd ..
/var/www # tar czf composer-cache.tar.gz .composer
/var/www # exit
$ mkdir docker/php
$ docker cp template_app_1:/var/www/composer-cache.tar.gz ./docker/php/

ここで作ったキャッシュは、appコンテナの作成時に展開するよう修正を加えておきます。

v0.0.3(source)

キャッシュを利用することで、起動が早くなりました。 composer.json を変更してライブラリを追加した際は、キャッシュを作り直してください。

$ git clone -b v0.0.3 git@github.com:tetuyosi/template.git
$ cd template
$ bin/dc.sh

(略)

Do not run Composer as root/super user! See https://getcomposer.org/root for details
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
  - Installing doctrine/inflector (v1.1.0)
    Loading from cache

  - Installing symfony/polyfill-mbstring (v1.3.0)
    Loading from cache

(略)

デプロイ先のElasticBeanstalk(以後EB)環境を作る

  • EBを開き「新しい環境の作成」
  • 「ウェブサーバー環境」
  • 環境タイプを「Multi-container Docker」
  • アプリケーションバージョンは「サンプルアプリケーション」
  • 「template/template-env」で今回は作成

他は細かい指定は任意です。

eb.png

サンプルアプリケーションで環境を作っておき、デプロイ時に更新指示を出してアプリケーションを置き換えます。

EB環境で利用するロールには AmazonEC2ContainerRegistryFullAccess にアタッチしておいてください。
EC2 Container Registry(以下ECR)にアクセスするために必要です。

.gitlab-ci.yml を作成

CIでは、

  • Dockerイメージのビルド
  • 作成したDockerイメージをECRに登録
  • aws elasticbeanstalk コマンドを使って、EB環境へDockerイメージの反映

を行っています。

ここの例で使うGitlab-CIは、以下のRunnerで起動するように設定してあります。
この稿では、Gitlab-CIの設定に関わる部分には触れません。

gitlab-runner.png

Gitlabのプロジェクトの設定の「Variables」で以下の値を設定します。

variables.png

また、ここでは、Docker Registryとして、AWSのElastic Container Registryを利用しています。

またGitlab-CIは、 .gitlab-ci.yml 1行目(各job毎に指定することもできます)のイメージのDocker環境上で実行されます。
今回はこのDocker上でデプロイを行っています。

https://github.com/realworld-jp/docker/blob/master/ci_docker/Dockerfile

Dockerawscli と基本的なunixのコマンド(sedやzip)が入っているイメージであれば何でもいいと思います。

v0.0.4(source)

Gitlab-CIデプロイの設定を追加しました。
Gitlabの方で、developmentブランチを作成しておいてください。
developmentへpush指示を出すことで、デプロイが始まります。

$ git clone -b v0.0.4 git@github.com:tetuyosi/template.git
$ cd template
$ git push origin master:development

うまくいけば以下のような結果となり、EB環境へのDockerイメージのデプロイが行われます。

ci.png

さいごに

まだ説明が抜けている部分が多いので時間が出来たら、加筆修正を行いたいと思います。