10b 어노테이션 완전 정리 📚 전체 맵 11b Dockerfile 작성
Series 11 · Docker · 1/3

DOCKER
CONCEPT
CORE

Docker가 뭔지 · 왜 쓰는지 · 이미지·컨테이너·볼륨·네트워크
4차 프로젝트의 핵심 인프라 기술 완전 이해

11a 개념·핵심 요소 11b Dockerfile 작성 11c docker-compose·실행
01~10 Java·Spring·JPA·Bean 11 Docker 12 용어사전·면접Q&A
이 파일의 학습 목적
11a — Docker란? · 이미지 · 컨테이너 · 볼륨 · 네트워크

"내 PC에서는 됐는데 서버에서 왜 안 돼?" — Docker는 이 문제를 해결한다. 앱과 실행 환경을 하나의 컨테이너로 묶어 어디서든 동일하게 실행되게 한다. 11a는 Docker의 4가지 핵심 개념을 완전히 이해하는 것이 목표다.

이 파일에서 배울 것
  • Docker란? — 소프트웨어용 이삿짐 컨테이너
  • 일반 설치 vs Docker — 4차 프로젝트의 변화
  • Image — 틀(설계도), 읽기 전용
  • Container — 이미지로 실행한 실제 프로세스
  • Volume · Network — 데이터 보존·컨테이너 간 통신
프로젝트 코드 연결
  • · docker-compose up — 3개 컨테이너 한 번에
  • · mariadb:10.11 / nginx:alpine 이미지
  • · mariadb_data 볼륨 — DB 데이터 영구 보존
  • · board-network — 컨테이너 이름으로 통신
시리즈 순서: 10 Bean·어노테이션 → 11a ← 지금 여기 → 11b Dockerfile 작성
01 — Docker란?
"내 컴퓨터에서는 됐는데 서버에서 왜 안 돼?" — 이 문제를 해결하는 기술
🐳 Docker = 소프트웨어용 이삿짐 컨테이너 Docker
📦 비유 — 이삿짐 컨테이너
컨테이너 없이 이사: 가구·가전·옷을 각각 따로 포장 → 새 집에서 다시 조립·설정 → 분실·파손 위험
컨테이너로 이사: 모든 짐을 컨테이너 하나에 통째로 → 어디서든 똑같이 동작

Docker = 소프트웨어용 컨테이너
내 앱 + 필요한 모든 환경(Java, Node.js, 설정 등)을 컨테이너 하나에 포장
→ 어느 컴퓨터에서든 docker run 하면 바로 실행!
문제Docker 해결
"내 PC는 되는데 서버에선 안 돼"컨테이너 안에 환경까지 포함 → 어디서든 동일 실행
MariaDB·Java·Node.js 설치 복잡docker run 한 줄로 바로 실행
개발/운영 환경 달라서 버그 발생동일한 컨테이너로 모든 환경 통일
프로그램 삭제 후 찌꺼기 남음docker rm → 컨테이너 완전 삭제, 흔적 없음
02 — Docker vs 일반 설치
우리 프로젝트 기준 — 1~3차 vs 4차(Docker)
⚖️ 4차 이전 vs 4차 이후
❌ 1~3차 — 일반 설치
1. IntelliJ에서 Spring Boot 실행
  → Java 21 직접 설치 필요
2. npm start로 React 실행
  → Node.js 직접 설치 필요
3. MariaDB 직접 설치
  → DB·계정 직접 생성

세 개를 각각 따로 실행
다른 PC에서 다시 다 설치해야 함
✅ 4차 — Docker
docker-compose up 명령어 하나!

→ Spring Boot 컨테이너 자동 실행
→ React 컨테이너 자동 실행
→ MariaDB 컨테이너 자동 실행

