[Docker Compose 란?]
여러 개의 Docker 컨테이너를 하나의 설정 파일로 정의하고 한 번에 실행 및 관리할 수 있게 해주는 도구이다.
[왜 docker-compose를 사용하는가?]
- 멀티 컨테이너 환경을 쉽게 구성한다.
웹 서버(Spring Boot), 데이터베이스(PostgreSQL) 등 여러 컨테이너를 동시에 실행해야 할 때, 각각 docker run 명령어를 수동으로 입력하는 건 번거로운 일이다. 따라서, docker-compose.yml 하나를 작성 후 docker-compose up 명령 하나면 전체 컨테이너의 실행 가능하게 된다. - 인프라 환경을 코드로 관리
서비스 설정(DB 이름, 환경변수, 볼륨, 포트 매핑)을 .yml 파일에 기록하면 설정 변경도 쉽고 공유할 때도 깔끔해진다. Git으로 관리할 수도 있기 때문에 버전 추적이 되고 어떤 게 변경되었는지 체크하기도 편리하다.
[어떻게 동작하는가?]
- docker-compose.yml 파일 작성
- 실행할 컨테이너, 이미지, 포트, 환경변수, 볼륨 등을 정의
- 명령어 실행
- docker-compose up: 정의된 서비스들을 빌드 및 실행
- docker-compose down: 실행 중인 컨테이너들을 중지 및 삭제
- 의존 관계 자동 처리
- depends_on 키워드를 이용해서 어떤 서비스가 먼저 시작되어야 하는지 지정 가능
[docker-compose.yml 작성]
아래의 docker-compose.yml은 Spring Boot + PostgreSQL 백엔드 애플리케이션을 구성하고 있다. 하나하나 뜯어보자면
최상단
Docker Compose 파일 포맷 버전을 표기하고 3.8은 현재 최신 Docker 버전에서 사용되는 버전이다.
version: '3.8'
services 블록
서비스 안에는 실행할 컨테이너 단위 서비스 목록이다. db, app, redis, nginx .. 등등 애플리케이션 구동할 때 필요한 서비스를 넣어주면 된다.
services:
db 서비스
postgreSQL을 실행하는 서비스 이름이다.
db:
image: postgres //Docker Hub의 공식 postgres 이미지를 사용
//실제로 실행될 컨테이너의 이름을 readinglog-postgres로 고정
container_name: readinglog-postgres
restart: always //컨테이너가 중지되어도 자동으로 다시 시작됨
environment: // PostgreSQL 컨테이너 실행 시 초기 환경 변수 설정
POSTGRES_DB: 디비이름
POSTGRES_USER: 사용자
POSTGRES_PASSWORD: 비밀번호
ports:
- "5430:5432" //5430포트에서 컨테이너 내부 5432로 연결 됨
volumes: //PostgreSQL 데이터 파일을 로컬 볼륨 pgdata에 영구 저장
- pgdata:/var/lib/postgresql/data
app 서비스
Spring Boot 백엔드 애플리케이션을 실행할 서비스 이름
app:
//Docker Hub에 업로드된 이미지 사용 (hennie0115 계정에 있는 readinglog-app의 최신버전)
image: hennie0115/readinglog-app:latest
container_name: readinglog-backend // 컨테이너이름 지정
restart: always
ports:
- "9091:9091"
environment:
//Spring Boot가 접속할 DB URL 지정
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/readinglog
SPRING_DATASOURCE_USERNAME: readinglog //DB 연결을 위한 사용자 정보
SPRING_DATASOURCE_PASSWORD: 사용자비밀번호
SERVER_PORT: 9091 //Spring Boot 서버의 실행 포트 지정
//환경 변수로 민감한 값(API key 등)을 받아옴
NAVER_CLIENT_ID: ${NAVER_CLIENT_ID}
KAKAO_APP_ADMIN_KEY: ${KAKAO_APP_ADMIN_KEY}
AlADIN_KEY: ${AlADIN_KEY}
depends_on:
- db //db 서비스가 먼저 실행된 다음에 app이 실행되도록 순서를 지정
volumes 설정
도커 컨테이너 데이터를 로컬에 따로 저장해두는 공간을 정의하는 것이다.
volumes:
pgdata: {}
//{} : 추가 설정 없음 -> 즉, 기본 설정으로 pgdata 라는 볼륨을 만들어줘
// pgdata는 아까 만든 db 서비스에 연결해 사용 중이다.
// 다시 말해 postgreSQL 이 저장하는 모든 데이터가
// 호스트 컴퓨터의 pgdata볼륨에 유지 된다는 뜻.
[docker-compose.yml 전체 예시]
더보기
version: '3.8'
services:
db:
image: postgres
container_name: dockertest-postgres
restart: always
environment:
POSTGRES_DB: dockertest
POSTGRES_USER: dockertest
POSTGRES_PASSWORD: dockertest
ports:
- "5430:5432"
volumes:
- pgdata:/var/lib/postgresql/data
app:
image: hennie0115/dockertest-app:latest
container_name: dockertest-backend
restart: always
ports:
- "9091:9091"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/dockertest
SPRING_DATASOURCE_USERNAME: dockertest
SPRING_DATASOURCE_PASSWORD: dockertest
SERVER_PORT: 9091
NAVER_CLIENT_ID: ${NAVER_CLIENT_ID}
NAVER_CLIENT_SECRET: ${NAVER_CLIENT_SECRET}
NAVER_REDIRECT_URI: ${NAVER_REDIRECT_URI}
KAKAO_API_KEY: ${KAKAO_API_KEY}
KAKAO_REDIRECT_URI: ${KAKAO_REDIRECT_URI}
KAKAO_APP_ADMIN_KEY: ${KAKAO_APP_ADMIN_KEY}
AlADIN_KEY: ${AlADIN_KEY}
depends_on:
- db
volumes:
pgdata: {}
'서버' 카테고리의 다른 글
GCP 가상 머신에 Nginx 리버스 프록시와 무료 SSL(Let's Encrypt) 적용해 Mixed Content 오류 없애기 (1) | 2025.06.22 |
---|---|
GCP VM 머신 CPU 사용량 급증 해결 방법 (3) | 2025.06.21 |
GCP VM 인스턴스 생성부터 SSH 키 연결, 고정 IP 설정, 방화벽 설정까지 한 번에 정리 (1) | 2025.06.13 |
GCP에 Spring Boot + PostgreSQL Docker 배포하기 (포트 설정 및 구성도 포함) (0) | 2025.06.10 |
우분투 25.04 서버에 도커 설치하기 (Ubuntu 25.04 / Plucky Puffin) (0) | 2025.06.09 |