-
Notifications
You must be signed in to change notification settings - Fork 28
docker compose를 통해 로컬에서 쉽게 애플리케이션 실행해보기
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"]
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가 뜨는게 조금 많이 느립니다.
아래 로그가 나올 때까지는 계속 시도해야합니다.
docker desktop 들어가서 스프링 다시 재생
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_name
인 prolog-local-db
로 설정해주고, 인바운드로 접속하기 위해 3306 포트를 사용하였습니다.
또한, restart 옵션으로 on-failure를 두어서 실패 시 (db가 늦게 떠서 스프링 컨테이너가 죽을 때) 재시도를 할 수 있도록 만들었습니다.
이후 docker-compose up -d
, ./gradlew flywayMigrate
를 진행하고 다시 스프링 컨테이너를 실행하면 잘 뜨게 됩니다.
(혹시 안 된다면 테이블 정보를 drop 시킨 뒤 다시 ./gradlew flywayMigrate를 실행해보세요!)