[특화 프로젝트]Docker 인프라 세팅하는 법

2026. 3. 16. 00:27📚 빅데이터 분산

빅데이터 분산 처리 프로젝트 - On My Guide Docker 인프라 세팅

프로젝트 개요

외국인 관광객을 위한 여행지 추천 시스템의 백엔드를 개발하는 프로젝트다.
사용자 행동 로그를 수집하고, 빅데이터 분산 처리를 통해 "나와 비슷한 여행자들의 선호 여행지"를 분석하여 추천하는 것이 목표다.

기술 스택

  • Java 17 / Spring Boot 3.0.5 / Spring Security 6
  • PostgreSQL — 분석 결과 저장용 RDB
  • Hadoop (HDFS) — 대용량 사용자 로그 적재
  • Spark — 배치 분산 처리 (군집 분석)
  • Kafka — 로그 이벤트 스트리밍

전체 데이터 파이프라인

사용자 행동 (GO, 상세보기, 재추천)
    ↓
Kafka (로그 이벤트 스트림)
    ↓
Spring Consumer (Kafka 메시지 수신)
    ↓
HDFS (사용자 로그 적재)
    ↓
Spark 배치 처리 (새벽 4시, 군집 분석)
    ↓
PostgreSQL (분석 결과 저장)
    ↓
조회 API → 클라이언트에 추천 장소 반환

왜 Docker를 사용하는가?

이 프로젝트에는 PostgreSQL, Hadoop, Spark, Kafka 등 여러 인프라가 필요하다.
이걸 하나하나 로컬에 직접 설치하면 버전 충돌, 환경 차이, 삭제 시 찌꺼기 등의 문제가 발생한다.

Docker는 각 프로그램을 격리된 컨테이너에서 실행하는 도구다.
Docker Compose는 여러 컨테이너를 docker-compose.yml 파일 하나로 관리할 수 있게 해준다.

docker-compose up -d    # 전부 실행
docker-compose down     # 전부 종료

💡 docker-compose.yml을 수정한 뒤 docker-compose up -d를 다시 실행하면,
변경된 컨테이너만 재시작되고 기존 컨테이너는 유지된다.


1. PostgreSQL 컨테이너 세팅

가장 먼저 분석 결과를 저장할 PostgreSQL을 띄웠다.

docker-compose.yml (PostgreSQL만)

services:
  postgres:
    image: postgres:15
    container_name: travel-postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: travel_db
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin1234
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

주요 설정 설명

항목 설명
image: postgres:15 PostgreSQL 15 버전 이미지 사용
ports: "5432:5432" 호스트의 5432 포트를 컨테이너의 5432 포트에 매핑. Spring Boot에서 localhost:5432로 접속 가능
environment DB 이름, 사용자, 비밀번호를 환경변수로 설정. 컨테이너 최초 실행 시 자동 생성됨
volumes 컨테이너를 종료해도 데이터가 유지되도록 볼륨 마운트

동작 확인

# 실행
docker-compose up -d

# PostgreSQL 접속
docker exec -it travel-postgres psql -U admin -d travel_db

# 데이터베이스 목록 확인
\l

# 종료
\q

travel_db가 목록에 표시되면 성공이다.


2. Hadoop (HDFS) 컨테이너 세팅

사용자 로그를 대량으로 적재할 HDFS를 추가했다.

HDFS란?

HDFS(Hadoop Distributed File System)는 대용량 파일을 분산 저장하는 파일 시스템이다.
두 가지 역할로 구성된다.

  • NameNode — 파일이 어디에 저장되어 있는지 관리하는 메타데이터 서버 (전화번호부 역할)
  • DataNode — 실제 데이터가 저장되는 스토리지 노드 (창고 역할)

docker-compose.yml에 추가

  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
    container_name: travel-namenode
    ports:
      - "9870:9870"
      - "9000:9000"
    environment:
      CLUSTER_NAME: travel-cluster
      CORE_CONF_fs_defaultFS: hdfs://namenode:9000
    volumes:
      - namenode_data:/hadoop/dfs/name

  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    container_name: travel-datanode
    depends_on:
      - namenode
    environment:
      SERVICE_PRECONDITION: "namenode:9870"
      CORE_CONF_fs_defaultFS: hdfs://namenode:9000
    volumes:
      - datanode_data:/hadoop/dfs/data

주요 설정 설명

