Spring boot로 어플리케이션 개발하던 중 도커를 이용하여 동작시키면 어떨까 하여 진행하였고,
그 과정에 여러 가지 일들을 기록하고 공유하고자 한다.
먼저 어플리케이션은 spring boot로 되어있고 데이터베이스는 mysql을 사용한다.
mysql과 spring boot를 도커 컨테이너로 각각 올려야 한다.
이 과정에서 docker compose라는 것을 사용하여 같이 동작시키고 한 네트워크 안에서 만들 수 있으나,
데이터베이스와 어플리케이션을 분리하여 관리하고 싶어서 docker composer를 사용하지 않았다.
각각의 docker 컨테이너를 실행시킬 때 문제는 컨테이너 간 네트워크가 연결되어야 한다는 것이다.
도커 네트워크에 대해서는 아래 블로그에 자세하게 나와 있어 확인이 가능하다.
jungwoon.github.io/docker/2019/01/13/Docker-4.html
사용하기로 한 방법은
어플리케이션과 데이터베이스를 각각의 컨테이너로 띄우고,
(단 데이터베이스 컨테이너를 먼저 실행 후 어플리케이션 컨테이너를 실행시킨다.)
link를 이용하여 데이터베이스 컨테이너를 어플리케이션 컨테이너에서 연결하는 것이다.
그 과정에서 아래 블로그가 많은 도움이 되었다.
https://bluese05.tistory.com/54
실습
가장 먼저 해줘야 할 것은 mysql 컨테이너를 실행시키는 것이다.
실행 문은 아래와 같다. 컨테이너의 이름은 mysql-db으로 명시해 두었다.
docker run --name mysql-db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pass123 -d mysql
그다음 어플리케이션의 속성 파일 application.properties이다.
datasource.url을 보면 ip가 아니라 mysql-db라고 되어있는데 이 값이 바로 link의 이름이고,
oauth2server가 database 이름이다.
이렇게 설정해 두고 어플리케이션을 빌드하고 도커 이미지를 빌드하고 도커 컨테이너를 실행시킨다.
(gradle build시 application.properties의 url 때문에 테스트에서 오류가 날 수 있다.)
아래 실행문을 보면 컨테이너 실행 시 mysql-db라는 컨테이너를 링크로 연결한 것을 확인할 수 있다.
# gradle build
gradlew build
# 이미지 빌드
docker build --build-arg JAR_FILE=build/libs/*.jar -t byeongukchoi/oauth2-server .
# 컨테이너 실행
docker run -d --name oauth2-server-container -p 8080:8080 --link mysql-db byeongukchoi/oauth2-server
이렇게 실행되면 어플리케이션 컨테이너의 /etc/hosts 파일에는 mysql-db가 mysql컨테이너로 연결되어있고,
mysql 컨테이너가 재시작되어 ip가 달라지더라도 hosts 파일이 동적으로 변하여 연결이 가능하도록 되어있다.
마무리
이렇게 하여 정상적으로 웹 어플리케이션과 데이터베이스를 잘 작동시켰다.
네트워크 설정, build.gradle 파일에서 도커 실행, application.properties파일의 환경 분리(로컬, docker), k8s 등 하나하나 더 알아가도록 하자.
'공부 > Spring' 카테고리의 다른 글
Spring boot test 경로가 다른 패키지 테스트 시 오류 (6) | 2021.01.07 |
---|---|
Spring Data Rest 알아보기 (0) | 2020.11.20 |
옵셔널(optional)과 람다(lambda)를 이용하여 JpaRepository에서 예외 처리하기 (0) | 2020.11.17 |
스프링 프레임워크 어노테이션 기반 의존성 주입 (@Autowired, @Resource, @Inject) (0) | 2020.03.08 |
스프링 프레임워크 기본 디렉토리 구조 (Spring Framework directory structure) (0) | 2020.03.05 |