Skip to content

docker compose를 통해 로컬에서 쉽게 애플리케이션 실행해보기

Jiwon Lee edited this page May 17, 2023 · 6 revisions

Dockerfile

FROM openjdk:11 as build
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Dspring.profiles.active=local","-jar","/app.jar"]

docker-compose.yml

version: "3.8"
services:

  db:
    platform: linux/amd64
    image: library/mysql:8.0.28
    container_name: prolog-local-db
    restart: always
    ports:
      - 13306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: prolog
      MYSQL_PASSWORD: root
      TZ: Asia/Seoul
    command: ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_general_ci"]
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    container_name: elasticsearch
    restart: always
    ports:
      - "9200:9200"
    environment:
      - "discovery.type=single-node"
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

  app:
    build:
      context: ..
      dockerfile: docker/Dockerfile
    ports:
      - 8080:8080

명령어

./gradlew build -x test -x documentationTest -x acceptanceTest

가끔 asciidoctor(rest docs) 관련 빌드가 실패하면 -x asciidoctor 추가하면 됩니다.

cd docker

docker 디렉토리를 들어갑니다.

docker-compose up -d

docker-compose 를 실행시킵니다.

스프링이 이제 DB 테이블이 없어서 schema 관련 exception 발생해서 컨테이너 안뜹니다.

cd ..

gradlew 있는 디렉토리로 이동합니다.

./gradlew flywayMigrate

이때 DB가 뜨는게 조금 많이 느립니다.

아래 로그가 나올 때까지는 계속 시도해야합니다.

image

docker desktop 들어가서 스프링 다시 재생

image

localhost 8080 고고


다른 방법

문제

위에서 제시한 방법으로 했더니 DB connection 관련 오류가 발생하였습니다. (Connection Refused)

해결 방법

도커에서 application-local.yml에 정의된 jdbc:mysql://localhost:13306/prolog...을 접근할 수 없습니다. 도커에서 localhost는 컨테이너 자신의 주소를 가리키기 때문에 이런 문제가 발생합니다. (저희가 흔히 사용하는 PC의 127.0.0.1과는 다릅니다!)

그래서 application-local.yml을 아래와 같이 수정하였습니다.

...
#spring:
#  datasource:
#    url: jdbc:mysql://localhost:13306/prolog?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul
#    username: root
#    password: root
#    driver-class-name: com.mysql.cj.jdbc.Driver
...

DB 관련 설정을 주석 처리하였습니다.

그리고 docker-compose 파일을 아래와 같이 수정하였습니다. (db 부분은 위에 제시된 내용과 동일합니다.)

  ... 

  app:
    container_name: prolog-local-server
    restart: on-failure
    build:
      context: ..
      dockerfile: docker/Dockerfile
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://prolog-local-db:3306/prolog?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: root
    ports:
      - 8080:8080

위와 같이 environment (환경변수)에 데이터베이스 url과 username, password를 설정해주었습니다.

이때 localhost 대신 docker-compose 파일의 db에서 사용한 container_nameprolog-local-db로 설정해주고, 인바운드로 접속하기 위해 3306 포트를 사용하였습니다.

또한, restart 옵션으로 on-failure를 두어서 실패 시 (db가 늦게 떠서 스프링 컨테이너가 죽을 때) 재시도를 할 수 있도록 만들었습니다.

이후 docker-compose up -d, ./gradlew flywayMigrate를 진행하고 다시 스프링 컨테이너를 실행하면 잘 뜨게 됩니다.

(혹시 안 된다면 테이블 정보를 drop 시킨 뒤 다시 ./gradlew flywayMigrate를 실행해보세요!)

Clone this wiki locally