Spring project를 PostgreSQL과 함께 docker-compose로 배포하는 방법
-
먼저 spring project 안에 Dockerfile을 만들어준다.
FROM openjdk:12-alpine VOLUME /tmp ADD /build/libs/*.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=container", "-jar", "/app.jar"]
jar를 이용해 프로젝트를 run 하는 방법인데, 프로젝트 자체를 ADD로 복사해
‘ENTRYPOINT [”./gradlew”, “bootRun”]’로 실행하는 방법도 있을 것이다. -
해당 프로젝트를 빌드해 jar를 생성한다.
Gradle을 사용하였는데 테스트를 제외하고 build하는 command는 다음과 같다.
./gradlew build --exclude-task test
-
Docker build를 실행해 image 파일로 만들어 준다.
docker build -t testapp .
-
다음 docker-compose.yml 파일을 작성해 준다.
version: "3" services: postgresdb: image: postgres:latest container_name: postgresdb ports: - 5432:5432 environment: - POSTGRES_PASSWORD=postgres - POSTGRES_USER=postgres - POSTGRES_DB=scope restart: unless-stopped # APP***************************************** springbootapp: image: testapp:latest container_name: springbootapp ports: - 8080:8080 restart: unless-stopped depends_on: - postgresdb links: - postgresdb volumes: postgres-data:
- 각 부분 설명
- version : docker compose의 파일 형식 버전 정보입니다.
- service : 컴포즈로 구성될 서비스의 정의 입니다.
이 파일의 서비스는 postgresdb, springbootapp 이 있습니다. - image : 해당 서비스에 사용될 이미지 입니다.
- container_name : docker container로 생성됐을때 container의 name 입니다.
- ports : 사용될 port를 정의합니다. docker run의 -p와 같습니다. host:container 매핑입니다.
- environment: 해당 서비스의 환경변수를 정의 합니다.
- 각 서비스의 환경변수를 정의하는데 postgreSQL의 접속정보부터 spirngboot에서 접속정보까지 지정가능합니다.
- spring에서 접속할 ip(url)과 container가 다르기 때문에 기존에 설정한 ip를 contianer의 name이나 지정한 형태로 변경해야 합니다.
- spring poroperties 예시 : spring.datasource.url=jdbc:postgresql://localhost:5432/test -> 접속안됨
- spring poroperties에서 작성 시 : spring.datasource.url=jdbc:postgresql://postgresdb:5432/test
- 환경변수로 지정 시 : SPRING_DATASOURCE_URL: jdbc:postgresql://postgresdb:5432/test
- depends_on : 의존성을 추가하는 부분으로 database connection을 요청할때 db가 완전히 로드된 이후 접속을 시도합니다.
- links : container 간의 연결을 정의합니다.
- restart : container에 문제가 발생했을 때 재시작하는 방법을 정의합니다.
이외에
- volumes : 볼륨을 지정합니다 host:container 형태입니다.
- networks : network를 지정합니다.
- build: 빌드에 사용될 사항을 정의합니다. dockerfile: Dockerfile로 도커파일도 지정 가능합니다. context: 로 해당 소스의 path를 지정할 수 있습니다.
등이 있습니다.
- 각 부분 설명
-
docker-compose를 실행합니다.
docker-compose up