2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JAWS DAYS 2017 ワークショップ Docker on Elastic Beanstalk 〜Days after tomorrow〜 (1)

Last updated at Posted at 2017-03-22

この記事では、複数のDockerコンテナで構成される環境を構築するための設定例を具体的に解説します。ワークショップのフォローアップではありますが、一般的な事柄を扱いますので、ワークショップに参加されていない方にもお読み頂ける内容です。

ワークショップ

こんにちは。Emotion Techの子安です。3月もそろそろ終わりだというのに、まだ寒い日が続きますね。陽だまりの恋しい今日このごろです。

さて、先日開催されたJAWS DAYS 2017にて、ワークショップ「Docker on Elastic Beanstalk 〜明日から本番で使えるかも〜」を担当いたしました。多数のお申込みとご参加ありがとうございました。

当日の様子はこんな感じでした。

P3111037.JPG

P3110990.JPG

ハンズオンがメインということで、環境を構築して動かすことにフォーカスした内容だったのですが、終了後に記入して頂いたアンケートの中で、コンテナの設定や、ファイルの内容についてよく知りたいというご要望を頂きました。そこで、今回はワークショップで触れられなかった、そのあたりのことを解説したいと思います。(Dockerそのものについての解説は行いません) 長くなりそうなので、2,3回に分けて掲載する予定です。

リポジトリとコンテナの構成

リポジトリはこちらです。ハンズオンの手順書やコンテナの設定などが入っています。
https://github.com/akirakoyasu/elastic-beanstalk-workshop

コンテナの構成

workshop (1).png

静的コンテンツ配信かつRailsへのプロキシとなるwebコンテナがあり、Railsが動いているappコンテナがあり、更にdbコンテナがあるという構成です。

コンテナ定義ファイル

まずはコンテナを定義するファイルから具体的に見ていきます。 docker-compose.yml を参照ください。docker-compose.ymlは、大きく services volumes networks の3つのセクションに分けられます。

※ 実はElastic Beanstalkはdocker-compose.ymlファイルを参照しませんので、同様の内容をDockerrun.aws.jsonに記述しています。Dockerrun.aws.json固有の設定は次回以降に解説します。

services

コンテナをサービスとして定義するセクションです。ここで、 web app db コンテナをそれぞれ定義しています。

volumes

ホストからコンテナへマウントするディスク領域(ボリューム)を定義するセクションです。ここで、DBのデータ領域となるボリューム eb.workshop.db を名前付きボリュームとして定義しています。イメージがボリュームを要求する場合、定義しなくても自動的にボリュームが作成されますが、名前を付けて定義しておいたほうが後で扱いやすいので明示的に定義するようにしています。

networks

コンテナが接続するネットワークを定義するセクションです。ここで、ネットワーク eb.workshop を定義しています。docker-composeを使用した場合、定義しなくてもデフォルトで1つネットワークが作成されますが、定義しておいたほうが後で扱いやすいので明示的に定義するようにしています。

各コンテナの設定

以降では、順にそれぞれのコンテナで利用している設定を見ていきましょう。

webコンテナ

まずは一番単純なwebコンテナから行きます。

docker-compose.yml
  web:
    image: nginx:1.10.3
    environment:
      APPLICATION_ENV: development
      APPLICATION_ROLE: web
    labels:
      eb.workshop.role: web
    ports:
      - "80:80"
    networks:
      - eb.workshop
    depends_on:
      - app
    volumes:
      - ./web/conf.d:/etc/nginx/conf.d:ro
      - ./web/html:/var/www/html:ro
  • image: 公式のnginxイメージを指定しています。予期していない変更を予防するため、バージョンタグを必ず指定しましょう。
  • environment: 環境変数を指定します。コンテナの役割やDEV/PROD環境の区別などを持たせておくとよいでしょう。
  • labels: コンテナにつけるラベルを指定します。必須ではありませんが、付けておくとCLIでのフィルタリングなどがしやすくなります。
  • ports: ホスト側の80番ポートとコンテナ側の80番ポートをマッピングしています。
  • networks: コンテナが接続するネットワーク(networksのセクションで定義したもの)を指定します。
  • depends_on: このコンテナが依存するコンテナを指定します。webコンテナはappコンテナへプロキシしますので、appコンテナを指定しています。
  • volumes: コンテナにマウントするボリュームを指定します。ボリュームのマウントにはいくつか種類がありますが、ここではホスト側のディレクトリをdocker-compose.ymlファイルからの相対パスで指定して、nginxの設定ファイルと、配信する静的コンテンツをコンテナ側で読み込めるようにしています。

dbコンテナ

次はdbコンテナです。使用しているMySQLイメージの挙動による設定がいくつかあります。(webコンテナと重複する項目は割愛します)

docker-compose.yml
  db:
    image: mysql:5.7.17
    environment:
      APPLICATION_ENV: development
      APPLICATION_ROLE: db
      MYSQL_ROOT_PASSWORD: password
    labels:
      eb.workshop.role: db
    networks:
      - eb.workshop
    volumes:
      - ./db/config/db.cnf:/etc/mysql/conf.d/db.cnf
      - ./db/script/db-init.sql:/docker-entrypoint-initdb.d/db-init.sql
      - eb.workshop.db:/var/lib/mysql
  • image: 公式のmysqlイメージを指定しています。
  • environment: MySQLのrootユーザのパスワードを環境変数 MYSQL_ROOT_PASSWORD で指定する必要があります。
  • volumes: ここでは3つのマウントを指定しています。1つめはMySQLの設定ファイル、2つめは初期化時に実行されるSQLスクリプトファイル、3つめはデータ領域となるディレクトリです。

MySQLイメージの挙動により、 MYSQL_ROOT_PASSWORD 環境変数がrootパスワードとして使用され、初期化時に /docker-entrypoint-initdb.d/db-init.sql のSQLが実行されます。このあたりの挙動については、 Docker Hubのページ に記載されています。

次回へ

次はappコンテナですが、少し長くなりそうなので、つづきは次回にしたいと思います。

次回の記事: JAWS DAYS 2017 ワークショップ Docker on Elastic Beanstalk 〜Days after tomorrow〜 (2)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?