【Spring Boot】DockerでSpring Boot+Nginx+MySQLの環境構築をする

作成日: 更新日:

開発環境

  • Visual Studio Code:version 1.73.0
  • OS:Windows10
  • Docker Engine:v23.0.5

DockerでSpring Boot+Nginx+MySQLの環境構築をする手順

DockerでSpring Boot+Nginx+MySQLの環境構築をする手順について解説していきます。

ディレクトリ構成

今回のディレクトリ構成は下記を目指していきます。

1project-root/
2├── docker/
3│   ├── web/             # Javaコンテナ(Dockerfile)
4│   ├── database/        # MySQLコンテナ(Dockerfile)
5│   └── nginx/           # Nginxコンテナ(Dockerfile + 設定ファイル)
6├── web/                 # Spring Bootアプリケーションを配置するディレクトリ
7└── docker-compose.yml   # Docker Composeファイル

docker-compose.ymlを作成

まずはdocker-compose.ymlを作成していきます。 ルートディレクトリの直下にdocker-compose.ymlを作成し、以下のようにしてください。

1# docker-compose.yml
2version: '3.8'
3
4services:
5  web:
6    build:
7      context: .
8      dockerfile: docker/web/Dockerfile
9    container_name: spring_web
10    ports:
11      - "8080:8080"
12    volumes:
13      - ./web:/var/www/html

Javaコンテナを作成

次にJavaコンテナを作成していきます。 docker/web/ディレクトリの直下にDockerfileを作成し、以下のようにしてください。

1# docker/web/Dockerfile
2# Debian ベースの OpenJDK を使用する
3FROM openjdk:23-jdk-slim
4
5WORKDIR /var/www/html
6
7# Mavenのバージョンを指定
8ENV MAVEN_VERSION=3.9.6
9ENV MAVEN_HOME=/opt/maven
10ENV PATH="${MAVEN_HOME}/bin:${PATH}"
11
12# Mavenをダウンロードしてインストール
13RUN apt-get update && apt-get install -y curl
14RUN curl -fsSL https://downloads.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz \
15    | tar -xz -C /opt/ \
16    && ln -s /opt/apache-maven-${MAVEN_VERSION} ${MAVEN_HOME} \
17    && apt-get clean
18
19# javaプロジェクトをコピーする
20COPY ./web /var/www/html/

Spring Bootアプリケーションの作成

次にSpring Bootアプリケーションの作成をしていきます。 まずは以下のコマンドでプロジェクトディレクトリに移動します。

1cd project-root

以下のコマンドでJavaコンテナをビルドします。

1docker-compose build

以下のコマンドでSpring Bootアプリケーションを作成します。

1docker-compose run --rm web sh -c "
2  curl -X GET 'https://start.spring.io/starter.tgz?dependencies=web,data-jpa,mysql&type=maven-project&language=java&bootVersion=3.4.0&javaVersion=23&groupId=com.example&artifactId=springboot-mysql-docker&name=springboot-mysql-docker&packageName=com.example.springboot' \
3  | tar -xz
4"

MySQLコンテナを作成

次にMySQLコンテナを作成していきます。 docker/database/ディレクトリの直下にDockerfileを作成し、以下のようにしてください。

1# docker/database/Dockerfile
2FROM mysql:8.0

Nginxコンテナを作成

次にNginxコンテナを作成していきます。 docker/nginx/ディレクトリの直下にDockerfileを作成し、以下のようにしてください。

1# docker/nginx/Dockerfile
2FROM nginx:alpine
3COPY ./docker/nginx/default.conf /etc/nginx/conf.d/default.conf

docker/nginx/ディレクトリの直下にdefault.confを作成し、以下のようにしてください。

1# docker/nginx/default.conf
2server {
3    listen 80;
4    server_name localhost;
5
6    location / {
7        proxy_pass http://web:8080;
8        proxy_set_header Host $host;
9        proxy_set_header X-Real-IP $remote_addr;
10        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
11        proxy_set_header X-Forwarded-Proto $scheme;
12    }
13}

docker-compose.ymlを修正

docker-compose.ymlを修正していきます。 ルートディレクトリの直下のdocker-compose.ymlを以下のように修正してください。

