차근차근 Modern Spring Boot 3 기초 (2) 로컬에 쓴 Docker Compose
도커 컨테이너의 활용
도커와 컨테이너를 낯설게 느끼는 초심자분들 중 일부는, 도커가 오직 배포를 위해서 사용하는 것이라고 이해하고 계셨습니다. 물론 도커와 컨테이너 개념은 배포 환경에서 아주 유용하게 활용되는 개념입니다. 하지만 로컬(개발자 컴퓨터)에서 개발 환경을 세팅하기 위해서 활용하기에도 손색이 없습니다.
배포를 위해서
로컬 작업을 편하게 하기 위해서
모두 활용할 수 있습니다.
프로젝트마다 독립된 DB 사용
🛢+🛢 Q. 여러 프로젝트에서 DB의 스키마와 테이블이 겹칩니다.
기본적으로 백엔드 시스템에서 DB와 상호작용하는 것은 매우 중요한 역할 중 하나입니다. 하지만 여러 프로젝트를 하기 위해, 매번 내 자리에 데이터베이스를 설치하고 서로 다른 프로젝트끼리 DB 스키마와 테이블 이름이 겹치지 않도록 번거롭게 관리해야 할까요?
로컬에서의 작업 편의를 위해 운영 환경에 영향을 줄지도 모르는 스키마, 테이블 관리 전략을 택하거나, 운영 환경과 너무 상이한 로컬 환경을 구성하는 것은 아무래도 현대적인 방식이 아닌 것 같습니다.
🎁 A. 우리는 도커 컨테이너의 독립성을 로컬에서 유용하게 활용할 수 있습니다.
도커 컨테이너는 독립된 환경을 갖습니다. 그리고 우리가 원할 때 언제든 쉽게 끄고 켜거나, 삭제 후 다시 설치할 수도 있죠. 이렇게 편리한 특징을 이해한다면, 프로젝트마다 아주 손쉽게 데이터베이스 등 도구를 독립적으로 관리할 수 있습니다.
프로젝트마다 완전히 독립된 데이터베이스를 사용할 수 있기 때문에, 데이터가 겹칠 일도 없으며 스키마, 테이블 이름을 관리하는 전략은 서로 다른 프로젝트에 전혀 영향을 주지 않습니다. 또 사용하지 않을 땐 쉽게 삭제하고, 나중에 다시 필요할 때 쉽게 설치할 수 있습니다. 이 과정을 위해 마치 번거로운 작업들이 필요할 것 같겠지만, 아주 간단하게 모든 작업이 완료됩니다.
Docker Compose를 통한 데이터베이스 설치
우리는 도커 컴포즈를 사용하기 위해 docker desktop을 설치했습니다. 도커 컴포즈는 여러 컨테이너 관리를 한 번에 쉽게 할 수 있게 도와주는 도구입니다.
도커 컴포즈는 도커 데스크톱과 독립적으로도 설치할 수 있는 도구지만, 가장 편리하게 설치하는 방법은 도커 데스크톱을 설치하는 것입니다. 또한 이후 도커 데스크톱을 통해 편하게 관리할 수 있습니다.
(단, 도커 데스크톱을 활용한다면 도커 데스크톱과 관련한 취약점 보고가 있는지 눈여겨 봐야 합니다.)
Docker Desktop 실행
도커 컴포즈 명령어를 수행할 수 있도록 우선 도커 데스크톱을 실행합니다.
만약 도커 컴포즈 명령어가 실행 가능한 명령 또는 프로그램이 아니라고 나온다면, 내 컴퓨터에 도커 데스크톱이 실행되고 있는지 확인하여야 합니다. 적어도 백그라운드에서는 돌고 있어야 합니다.
프로젝트에 Docker Compose 파일 작성
도커 컴포즈는 프로젝트와 독립적으로도 관리할 수 있습니다. 따라서 반드시 프로젝트 안에 도커 컴포즈 파일을 작성해야 하는 것은 아닙니다. 하지만, 우리는 프로젝트 단위로 도커 컴포즈를 관리하는 예정이기 때문에 프로젝트 안에 도커 컴포즈 파일을 작성하는 것이 관리하기 편리합니다.
도커 컴포즈 파일은 복잡한 파일 조합을 갖지 않고, 단일 파일로 모두 작성할 수 있기 때문에, 프로젝트의 루트 경로에 바로 작성하는 것이 이번 기초 프로젝트에 맞습니다.
다음 파일을 생성하고, 다음 내용을 붙여 넣어 작성합니다.
파일 경로: 프로젝트의 루트 (이전 글에서
example-springboot3-webmvc
폴더)파일 이름:
docker-compose.yml
파일 내용
version: "3" services: sample_postgres14: # postgresql 공식 이미지 image: postgres:14 # 환경 변수 (규약된 것들) environment: TZ: Asia/Seoul POSTGRES_DB: demo POSTGRES_USER: root POSTGRES_PASSWORD: root POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --lc-collate=C --lc-ctype=C' # 포트포워딩 (외부:내부) ports: # 외부: 변경해도 됨. 우리가 접속할 포트. # 내부: 변경하면 안 되는 경우가 많음. 컨테이너 내에서 취급되는 포트. - 5442:5432 # 연결할 폴더들 (외부:내부) volumes: # 콜론의 왼쪽에 내 PC의 로컬 경로를 써도 됨. # 콜론의 왼쪽에 볼륨 컨테이너를 써도 됨. - sticky_volume_sample_postgres14:/var/lib/postgresql/data - ./db/initdb.d:/docker-entrypoint-initdb.d:ro volumes: sticky_volume_sample_postgres14:
#
으로 시작하는 문장은 주석입니다.가장 아래 volumes에 작성한 것은 볼륨 컨테이너들입니다. (이 파일에선 하나만 작성하였음.)
환경변수(
environment
)는 공식 이미지가 제공하는 목록을 참고하여 작성합니다.컨테이너 외부 포트(
5442
)가 우리가 접근 시 사용할 포트입니다.컨테이너 내부 포트(
5432
)는 각 이미지가 점유하는 경우가 많으며, 우리가 수정하지 않습니다.
위와 같이 만들었을 때, 데이터베이스 접속 정보입니다.
URL:
jdbc:postgresql://localhost:5442/demo
- host:
localhost
, port:5442
, DB name:demo
- host:
username:
root
password:
root
Docker Compose 실행
터미널 열기
명령어는 IDE에서 터미널 아이콘을 찾아 선택한 후, 터미널의 현재 경로(pwd
)가 프로젝트 루트로 되어 있고, 프로젝트 루트에 정확하게 docker-compose.yml
파일이 존재해야 합니다.
(현재 경로에 있는 파일 목록 확인 명령어는 windows: dir
, 그 외: ls
입니다. 이 명령어를 입력하면 docker-compose.yml
파일이 보여야 합니다. 만약 올바른 경로가 아니라면, cd
명령어를 통해 올바른 경로로 이동하세요. cd ..
은 상위 폴더로 이동, cd 폴더이름
또는 cd 폴더이름/폴더이름/폴더이름
형태로 다른 경로로 이동할 수 있습니다.)
도커 컨테이너 게시 및 실행
실행 명령어입니다. 실행할 수 없는 명령이라고 오류가 발생하면, 도커 데스크톱을 실행한 상태에서 다시 명령어를 입력하세요.
docker-compose up -d
실습에서는 위 명령어까지만 하면 됩니다. 아래 명령어들은 참고로 알아 둡니다.
(참고) 도커 컨테이너 내리기
기본적으로 볼륨 컨테이너를 보존합니다. 이 경우, 우리 실습 기준으로는 데이터가 보존됩니다.
docker-compose down
(참고) 볼륨 컨테이너까지 내리기
-v
옵션까지 붙여서 실행하면, 이 도커 컴포즈 파일로 관리하는 모든 컨테이너와 볼륨 컨테이너를 모두 내립니다.
docker-compose down -v
데이터베이스 접속 확인
우리 컴퓨터의 네트워크 설정에 복잡하고 이상한 것들이 없다면, DB 접속 도구를 통해 이 데이터베이스에 로컬호스트로 접근할 수 있을 것입니다.
만약 네트워크 설정 등 이유로 localhost
접근이 안 된다면, 네트워크 설정을 확인하여 내 PC의 IP를 통해 접근할 수 있습니다. 예를 들어, 내 PC에 할당된 내부 IP가 192.168.10.100
이라면, DB URL을 jdbc:postgresql://192.168.10.100:5442/demo
로 하여 접근해 보십시오.
접속 예(localhost)
DBeaver 실행
새 접속(새 연결) 생성
PostgerSQL 선택, 다음 버튼 클릭
접속 정보 입력
Test Connection 클릭 (필요하다면 드라이버를 다운로드 받아야 합니다.)
성공하면 확인 누르고, 완료 선택
(참고) Spring Boot Docker Compose Support
스프링부트와 도커 컴포즈를 함께 사용하면, 이를 보조할 수 있는 도커 컴포즈 support가 있습니다.
⛔️ 우리는 안 씁니다.
이유는 다음과 같습니다.
Spring Boot Docker Compose Support를 통하여, 스프링 부트 앱을 실행할 때 도커 컴포즈 명령을 실행하여 컨테이너를 게시하고, 스프링 부트 앱을 종료할 때 컨테이너를 끄거나 종료하도록 설정할 수 있습니다.
- 수동으로 할 때에 비해 메리트가 그다지 크지 않습니다.
나온 지 얼마 되지 않았습니다. 그리고 우리 시스템에 명령어를 전달하는 것으로 보입니다.
만약 취약점이 발견된다면, 이따금 치명적인 취약점이 될 수도 있습니다.
작은 메리트(우리 손으로 명령어를 치지 않고 애플리케이션 생명 주기와 컨테이너 생명 주기를 연결해 관리하는 기능)를 위해 그런 취약점 가능성을 감수하고 싶지 않습니다.
참고로 우리가 사용하고 있는 도커 데스크톱 또한 취약점이 생길 수 있는 도구입니다. 그럼에도 사용하고 있기 때문에, spring boot docker compose support 또한 사용하고 싶다면 사용해 보셔도 됩니다.
< Prev
Next >
Subscribe to my newsletter
Read articles from Merge Simpson directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Merge Simpson
Merge Simpson
Hello, I am Korean. Welcome, visitor. You are very cool. 안녕하세요, 저는 한국어입니다. 방문자여 환영한다. 당신은 매우 시원해.