Java·Node.js·MariaDB 직접 설치 불필요
다른 PC에서도 up 하면 끝
AWS 서버에도 똑같이 올리면 됨
항목일반 설치Docker
실행 방법각각 따로 실행 (3번)docker-compose up 1번
환경 설치Java·Node.js·MariaDB 직접Docker Desktop만 설치
다른 PC 이동다시 다 설치해야 함docker-compose up 하면 끝
AWS 배포서버에 다 설치해야 함Docker만 설치 후 동일하게
버전 충돌PC 설치 버전과 충돌 가능컨테이너 안에서 독립적으로
03 — Docker 핵심 개념 4가지
이미지 · 컨테이너 · 볼륨 · 네트워크 — 반드시 이해해야 할 4요소
🖼️
Image
컨테이너 만드는 설계도·틀
읽기 전용
📦
Container
이미지로 실행한
실제 프로세스
💾
Volume
컨테이너 밖에 데이터
영구 보존
🔗
Network
컨테이너끼리
이름으로 통신
🖼️ Image — 이미지 설계도
🐟 비유 — 붕어빵 틀
틀(이미지) 하나로 붕어빵(컨테이너) 여러 개 만들 수 있음
틀 자체는 변하지 않음 (읽기 전용)
이미지는 Docker Hub(hub.docker.com) 에서 받아옴 → npm registry처럼
예시 — 주요 이미지
mariadb:10.11 # MariaDB 10.11 버전 이미지
node:18-alpine # Node.js 18 + 가벼운 Alpine Linux
openjdk:21-slim # Java 21 이미지 (slim = 최소 용량)
nginx:alpine # Nginx 웹서버 (가벼운 버전)

# Dockerfile = 나만의 이미지 만드는 레시피
# → 기존 이미지 기반으로 내 코드를 추가해서 새 이미지 생성
📦 Container — 컨테이너 실행 인스턴스
🐟 비유 — 붕어빵
틀(이미지)로 굽는 것 = docker run → 실제 붕어빵(컨테이너)
붕어빵은 먹으면(삭제하면) 없어짐 → 틀(이미지)은 그대로 남음
컨테이너 삭제 = 안의 데이터도 사라짐 → 데이터 유지는 볼륨 필요
터미널 — 컨테이너 실행 기본
# 이미지로 컨테이너 실행
docker run mariadb:10.11

# 우리 프로젝트는 docker-compose가 자동으로 해줌
# → docker-compose up 한 번에 3개 컨테이너 동시 실행
💾 Volume — 볼륨 데이터 영구 보존
💽 비유 — 외장하드
컴퓨터(컨테이너) 바꿔도 외장하드(볼륨)에 있는 데이터는 그대로
MariaDB 컨테이너 삭제 → DB 데이터 사라짐!
→ 볼륨 사용: DB 데이터를 컨테이너 밖(PC)에 저장 → 컨테이너 삭제해도 데이터 유지
docker-compose.yml — 볼륨 설정
# docker-compose.yml에서
services:
mariadb:
volumes:
- mariadb_data:/var/lib/mysql
# PC의 mariadb_data ↔ 컨테이너 안 /var/lib/mysql 연결
# 컨테이너 삭제해도 mariadb_data 볼륨은 유지됨

volumes:
mariadb_data: # 볼륨 선언
⚠️ docker-compose down -v
-v 플래그를 붙이면 볼륨도 같이 삭제됨 → DB 데이터 완전 초기화
DB를 초기화하고 싶을 때만 사용, 평소엔 -v 없이 down만 사용
🔗 Network — 네트워크 컨테이너 간 통신
🏢 비유 — 사내 내선전화
같은 회사(네트워크) 사람끼리는 이름만으로 전화 가능
→ Spring Boot 컨테이너에서 MariaDB 컨테이너로
localhost 대신 컨테이너 이름 mariadb로 접근
비교 — localhost vs 컨테이너 이름
# 기존 application.properties
spring.datasource.url=jdbc:mariadb://localhost:3306/boarddb

# Docker 환경 — 컨테이너 이름으로 접근!
spring.datasource.url=jdbc:mariadb://mariadb:3306/boarddb
# ↑ 컨테이너 이름

# docker-compose.yml에서 같은 네트워크로 묶으면
# 컨테이너 이름이 자동으로 DNS 역할을 함
04 — Docker Desktop 설치 및 확인
Windows 기준 — Docker Desktop만 설치하면 끝
🖥️ 설치 순서
터미널 — 설치 확인 명령어
# Docker 버전 확인
docker --version
# Docker version 24.x.x 뜨면 성공

# Docker Compose 버전 확인
docker-compose --version
# Docker Compose version 2.x.x 뜨면 성공

# 설치 정상 동작 확인
docker run hello-world
# 'Hello from Docker!' 메시지 뜨면 완벽하게 설치됨
💡 Docker Desktop은 무료
개인 사용 및 소규모 팀은 무료로 사용 가능
설치 후 작업표시줄 오른쪽에 고래 아이콘이 뜨면 정상 실행 중
10b 어노테이션 완전 정리 📚 전체 맵 11b Dockerfile 작성