항목 설명
9870 포트 Hadoop 웹 관리 화면 (http://localhost:9870)
9000 포트 HDFS 파일 읽기/쓰기용 포트 (Spring Boot, Spark에서 사용)
CORE_CONF_fs_defaultFS HDFS의 기본 파일시스템 주소 설정. 이 설정이 없으면 Windows 환경에서 경로 인식 에러 발생
depends_on DataNode는 NameNode가 먼저 실행된 후에 시작
SERVICE_PRECONDITION NameNode가 완전히 준비될 때까지 DataNode가 대기

동작 확인

# 실행
docker-compose up -d

# 웹 브라우저에서 확인
# http://localhost:9870 접속 → Hadoop Overview 화면이 뜨면 성공

# HDFS에 테스트 파일 저장
docker exec -it travel-namenode bash -c "echo 'hello hdfs' > /tmp/test.txt && hdfs dfs -mkdir -p /test && hdfs dfs -put /tmp/test.txt /test/"

# 파일 확인
docker exec -it travel-namenode hdfs dfs -ls hdfs://namenode:9000/test/

⚠️ Windows Git Bash 사용 시 주의

Git Bash는 /를 Windows 경로(C:\)로 자동 변환하는 이슈가 있다.
hdfs dfs -ls / 명령어 실행 시 No FileSystem for scheme "C" 에러가 발생하면,
전체 HDFS 주소를 명시하면 된다.

# 에러 발생
docker exec -it travel-namenode hdfs dfs -ls /

# 해결 방법 1: 전체 주소 명시
docker exec -it travel-namenode hdfs dfs -ls hdfs://namenode:9000/

# 해결 방법 2: 경로 변환 비활성화
MSYS_NO_PATHCONV=1 docker exec -it travel-namenode hdfs dfs -ls /


3. Spark 컨테이너 세팅

HDFS에 적재된 로그 데이터를 분석할 Spark를 추가했다.

Spark란?

Spark는 대용량 데이터를 여러 노드에서 병렬로 분석하는 분산 처리 엔진이다.
이 프로젝트에서는 매일 새벽 4시에 HDFS의 사용자 로그를 읽어 군집 분석(성별, 나이, 국적 기반 그룹핑)을 수행한다.

  • Master — 작업을 분배하는 관리 노드
  • Worker — 실제 연산을 수행하는 실행 노드

docker-compose.yml에 추가

  spark-master:
    image: bde2020/spark-master:3.1.1-hadoop3.2
    container_name: travel-spark-master
    ports:
      - "8080:8080"
      - "7077:7077"
    environment:
      CORE_CONF_fs_defaultFS: hdfs://namenode:9000

  spark-worker:
    image: bde2020/spark-worker:3.1.1-hadoop3.2
    container_name: travel-spark-worker
    depends_on:
      - spark-master
    environment:
      SPARK_MASTER: spark://spark-master:7077
      CORE_CONF_fs_defaultFS: hdfs://namenode:9000

주요 설정 설명

항목 설명
8080 포트 Spark 웹 관리 화면 (http://localhost:8080)
7077 포트 Master-Worker 간 내부 통신 포트
SPARK_MASTER Worker에게 Master의 주소를 알려주는 설정
CORE_CONF_fs_defaultFS Spark가 HDFS에 접근할 수 있도록 주소 설정

동작 확인

# 실행
docker-compose up -d

# 컨테이너 상태 확인 (5개 모두 Up 상태여야 함)
docker ps

# 웹 브라우저에서 확인
# http://localhost:8080 접속 → Spark Master 화면에서 Workers(1) 확인

Status가 ALIVE이고 Workers가 1로 표시되면 성공이다.


최종 docker-compose.yml

services:
  postgres:
    image: postgres:15
    container_name: travel-postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: travel_db
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin1234
    volumes:
      - postgres_data:/var/lib/postgresql/data

  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
    container_name: travel-namenode
    ports:
      - "9870:9870"
      - "9000:9000"
    environment:
      CLUSTER_NAME: travel-cluster
      CORE_CONF_fs_defaultFS: hdfs://namenode:9000
    volumes:
      - namenode_data:/hadoop/dfs/name

  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
    container_name: travel-datanode
    depends_on:
      - namenode
    environment:
      SERVICE_PRECONDITION: "namenode:9870"
      CORE_CONF_fs_defaultFS: hdfs://namenode:9000
    volumes:
      - datanode_data:/hadoop/dfs/data

  spark-master:
    image: bde2020/spark-master:3.1.1-hadoop3.2
    container_name: travel-spark-master
    ports:
      - "8080:8080"
      - "7077:7077"
    environment:
      CORE_CONF_fs_defaultFS: hdfs://namenode:9000

  spark-worker:
    image: bde2020/spark-worker:3.1.1-hadoop3.2
    container_name: travel-spark-worker
    depends_on:
      - spark-master
    environment:
      SPARK_MASTER: spark://spark-master:7077
      CORE_CONF_fs_defaultFS: hdfs://namenode:9000

volumes:
  postgres_data:
  namenode_data:
  datanode_data:

관리 대시보드 접속 정보

서비스 URL 용도
Hadoop HDFS http://localhost:9870 HDFS 상태 및 파일 시스템 모니터링
Spark Master http://localhost:8080 Spark 작업 상태 및 Worker 모니터링
PostgreSQL localhost:5432 DB 클라이언트 접속 (DBeaver 등)

재밌다 빅데이터 분산하길 잘했다.