Series 11 · Docker · 1/3
DOCKER
CONCEPT
CORE
Docker가 뭔지 · 왜 쓰는지 · 이미지·컨테이너·볼륨·네트워크
4차 프로젝트의 핵심 인프라 기술 완전 이해
11a 개념·핵심 요소
11b Dockerfile 작성
11c docker-compose·실행
이 파일의 학습 목적
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
컨테이너 밖에 데이터
영구 보존
🖼️
Image — 이미지
설계도
🐟 비유 — 붕어빵 틀
틀(이미지) 하나로 붕어빵(컨테이너) 여러 개 만들 수 있음
틀 자체는 변하지 않음 (읽기 전용)
이미지는 Docker Hub(hub.docker.com) 에서 받아옴 → npm registry처럼
예시 — 주요 이미지
mariadb:10.11
node:18-alpine
openjdk:21-slim
nginx:alpine
📦
Container — 컨테이너
실행 인스턴스
🐟 비유 — 붕어빵
틀(이미지)로 굽는 것 = docker run → 실제 붕어빵(컨테이너)
붕어빵은 먹으면(삭제하면) 없어짐 → 틀(이미지)은 그대로 남음
컨테이너 삭제 = 안의 데이터도 사라짐 → 데이터 유지는 볼륨 필요
터미널 — 컨테이너 실행 기본
docker run mariadb:10.11
💾
Volume — 볼륨
데이터 영구 보존
💽 비유 — 외장하드
컴퓨터(컨테이너) 바꿔도 외장하드(볼륨)에 있는 데이터는 그대로
MariaDB 컨테이너 삭제 → DB 데이터 사라짐!
→ 볼륨 사용: DB 데이터를 컨테이너 밖(PC)에 저장 → 컨테이너 삭제해도 데이터 유지
docker-compose.yml — 볼륨 설정
services:
mariadb:
volumes:
- mariadb_data:/var/lib/mysql
volumes:
mariadb_data:
⚠️ docker-compose down -v
-v 플래그를 붙이면 볼륨도 같이 삭제됨 → DB 데이터 완전 초기화
DB를 초기화하고 싶을 때만 사용, 평소엔 -v 없이 down만 사용
🔗
Network — 네트워크
컨테이너 간 통신
🏢 비유 — 사내 내선전화
같은 회사(네트워크) 사람끼리는 이름만으로 전화 가능
→ Spring Boot 컨테이너에서 MariaDB 컨테이너로
→ localhost 대신 컨테이너 이름 mariadb로 접근
비교 — localhost vs 컨테이너 이름
spring.datasource.url=jdbc:mariadb://localhost:3306/boarddb
spring.datasource.url=jdbc:mariadb://mariadb:3306/boarddb
📌 우리 4차 프로젝트 네트워크 구조
모든 컨테이너를 board-network로 묶음
springboot → mariadb 이름으로 DB 접근
react(Nginx) → springboot 이름으로 API 프록시
04 — Docker Desktop 설치 및 확인
Windows 기준 — Docker Desktop만 설치하면 끝
🖥️
설치 순서
터미널 — 설치 확인 명령어
docker --version
docker-compose --version
docker run hello-world
💡 Docker Desktop은 무료
개인 사용 및 소규모 팀은 무료로 사용 가능
설치 후 작업표시줄 오른쪽에 고래 아이콘이 뜨면 정상 실행 중