LoginSignup
70
16

docker composeとVSCodeでJava開発環境のコンテナ化

Last updated at Posted at 2023-12-15

Java言語での開発から3~4年程離れていました。
過去のjavaの開発環境では、IDEはEclipseやSTS、IDEA等を使ってきました。
また、javaではdocker環境も利用したことはありませんでした。

ここ数年、他の言語でVSCodeやdockerを触ってきたので、
それらを使ってJava環境を整えてみました。

今回やること

  • java開発環境のコンテナ化(dockerを使って開発メンバー皆同じ環境を簡単に)。
  • 今回はSpringBootでRESTapiのサンプルを動かすところまで。

前提

コンテナ作成

プロジェクトディレクトリを作成してVSコードで開く

※WSL上で行ってください。

$ mkdir spring-boot-rest-api-sample
$ cd spring-boot-rest-api-sample/
$ code .

フォルダ/ファイル構成

作成するフォルダやファイルの配置は以下の通りです。

spring-boot-rest-api-sample
  └─.devcontainer/
    ├─devcontainer.json
    ├─docker-compose.yml
    └─docker/
      └─api/
         └─Dockerfile

後続の手順で作成していきます。

devcontainer.json 作成

devcontainer.jsonは、VSCodeのリモートコンテナ開発環境用の設定ファイルです。

.devcontainer/devcontainer.json
{
    "name": "My Dev Container",
    "dockerComposeFile": "docker-compose.yml",
    "service": "spring-boot-rest-api",
    "workspaceFolder": "/home/vscode/workspace",
    "shutdownAction": "stopCompose",
    "customizations": {
        "vscode": {
            "extensions": [
                "vscjava.vscode-java-pack",
                "vscjava.vscode-spring-initializr",
                "vscjava.vscode-gradle"
            ]
        }
    },
    "remoteUser": "vscode"
}

docker-compose.yml 作成

.devcontainer/docker-compose.yml
version: '3.9'

services:
  spring-boot-rest-api:
    container_name: rest-api
    build:
      context: ./docker/api
    tty: true
    volumes:
      - ../:/home/vscode/workspace:cache
    ports:
      - 8080:8080

※docker-compose.ymlでは、.envを利用したり args: を書いたりすると思いますが、できるだけ分かり易くするため利用していません。

Dockerfile 作成

.devcontainer/docker/api/Dockerfile
FROM ubuntu:22.04

SHELL ["/bin/bash", "-c"]

RUN apt-get update \
    && apt-get install -y sudo unzip zip vim tar less iputils-ping curl jq git

ARG USER_NAME=vscode
ARG USER_GROUP_NAME=vscode
ARG USER_UID=1000
ARG USER_GID=1000

RUN groupadd --gid ${USER_GID} ${USER_GROUP_NAME} \
    && useradd --uid ${USER_UID} --gid ${USER_GID} --shell /bin/bash --create-home -m ${USER_NAME} \
    && echo "${USER_GROUP_NAME}	ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers.d/${USER_GROUP_NAME} \
    && chmod 0440 /etc/sudoers.d/${USER_GROUP_NAME}

ARG JAVA_VERSION=17.0.9-amzn
ARG GRADLE_VERSION=7.5

ARG SDKMAN_DIR=/home/vscode/.sdkman

USER vscode
RUN curl -s "https://get.sdkman.io" | bash \
    && source ${SDKMAN_DIR}/bin/sdkman-init.sh \
    && sdk install java ${JAVA_VERSION} \
    && sdk install gradle ${GRADLE_VERSION}

※sdkmanの使い方については以下参照
https://sdkman.io/

コンテナーでビルドして開く

コマンドパレット(Ctrl + Shift + P)から「Dev Containers: Rebuild and Reopen in Container」を実行してください。

image.png

コンテナ起動したらjavaとgradleを確認

コンテナが無事起動すると以下イメージのようになるはずです。
新しいターミナルを開いて、java -versiongradle -versionを実行して、インストールが成功していることを確認しましょう。
image.png

Javaプロジェクト作成

コマンドパレット(Ctrl + Shift + P)から以下選択

→ Create Java Project を選択

image.png

→ Spring Boot を選択

image.png

→ Gradle Project を選択

image.png

→ Spring Bootのバージョン を選択

image.png

→ Java を選択

image.png

→ リバースドメインネーム構造を入力

image.png

→ プロジェクト名を入力

image.png

→ Jar を選択

image.png

→ Javaのバージョン を選択

image.png

→ 依存関係を選択 してEnter

  • Spring Boot DevTools:開発時の便利なツール(ライブリロード、デバッグ支援など)
  • Spring Web:RESTfulアプリケーションやWebアプリケーションの開発に必要

image.png

→ どこに作成するか場所を選択してEnter

image.png

選択してきた通りに作成されていることを確認

image.png

※左下の「JAVA PROJECTS」に作成したプロジェクトが表示されていなければ リロード

コマンドパレット(Ctrl + Shift + P)から「Developer: Reload Window」を実行してください。
image.png

Spring起動テスト

以下を参考にmain()メソッドがあるクラスを実行してSpringを起動してください。
Springのバナーが表示されたら成功です。
image.png

REST API のサンプルを作成して実行

コントローラを作成してcurlでアクセスしてみましょう。

コントローラを作成してエンドポイント準備

controllers/DemoController.java
package com.example.demo.controllers;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
public class DemoController {

    @GetMapping("/demodemo")
    public Map<String, String> getDemo() {
        return Map.of("msg", "こんにちは。");
    }
}

コントローラが書けたら、右上のあたりの「再起動」や「実行」をクリックしてください。

image.png

curlで作成したAPIへアクセス

ターミナルからcurlでアクセスして、json形式のレスポンスが返ってきたら成功です。

vscode@0be55cf0621f:~/workspace$ curl -s -X GET http://localhost:8080/demodemo | jq .
{
  "msg": "こんにちは。"
}

最後に

お疲れさまでした!
Javaの開発環境もdockerを使って簡単にコンテナ化することが出来ました。

昔は人によってプログラムの動きが違ったり、なかなか動いてくれなかったり多々ありましたが、
便利な環境になりましたね。

以上で終わりです。誰かの一助となれれば幸いです。

70
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
16