Docker Spring Boot + Postgresql (2)
in Cloud / Docker on Docker, Springboot, Postgres
개선사항 진행
볼륨 마운트에서 디렉토리 마운트로 변경
스프링 부트 jsp 찾을 수 있게 수정
Spring Boot + JSP
- spring boot jar 배포 환경에서 jsp 경로 문제 때문에 war배포로 임시 수정 (해결방법 찾을때 까지만)
Dockerfile
FROM adoptopenjdk/openjdk8
EXPOSE 8080:8080
ARG WAR_FILE=build/libs/boot-sample-0.0.1-SNAPSHOT.war
COPY ${WAR_FILE} app.war
ENTRYPOINT [ "java", "-jar", "/app.war" ]
Build 후 run command
docker run -d -p 8080:8080 --network boot-sample-network --name Boot-Sample boot-sample
Postgresql Docker
볼륨 바인딩에서 경로 바인딩으로 변경.
바인딩 된 폴더를 깃으로 공유하고 있었는데, 공유 시 특정 파일 또는 경로를 무시하는 현상 발생. 지정된 바인딩 경로는 압축하여 공유하는 형태로 변경하여 러닝함.
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD='${password}' -w ${bind경로} -v ${bind경로}:/var/lib/postgresql/data --platform linux/amd64 --network boot-sample-network --name Postgresql postgres:12.9-alpine
( 윈도우에서는 해당 스크립트를 power shell 에서 실행. ‘ 를 “ 로 변경, 경로 문제 발생 시 원하는 경로 위치하여 ${pwd} 변수 사용 )
위 러닝 스크립트로 동일 Docker Network 상에서 실행 시 부트 프로젝트에서 데이터 바인딩까지 가능한 것을 확인.
Docker-compose.yml 변환 작업 진행
- Postgresql 과 Spring Boot를 서비스로 묶어서 실행하기.
version: "3.7"
services:
app:
# Dockerfile - FROM
image: adoptopenjdk/openjdk8
# Dockerfile - EXPOSE
ports:
- 8080:8080
# image build dir
build:
context: .
# Dockerfile - ARG
args:
WAR-FILE: build/libs/boot-sample-0.0.1-SNAPSHOT.war
# Dockerfile - ENTRYPOINT
entrypoint:
- java
- '-jar'
- /app.war
# Dockerfile - COPY command
command: 'COPY ${WAR_FILE} app.war'
# link : 참조할 다른 컨테이너 연결 - application.yml 내 DB 연결 네이밍 참고.
links:
- db:Postgresql
# 종속성 정의. 여기에선 db 실행 후에 app 실행함을 의미.
depends_on:
- db
db:
# DB 이미지
image: postgres:12.9-alpine
# 포트 지정
ports:
- 5432:5432
# -e 환경 변수 : docker run 명령 참고
environment:
- POSTGRES_PASSWORD=${password}
# 볼륨 지정 : 디렉토리 마운팅
volumes:
- ${bind-dir}:/var/lib/postgresql/data
## Docker Network : 미리 생성된 네트워크 이름을 지정
networks:
default:
external:
name: boot-sample-network
이후 Docker Compose 실행
docker-compose up -d
확인작업 - 러닝 OK
spring boot 확인 - OK
2차 개선사항
docker compose 에서 환경 별 (개발/운영) 로 나누어 개발에서는 docker network 사용, 운영에서는 Server to Server 통신을 할 수 있게끔 빌드 구분하기.
docker compose 에서 네트워크 지정 관련 옵션 찾아보기 (미리 생성된 네트워크 말고, 다른 방식이 있는지)