【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を使った開発は必須となりつつありますので、是非、チャレンジしてみてください。