Help us understand the problem. What is going on with this article?

ローカル開発環境を作り易いDockerfileのフォルダ構成

More than 3 years have passed since last update.
  • 本番環境にDockerを導入し、Dockerのメリットである不変性を利用してWebアプリのローカル開発環境を整えたときのノウハウメモ。
  • Beanstalkを使っていますがBeanstalkのことはここには書いてません。
  • 実際に作ったWebアプリは↓こんな感じ
項目 内容
概要 Webアプリケーション。シングルページアプリ。
環境 AWS, ElasticBeanstalk
サーバーサイド言語 Java, gradle
フロントエンド言語 ReactJs, Gulp
キャッシュ Redis
DB mariadb10系

作るコンテナ

  • サンプルとして2つのコンテナを作成することにします。作成するコンテナは以下の2つ。
  • frontendコンテナがアクセスを受け付けて、apiへのアクセスだけをbackendコンテナへプロキシします。 
コンテナ名 用途 OS ポート
backend サーバーサイド側(Java)を実行するためのコンテナ alpineLinux 8080
frontend フロントエンド側(React,HTML)を実行するためのコンテナ alpineLinux 443

フォルダ構成

  • backendコンテナを例にあげます。基本的に baseput に別れます。
  • それぞれのフォルダにDockerfileが存在します。
-/
 |- backend
    |- base
    |   |- Dockerfile
    |   |- ***.conf
    |- put
        |- Dockerfile

baseで行っていること

  • プロジェクトに必要なミドルウェア類のインストールや、設定ファイル(conf等)のCOPYを行います。
  • baseフォルダには独自に以下のルールを設けています。
    • RUNは1回のみ。 && で繋げる。
    • 変更があるものを入れない。(confで都度変更しなければならない場合はbaseには入れない)

こんな感じ

FROM alpine:3.3

RUN apk --update add openjdk8-jre \
&& rm -rf /var/cache/apk/* \
&& mkdir -p /var/log/project /project \
&& cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

putで行っていること

  • baseでビルドしたものに対してプロジェクトの注入を行います。
  • putフォルダには独自に以下のルールを設けています。
    • RUNは極力書かない。(自分のチームではputフォルダにRUNは書かれていません)
    • 極力、FROM, COPY, EXPOSE, CMD の4行だけにする。
    • このフォルダにあるものは絶対に人の手ではビルドしない。
      • 自分のチームではputのビルドをJenkinsでビルドしています。
FROM ↑で作ったコンテナ
COPY project.jar /opt/project.jar
EXPOSE 8080
CMD ["java","-jar","/opt/project.jar"]

全体的にはこんな感じ

  • リポジトリに格納されているフォルダ構造としてはこんな感じになります。
-/docker-codes
 |- backend
 |  |- base
 |  |   |- Dockerfile
 |  |- put
 |  |   |- Dockerfile
 |- frontend
    |- base
    |   |- Dockerfile
    |   |- ssl.key
    |   |- ssl.pem
    |   |- nginx.conf
    |   |- service.conf
    |- put
        |- Dockerfile

ローカル開発環境として動かすには

  • ローカルではdocker-toolboxを使用して動かします。
  • 上記のputの役割を docker-compose で代用して動かします。

putフォルダを適用しない状態でどうやってローカルで動かすのか

  • こんな感じで docker-compose で代用できます。
項目 内容
プロジェクトファイルの COPY docker-composeでディレクトリをマウントさせます
EXPOSE 設定 docker-composeのportsでローカルの docker-machine にポートを紐付けます
CDM 設定 docker-composecommandentrypointで対応
  • たとえば以下のdockerfileの場合
FROM registry.example.com/backend-base-image:1.0
COPY project.jar /opt/project.jar
EXPOSE 8080
CMD["java","-jar","/opt/project.jar"]
  • こんな感じのdocker-composeになります。
docker-compose.yml
backend:
    hostname: backend
    image: registry.example.com/backend-image:1.0
    volumes:
        - /opt/project-backend:/opt
    ports:
        - "8080:8080"
    links:
        - mariadb:mariadb #データベースが必要な場合。
        - redis:redis     #redisキャッシュサーバーが必要な場合
    entrypoint:
        java -jar /opt/project.jar
#---------------
#実際には複数のコンテナで動かすと思うのでfrontendコンテナがある場合は以下のように記述されると思います。
#---------------
frontend:
    hostname: frontend
    image: registry.example.com/frontend-image:1.0
    volumes:
        - /opt/project-frontend/public:/opt
    ports:
        - "443:443"
    links:
        - backend:backend
    entrypoint:
        /usr/sbin/nginx -g 'daemon off;'
mariadb:
    .........
redis:
    .........
  • このようにdocker-compose.ymlを組み立てて、baseでビルドしたコンテナをローカル開発環境として使用します。

まとめ

  • ビルドをbaseputに分けてそれぞれでビルドする。
  • baseでビルドしたものをローカルの開発環境として使う。
  • ローカルではputでビルドする代わりにdocker-composeで工夫する。

最後に

  • この構成のほうがイケてるなどありましたら教えて下さいm(__)m
sgswtky
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした