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コマンドで動く
構築イメージ
以下のコンテナを作成
- MySQL
ホストOSのMySQL Workbenchでアクセス(localhost:3306)
- Spring Boot
ホストOSのブラウザでアクセス(localhost:8080) - STS(Eclipse)からリモートデバッグ(localhost:5005)
- Nginx
HTTPSでアクセス
起動方法
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とか設定しなくてもコンテナのなかに入れば見れる