11b Dockerfile 작성 📚 전체 맵 12a 용어사전 Java편
Series 11 · Docker · 3/3

COMPOSE
UP
DONE

docker-compose.yml 완전 해설 · 한 번에 3개 컨테이너 실행
자주 쓰는 명령어 · 트러블슈팅 · AWS 확장 로드맵

11a 개념·핵심 요소 11b Dockerfile 작성 11c docker-compose·실행
01~10 Java·Spring·JPA·Bean 11 Docker 12 용어사전·면접Q&A
이 파일의 학습 목적
11c — docker-compose.yml 완전 해설 · 실행 · 명령어

docker-compose up --build 한 줄로 MariaDB · Spring Boot · React 3개가 동시에 실행된다. docker-compose.yml의 구조를 한 줄씩 이해하고, 자주 쓰는 명령어와 트러블슈팅까지 완전히 정리한다.

이 파일에서 배울 것
  • docker-compose.yml 구조 — services · volumes · networks
  • MariaDB 서비스 — healthcheck + 볼륨 설정
  • Spring Boot 서비스 — depends_on + 환경변수 주입
  • React(Nginx) 서비스 — ports 3000:80
  • 자주 쓰는 명령어 + 트러블슈팅
프로젝트 코드 연결
  • · docker-compose up --build — 첫 실행
  • · condition: service_healthy — 시작 순서 보장
  • · docker-compose logs -f springboot
  • · docker-compose down -v — DB 완전 초기화
시리즈 순서: 11a·11b → 11c ← 지금 여기 → glossary 용어사전
01 — docker-compose.yml이란?
여러 컨테이너를 한번에 정의하고 실행하는 설정 파일
🎼 파일 위치 — 프로젝트 최상위
프로젝트루트/
├── board/ (Spring Boot)
│ ├── src/
│ ├── build.gradle
│ └── Dockerfile
├── board-frontend/ (React)
│ ├── src/
│ ├── package.json
│ ├── Dockerfile
│ └── nginx.conf
└── docker-compose.yml ← 여기에 생성
02 — docker-compose.yml 완전 해설
MariaDB · Spring Boot · React(Nginx) 3개 서비스 정의
YAML — docker-compose.yml 전체 (한 줄씩 해설 포함)
version: '3.8'

services:

# ═══ MariaDB ══════════════════════════════════════════
mariadb:
image: mariadb:10.11 # Docker Hub에서 이미지 가져옴
container_name: mariadb # 컨테이너 이름 (다른 컨테이너가 이 이름으로 접근)
environment: # 환경변수 설정
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: boarddb # 시작 시 자동으로 DB 생성
MYSQL_USER: boarduser
MYSQL_PASSWORD: board1234
ports:
- '3306:3306' # 내PC:3306 → 컨테이너:3306
volumes:
- mariadb_data:/var/lib/mysql # DB 데이터 영구 보존
networks:
- board-network
healthcheck: # MariaDB 준비됐는지 확인
test: ['CMD', 'healthcheck.sh', '--connect', '--innodb_initialized']
interval: 10s
timeout: 5s
retries: 5

# ═══ Spring Boot ══════════════════════════════════════
springboot:
build:
context: ./board # board/ 폴더의 Dockerfile로 빌드
container_name: springboot
environment:
# application.properties의 환경변수를 여기서 주입
SPRING_DATASOURCE_URL: jdbc:mariadb://mariadb:3306/boarddb
# localhost 대신 컨테이너 이름 'mariadb' 사용!
SPRING_DATASOURCE_USERNAME: boarduser
SPRING_DATASOURCE_PASSWORD: board1234
JWT_SECRET: mySecretKeyForJWTTokenGenerationAndValidation2024
ADMIN_CODE: ADMIN2024
ports:
- '8080:8080'
depends_on:
mariadb:
condition: service_healthy # MariaDB 완전히 준비된 후 Spring Boot 시작
networks:
- board-network

# ═══ React (Nginx) ════════════════════════════════════
react:
build:
context: ./board-frontend # board-frontend/ 폴더의 Dockerfile로 빌드
container_name: react
ports:
- '3000:80' # 내PC:3000 → 컨테이너:80(Nginx)
depends_on:
- springboot
networks:
- board-network

# ═══ 볼륨 · 네트워크 선언 ════════════════════════════════
volumes:
mariadb_data: # MariaDB 데이터 영구 저장