1# docker-compose.yml
2version: '3.8'
3
4services:
5  web:
6    build:
7      context: .
8      dockerfile: docker/web/Dockerfile
9    container_name: spring_web
10+   command: mvn spring-boot:run
11    ports:
12      - "8080:8080"
13    volumes:
14      - ./web:/var/www/html
15+     depends_on:
16+       - db
17+
18+   db:
19+     build:
20+       context: .
21+       dockerfile: docker/database/Dockerfile
22+     container_name: spring_db
23+     environment:
24+       MYSQL_ROOT_PASSWORD: root
25+       MYSQL_DATABASE: spring_db
26+       MYSQL_USER: spring_user
27+       MYSQL_PASSWORD: spring_password
28+     ports:
29+       - "3306:3306"
30+     volumes:
31+       - db_data:/var/lib/mysql
32+
33+   nginx:
34+     build:
35+       context: .
36+       dockerfile: docker/nginx/Dockerfile
37+     container_name: spring_nginx
38+     ports:
39+       - "80:80"
40+     volumes:
41+       - ./web:/var/www/html
42+       - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
43+     depends_on:
44+       - web
45+
46+ volumes:
47+   db_data:

Spring Bootアプリケーションのデータベース設定

次にSpring Bootアプリケーションのデータベース設定をしていきます。 Spring Bootアプリケーションのapplication.properties設定を以下のように修正します。

1# web/src/main/resources/application.properties
2spring.application.name=springboot-mysql-docker
3
4# MySQLの設定
5spring.datasource.url=jdbc:mysql://db:3306/spring_db
6spring.datasource.username=spring_user
7spring.datasource.password=spring_password
8spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
9
10# JPAの設定
11spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
12spring.jpa.hibernate.ddl-auto=update
13spring.jpa.show-sql=true
14spring.jpa.properties.hibernate.format_sql=true

Dockerコンテナをビルド

次にDockerコンテナをビルドしていきます。 まずは以下のコマンドでプロジェクトディレクトリに移動します。 ※プロジェクトディレクトリに移動済の場合はスキップしてください。

1cd project-root

以下のコマンドでDockerコンテナをビルドします。

1docker-compose build --no-cache

ブラウザでhttp://localhostにアクセスし、「Whitelabel Error Page」が表示されていれば成功です。 もし、簡易的なページを作成して確認したい、データベースの接続が正常化を確認したい場合は、下記のファイルを作成してください。

1// web/src/main/java/com/example/springboot/HomeController.java
2package com.example.springboot;
3
4import org.springframework.beans.factory.annotation.Autowired;
5import org.springframework.jdbc.core.JdbcTemplate;
6import org.springframework.web.bind.annotation.GetMapping;
7import org.springframework.web.bind.annotation.RequestMapping;
8import org.springframework.web.bind.annotation.RestController;
9
10@RestController
11@RequestMapping("/")
12public class HomeController {
13    @Autowired
14    private JdbcTemplate jdbcTemplate;
15
16    @GetMapping
17    public String home() {
18        return "Spring Boot is running!";
19    }
20
21    @GetMapping("/test-connection")
22    public String testConnection() {
23        try {
24            jdbcTemplate.execute("SELECT 1");
25            return "OK";
26        } catch (Exception e) {
27            return "NG: " + e.getMessage();
28        }
29    }
30}

ブラウザでhttp://localhostにアクセスし、「Spring Boot is running!」が表示されていれば成功です。 また、ブラウザでhttp://localhost/test-connectionにアクセスし、「OK」が表示されていればデータベースの接続は成功です。

まとめ

今回はDockerでSpring Bootの環境構築をする手順について解説していきましたが、いかがだったでしょうか。 個人開発のみであればDockerは不要かもしれませんが、Dockerコンテナで開発環境を構築することにより、複数人でプロジェクトを進める場合でも同じ環境で開発を進めることができます。 Dockerを使った開発は必須となりつつありますので、是非、チャレンジしてみてください。

【Spring Boot】DockerでSpring Boot+Nginx+MySQLの環境構築をする | いっしー@Webエンジニア