Java
nginx
docker
SpringBoot
docker-compose

Nginx + Spring Bootアプリケーションをdocker-composeで起動する


概要

下記のDockerfileを作成し、docker-composeから連携して起動する。


  • Nginx


    • 8080ポートを公開し、ホストマシンから接続できる



  • Spring Boot


    • Gradle bootRunで実行

    • 8090ポートをNginxコンテナからのみのアクセス限定で公開




  1. ホストの80ポートへのリクエストをNginxコンテナの8080ポートへ転送

  2. NginxへのリクエストをSpring Bootコンテナの8090ポートへ転送


使うもの

ついでにバージョンも記載。このバージョンでないとできないというわけではない。


  • Java : Open JDK 10.0.1

  • Gradle : 4.8.1

  • Spring Boot : 2.0.3.RELEASE

  • Nginx : 1.15.0

  • Docker : 18.03.1-ce,

  • docker-compose : 1.21.1, build 5a3f1a3


    • docker-py : 3.3.0

    • CPython : 3.6.4




ディレクトリ構成

今回必要なもののみ記載。


  • リポジトリルート


    • docker


      • docker-nginx


        • Dockerfile

        • nginx.conf



      • docker-springboot


        • Dockerfile



      • docker-springboot-local


        • Dockerfile





    • docker-compose.yml

    • gradlew

    • gradlew.bat




各種Dockerfile作成


Nginx


Nginx起動 Dockerfile


docker/docker-nginx/Dockerfile

FROM nginx:1.15.0

ADD nginx.conf /etc/nginx/conf.d/nginx.conf



Nginx コンフィグファイル

Dockerfileではないが、Dockerfile内のスクリプトで使うもの。


docker/docker-nginx/nginx.conf

server {

listen 8080;
charset utf-8;
access_log off;

location / {
proxy_pass http://app:8090;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location /static {
access_log off;
expires 30d;

alias /app/static;
}
}


これがベストなのかどうかはわからない。HTTPSも無いし、アプリケーションで必要なことはここに書き足していく必要がある。

app:8090のappは、後述のdocker-compose.ymlのSpring Bootのコンテナのこと。


Spring Boot


Spring Boot起動 Dockerfile(Gitからクローンして起動)


docker/docker-springboot/Dockerfile

FROM openjdk:10.0.1-jdk

RUN git clone https://github.com/xxxx/repo_name.git
WORKDIR ./repo_name

RUN ./gradlew --full-stacktrace -q build

CMD ./gradlew bootRun



Spring Boot起動 Dockerfile(ローカルのソースを参照して起動)


docker/docker-springboot-local/Dockerfile

FROM openjdk:10.0.1-jdk


docker-compose.ymlから必要な設定は指定するので、結果FROMだけとなった。


docker-compose.yml ファイル作成


docker-compose.yml

version: '3'

services:

nginx:
container_name: container_nginx
build: docker/docker-nginx
restart: always
ports:
- 80:8080
hostname: container_nginx_hostname
links:
- app

app:
container_name: container_springboot
restart: always
build: docker/docker-springboot
expose:
- 8090
command: ./gradlew bootRun
hostname: container_springboot_hostname

# ローカルで手早く立ち上げる時に使う
# app:
# container_name: container_springboot-local
# restart: always
# build: docker/docker-springboot-local
# expose:
# - 8090
# command: ./gradlew bootRun
# hostname: container_springboot-local_hostname
# working_dir: /container_springboot
# volumes:
# - ./:/container_springboot



実行

docker-comoseで起動すれば、localhost/アプリケーションパス、でAPIを実行できる。


まとめ

Dockerfile、docker-compose.ymlの内容を忘れないように、ざっくり書いたものなので、細かい説明がないが、上記でHTTPリクエストをNginxで受け付けて、Spring Bootに流すことができた。