networks:
board-network: # 컨테이너들이 이름으로 통신
driver: bridge
💡 depends_on + healthcheck 콤보
MariaDB가 실행 중이어도 완전히 준비되기까지 시간이 걸림
healthcheck로 "진짜 준비됐는지" 확인 후 → Spring Boot 시작
condition: service_healthy 없으면 Spring Boot가 DB 연결 실패 에러 발생 가능
03 — 로컬 실행 순서
체크리스트 → 빌드 → 실행 → 확인
▶️ 실행 전 체크리스트
1
Docker Desktop 실행 중 확인
작업표시줄 오른쪽 고래 아이콘이 떠있어야 함
2
기존 프로세스 종료 (포트 충돌 방지)
IntelliJ Spring Boot 종료 / npm start React 종료 / MariaDB 서비스 중지
3
프로젝트 루트 폴더로 이동
cd C:/Users/.../프로젝트루트
4
빌드 + 실행
docker-compose up --build — 처음 실행 시 5~10분 소요 (이미지 다운로드 + 빌드)
5
브라우저 접속 확인
http://localhost:3000 (React) · http://localhost:8080/api/board/list (Spring Boot API)
터미널 — 실행 로그 확인
# 정상 실행 시 로그에 이렇게 뜸:
mariadb | ready for connections → MariaDB 준비 완료
springboot | Started BoardApplication → Spring Boot 시작
react | /docker-entrypoint.sh → Nginx 시작
04 — 자주 쓰는 명령어 정리
docker-compose · docker — 개발하면서 매일 쓰는 것들
⌨️ docker-compose 명령어
# 빌드 + 실행 (처음 또는 코드 변경 시)
docker-compose up --build

# 백그라운드로 실행 (터미널 차지 안 함)
docker-compose up -d --build

# 실행 중인 컨테이너 상태 확인
docker-compose ps

# 로그 보기
docker-compose logs
docker-compose logs springboot # 특정 서비스만
docker-compose logs -f # 실시간으로 (-f = follow)

# 중지
docker-compose stop

# 중지 + 컨테이너 삭제
docker-compose down

# 중지 + 컨테이너 + 볼륨 삭제 (DB 데이터 완전 초기화)
docker-compose down -v

# 재시작
docker-compose restart
docker-compose restart springboot # 특정 서비스만
🐳 docker 명령어 (개별 컨테이너 관리)
# 실행 중인 컨테이너 목록
docker ps

# 모든 컨테이너 목록 (중지된 것 포함)
docker ps -a

# 컨테이너 안에 접속 (bash 쉘)
docker exec -it springboot bash
docker exec -it mariadb bash

# MariaDB 컨테이너에서 DB 직접 접속
docker exec -it mariadb mariadb -u boarduser -p boarddb

# 이미지 목록
docker images

# 이미지 삭제
docker rmi 이미지명

# 사용하지 않는 것들 정리 (이미지·컨테이너·볼륨)
docker system prune
05 — 자주 발생하는 문제 해결
막힐 때 여기서 확인
문제원인해결
포트 already in use기존 프로그램이 포트 사용 중기존 Spring Boot·MariaDB 종료
Spring Boot 연결 실패MariaDB 아직 준비 안됨잠시 기다리면 자동 재시도
이미지 빌드 실패코드 오류 또는 Java 버전로그 확인 후 코드 수정
React 빈 화면빌드 오류 또는 API URL 문제브라우저 콘솔(F12) 확인
DB 데이터 사라짐볼륨 없이 컨테이너 삭제docker-compose.yml volumes 설정 확인
⚠️ 가장 흔한 실수 — MariaDB 서비스 종료 안 함
로컬에 설치된 MariaDB가 3306 포트를 이미 쓰고 있으면 컨테이너 실행 실패
→ Windows 서비스에서 MariaDB 중지 후 다시 실행
06 — Docker 시리즈 전체 정리 + 다음 단계
11a~11c 핵심 요약 · AWS EC2 배포 로드맵
11a
Docker 개념
이미지 = 틀
컨테이너 = 실행
볼륨 = 데이터 보존
네트워크 = 이름으로 통신
11b
Dockerfile
멀티스테이지 빌드
Spring Boot 2단계
React + Nginx
/api/ 프록시
11c
docker-compose
3개 서비스 한번에
depends_on + healthcheck
환경변수 주입
명령어 정리
11b Dockerfile 작성 📚 전체 맵 12a 용어사전 Java편