RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

[Infra: Docker] docker compose 만들기

프로젝트 환경

이번 프로젝트에서는 Docker Compose를 이용해서 다음과 같은 개발 환경을 구성하였다.

Spring Boot
    │
    ├── PostgreSQL
    └── Redis

모든 서비스는 하나의 Docker Network 안에서 실행되고 Spring Boot는 PostgreSQL과 Redis를 내부 네트워크를 통해 통신하도록 구성했다.


Docker Compose란?

Dockerfile은 하나의 컨테이너를 만드는 방법을 정의.
실제 프로젝트에서는

  • Spring Boot
  • PostgreSQL
  • Redis
    처럼 여러 개의 컨테이너가 함께 동작해야한다. 이들을 하나의 파일에서 관리하기 위해 사용하는 것이 Dokcer Compose이다
docker compose up

이 명령어를 실행하면 Spring Boot, PostgreSQL, Redis가 모두 실행된다.


docker-compose.yml 작성하기

services:     ----> Docker Compose에서 실행할 컨테이너들을 정의하는 영역
  spring:   ---> 컨테이너 (1)
    build:
      context: . --->빌드 기준 디렉토리
      dockerfile: Dockerfile  --->사용할 Dockerfile 지정

    container_name: threeservings-server

    ports:
      - "19096:19096"  ---> 호스트 PC: 19096 -> 컨테이너: 19096

    depends_on:  ---> Spring Boot보다 PostgreSQL, Redis 컨테이너가 먼저 실행하도록
      - postgres
      - redis

    environment:
      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}

      DB_URL: ${DB_URL}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}

      REDIS_HOST: ${REDIS_HOST}
      REDIS_PORT: ${REDIS_PORT}

    restart: always   ---> 컨테이너가 종료되면 자동 재시작

  postgres:   ---> 컨테이너 (2)
    image: postgres:16  ---> Docker Hub의 공식 이미지 사용

    container_name: threeservings-db

    ports:
      - "5432:5432"

    environment:
      POSTGRES_DB: threeservings
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}

    volumes:
      - threeservings-postgres-data:/var/lib/postgresql/data

    restart: always

  redis:   ---> 컨테이너 (3)
    image: redis:7

    container_name: threeservings-redis

    ports:
      - "6379:6379"

    volumes:
      - threeservings-redis-data:/data

    restart: always

volumes:
  threeservings-postgres-data:
  threeservings-redis-data:

Docker Compose 실행 시

docker compose up --build

를 입력하면 Dockerfile을 이용해 Spring 이미지 생성


DB_URL은 무슨 URL일까?

#DB_URL
DB_URL=jdbc:postgresql://postgres:5432/threeservings

Docker에서는

Spring Container

↓

PostgreSQL Container

처럼 컨테이너끼리 통신한다.
Docker Compose는 실행 시 자동으로 하나의 Docker Network를 생성한다. 이때 postgres는 Docker Compose의 서비스 이름이다. Docker 내부 DNS가 postgres에서 PostgreSQL Container로 연결되도록 자동으로 찾아준다.


EC2에서도 그대로 사용할 수 있을까?

처음에는 EC2에서는 구매한 도메인으로 바꿔야하는 것인가? 라는 의문이 있었지만 그렇지 않았다.
EC2에서도 Spring, PostgreSQL, Redis를 Docker Compose로 실행하면 Docker Network가 다시 생성된다.

따라서

DB_URL=jdbc:postgresql://postgres:5432/threeservings

REDIS_HOST=redis

를 그대로 사용할 수 있다.

그렇다면 언제 DB_URL이 변경될까?

AWS RDS를 사용할 경우이다.

Spring -> AWS RDS

구조가 되므로

DB_URL=jdbc:postgresql://RDS주소:5432/threeservings

로 변경된다.
Redis도 ElastiCache를 사용할 경우

REDIS_HOST=Redis Endpoint

로 변경된다.


Nginx와는 무슨 관계일까?

처음에는 대여한 도메인을 DB_URL에도 사용해야 하는 줄 알았다.

하지만 역할이 다르다.

사용자

↓

api.threeservings.shop

↓

Nginx

↓

Spring

↓

PostgreSQL

도메인은

사용자가 Spring API에 접속하기 위한 주소

이다.

반면

Spring

↓

PostgreSQL

은 서버 내부 통신이다.

따라서 DB와 Redis는 도메인을 사용하지 않는다.