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

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

More than 1 year has passed since last update.

概要

下記の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に流すことができた。

mediado
私たちメディアドゥは、電子書籍を読者に届けるために「テクノロジー」で「出版社」と「電子書店」を繋ぎ、その先にいる作家と読者を繋げる「電子書籍取次」事業を展開しております。業界最多のコンテンツラインナップとともに最新のテクノロジーを駆使した各種ソリューションを出版社や電子書店に提供し、グローバル且つマルチコンテンツ配信プラットフォームを目指しています。
https://mediado.jp
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