Series 11 · Docker · 3/3
COMPOSE
UP
DONE
docker-compose.yml 완전 해설 · 한 번에 3개 컨테이너 실행
자주 쓰는 명령어 · 트러블슈팅 · AWS 확장 로드맵
11a 개념·핵심 요소
11b Dockerfile 작성
11c docker-compose·실행
이 파일의 학습 목적
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/
│ ├── src/
│ ├── build.gradle
│ └── Dockerfile
├── board-frontend/
│ ├── 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:
image: mariadb:10.11
container_name: mariadb
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: boarddb
MYSQL_USER: boarduser
MYSQL_PASSWORD: board1234
ports:
- '3306:3306'
volumes:
- mariadb_data:/var/lib/mysql
networks:
- board-network
healthcheck:
test: ['CMD', 'healthcheck.sh', '--connect', '--innodb_initialized']
interval: 10s
timeout: 5s
retries: 5
springboot:
build:
context: ./board
container_name: springboot
environment:
SPRING_DATASOURCE_URL: jdbc:mariadb://mariadb:3306/boarddb
SPRING_DATASOURCE_USERNAME: boarduser
SPRING_DATASOURCE_PASSWORD: board1234
JWT_SECRET: mySecretKeyForJWTTokenGenerationAndValidation2024
ADMIN_CODE: ADMIN2024
ports:
- '8080:8080'
depends_on:
mariadb:
condition: service_healthy
networks:
- board-network
react:
build:
context: ./board-frontend
container_name: react
ports:
- '3000:80'
depends_on:
- springboot
networks:
- board-network
volumes:
mariadb_data:
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
springboot | Started BoardApplication
react | /docker-entrypoint.sh
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
docker-compose stop
docker-compose down
docker-compose down -v
docker-compose restart
docker-compose restart springboot
🐳
docker 명령어 (개별 컨테이너 관리)
docker ps
docker ps -a
docker exec -it springboot bash
docker exec -it mariadb bash
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
환경변수 주입
명령어 정리
🚀 다음 단계 — AWS EC2 배포
1. AWS EC2 인스턴스 생성 (무료 t2.micro)
2. EC2에 Docker 설치
3. GitHub에서 코드 받기 (git clone)
4. docker-compose up --build → 로컬에서 한 것과 완전히 동일!
5. 공인 IP로 접속 확인 → http://EC2공인IP:3000
로컬에서 Docker를 완벽하게 이해하면 — AWS 배포는 환경만 다를 뿐 과정은 동일!