Docker, Spring Boot, MySQL,Nginx開発環境

仕組み

自分のpcの中にlinuxで仮想的に3台のpcがdocker上で立ち上がってるイメージ。macの箱の中にdockerがインストールされている。
docker-compose up を実行することでこのwebコンテナ、アプリケーションコンテナ、データベースコンテナの3つが立ち上がる。
この3つが自分自身の127.0.0.1というリクエストを投げることでdockerの中のwebサーバーが受け取って→appサーバーに投げて→DBサーバーへアクセスして帰ってきてwebサーバーでhtmlと組み合わせて返すみたいな流れ
127.0.0.1を受け取ったときにwebサーバが受け取れるようにdocker-composeコマンドで動く

構築イメージ



以下のコンテナを作成

起動方法

dockerAppの立ち上げ
$ cd /Users/~/docker
$ docker-compose up
MySQL Workbenchの起動

停止

$ docker-compose down
起動中のコンテナを確認
$ docker ps

3つのコンテナを組み上げる設計図はdocker-compose.ymlにある
dockerのappサーバーはspringboot/volumes/appフォルダをマウントしてる
このappフォルダにはjavaなどのファイルがある。エクリプスから見てるコードはコンテナからも参照されてる
(user1の参照先であるid=〇〇で管理されたuserオブジェクトと同じ)
dockerのappコンテナもエクリプスもappフォルダの中のソースコードをすべて参照してるだけなので、エクリプスで編集するとそれを参照してるAPPサーバー上のコンテナの中の情報も変わる
appサーバーは自分自身のappフォルダ下のソースコードを参照しながらwebサーバーと連携しながら動いてる

version: '3'
services:
  db:
    build: containers/mysql
    env_file:
      - ./environments/common.env
      - ./environments/db.env
    volumes:
      - ../volumes/db/data:/var/lib/mysql
    ports:
      - 3306:3306 # ホストOSのWorkBenchでDBの情報を見るために定義します。
  app:
    build: containers/spring
    env_file:
      - ./environments/common.env
      - ./environments/db.env
    # MavenのラッパーからSpringBootを起動します。リモートデバッグのパラメータを設定します。
    # javaコマンドで実行してしまうとホットリロードができなくなるのでMavenで起動します。
    # ホストOSからDockerにアクセス可能にするにはaddressの指定で"*"をつけます。(address=*:5005)
    command: ./mvnw clean spring-boot:run -Dspring-boot.run.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5005"
    volumes:
      # 開発するSpringBootプロジェクトを丸ごと配置します。(mvnwコマンドがありますよね。)
      - ../volumes/app:/app
      # ./mvnw cleanでプラグイン/ライブラリなどを毎回ダウンロードすると時間が掛かるので、Mavenのローカルリポジトリを永続化します。
      - ../volumes/app/.m2:/root/.m2
    ports:
      - 8080:8080 # ホストOSからlocalhost:8080でページを確認する場合に定義します。(あまりないかもしれません。)
      - 5005:5005 # リモートデバッグ用のポートです。ホストOSのIDEからアタッチします。
    depends_on:
      - db
  web:
    build: containers/nginx
    env_file:
      - ./environments/common.env
    volumes:
      - ../volumes/web/static:/usr/share/nginx/www/ # 静的ファイルはSpringBootのプロジェクトでは管理せず、Webサーバー側で管理ます。
      - ../volumes/web/ssl:/etc/nginx/cert/
      - ../volumes/web/log:/var/log/nginx/
    ports:
      - 443:443
    depends_on:
      - app

Dockerのメリット

win,macなどプラットフォームに依存せずに全く同じdockerをインストールしてdocker-composeファイルなどを組み込んでcomposeすることでjavaアプリケーションをmac上にはいれたけどコンテナ上にはいれてないことから
プラットフォームに依存せず使い回せる。
自分で1からjavaとかdbとかをインストールしなくてもdocker-composeコマンドでimportしてくれる(本来はosごとに準じたjava,phpやdbの入れ方をしなくてはいけないけどしなくていい)
このpcにjavaアプリケーションやjdkをインストールしたのはあくまでもこのjavaコードをこのpc上で見るだけのためにインストールしただけ。
エクリプスもappサーバーも同じソースコードを参照している。実態は自分のpcの中にあるappフォルダのなかdocker-composeで3つのサーバーを組み上げるときもdocker-composeがビルドのときにappサーバー内にjavaとかを組み上げてる
dbとか設定しなくてもコンテナのなかに入れば見れる