[CS] 1. Docker κΈ°λ³Έ

박원쀀·2025λ…„ 10μ›” 24일
post-thumbnail

🐳 Dockerλž€ 무엇인가?

1. Dockerλž€?

DockerλŠ” κ²½λŸ‰ν™”λ˜κ³  νœ΄λŒ€ κ°€λŠ₯ν•˜λ©° μΌκ΄€λœ ν™˜κ²½μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” μ˜€ν”ˆ μ†ŒμŠ€ μ»¨ν…Œμ΄λ„ˆ ν”Œλž«νΌμ΄λ‹€.

μ‰½κ²Œ 말해,

β€œκ°œλ°œμžκ°€ λ§Œλ“  ν™˜κ²½ κ·ΈλŒ€λ‘œ μ–΄λ””μ—μ„œλ“  μ‹€ν–‰λ˜λ„λ‘ ν•΄μ£ΌλŠ” κΈ°μˆ β€

✨ Dockerλ₯Ό μ‚¬μš©ν•˜λ©΄ 쒋은 이유

  • κ°œλ°œμžκ°€ ν•œ 번 λΉŒλ“œν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„
  • μ–΄λ””μ—μ„œλ“  λ™μΌν•˜κ²Œ μ‹€ν–‰ν•  수 μžˆλ‹€
  • (개발 β†’ ν…ŒμŠ€νŠΈ β†’ 운영 ν™˜κ²½ λͺ¨λ‘ 포함)

2. Docker의 μ£Όμš” μž₯점 (Key Benefits)

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν™˜κ²½ 일관성 μœ μ§€ 및 이식성 확보

λΆ„λ₯˜μ„€λͺ…μ˜ˆμ‹œ
Portability (이식성)ν™˜κ²½μ΄ 달라도 λ™μΌν•˜κ²Œ μ‹€ν–‰λ¨λ‘œμ»¬ β†’ ν…ŒμŠ€νŠΈ μ„œλ²„ β†’ ν΄λΌμš°λ“œ μ „ν™˜
Efficiency (νš¨μœ¨μ„±)VM보닀 훨씬 가벼움컀널 곡유 β†’ λ©”λͺ¨λ¦¬ μ‚¬μš© 적음
Consistency (일관성)μ‹€ν–‰ ν™˜κ²½ 자체λ₯Ό νŒ¨ν‚€μ§•β€œν™˜κ²½ 차이둜 였λ₯˜ λ°œμƒβ€ ν•΄κ²°
Scalability (ν™•μž₯μ„±)μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ‘œ μ†μ‰½κ²Œ ν™•μž₯ κ°€λŠ₯λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ / Kubernetes
Speed (속도)수 초 λ‚΄ μ‹€ν–‰VM λŒ€λΉ„ 맀우 λΉ λ₯Έ 기동 속도

3. Docker의 핡심 ꡬ성 μš”μ†Œ (Key Components)

1) Docker Engine

μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 핡심 μ—”μ§„

ꡬ성:

  • dockerd (μ„œλ²„ 데λͺ¬) : μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ & 관리
  • REST API : 도컀 κΈ°λŠ₯을 μ™ΈλΆ€μ—μ„œ μ œμ–΄ν•  수 μžˆλ„λ‘ 제곡
  • CLI (Command Line Interface) : μ‚¬μš©μžκ°€ λͺ…λ Ήμ–΄λ‘œ 도컀 μ‘°μž‘

2) Docker Image

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 싀행에 ν•„μš”ν•œ μ½”λ“œ, 라이브러리 등을 ν¬ν•¨ν•˜λŠ” 읽기 μ „μš©μ˜ 정적 μƒνƒœ

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό 싀행에 ν•„μš”ν•œ ν™˜κ²½μ΄ ν¬ν•¨λœ 읽기 μ „μš© ν…œν”Œλ¦Ώ
  • Dockerfile을 기반으둜 μƒμ„±λœλ‹€
  • 같은 μ΄λ―Έμ§€λ‘œλΆ€ν„° μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§Œλ“€ 수 있음

3) Docker Container

이미지λ₯Ό 기반으둜 μ‹€ν–‰ 쀑인 μƒνƒœ, 즉 μ΄λ―Έμ§€μ˜ μ‹€ν–‰ μΈμŠ€ν„΄μŠ€

  • 이미지λ₯Ό μ‹€ν–‰ν•œ μƒνƒœ
  • 각각 λ…λ¦½λœ ν™˜κ²½μ—μ„œ λ™μž‘ν•˜μ§€λ§Œ μ„œλ‘œ 톡신 κ°€λŠ₯
  • β€œμ‹€ν–‰ 쀑인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ·Έ μžμ²΄β€

4) Dockerfile

이미지λ₯Ό λ§Œλ“œλŠ” λ ˆμ‹œν”Ό(script)

  • ν…μŠ€νŠΈ 파일둜, 도컀 이미지λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ λͺ…령어듀을 μˆœμ„œλŒ€λ‘œ μ •μ˜
  • μ–΄λ–€ 운영체제 기반 μœ„μ— μ–΄λ–€ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ„€μΉ˜ν•˜κ³  μ–΄λ–»κ²Œ μ„€μ •ν• μ§€ 등을 λͺ…μ‹œ
#requirements.txt
flask==2.3.2
# μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν•  κΈ°λ³Έ ν™˜κ²½(Base Image)을 μ„€μ •. `python:3.13-slim` 이미지λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λ²Όμš΄ 파이썬 μ‹€ν–‰ ν™˜κ²½μ„ 기반
FROM python:3.13-slim

# μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ λͺ…λ Ήμ–΄κ°€ 싀행될 μž‘μ—… 디렉토리λ₯Ό `/app`으둜 μ„€μ •
이후 λͺ…령듀은 λͺ¨λ‘ `/app` 경둜 κΈ°μ€€μœΌλ‘œ μˆ˜ν–‰λ©λ‹ˆλ‹€.
WORKDIR /app

#ν˜„μž¬ 둜컬 ν”„λ‘œμ νŠΈ 폴더(`.`)의 λͺ¨λ“  νŒŒμΌμ„ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ `/app` 폴더에 볡사
COPY . /app

# `requirements.txt` νŒŒμΌμ— μ •μ˜λœ Python νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.
# `--no-cache-dir` : μ„€μΉ˜ κ³Όμ •μ—μ„œ μƒμ„±λ˜λŠ” μΊμ‹œ νŒŒμΌμ„ μ €μž₯ν•˜μ§€ μ•Šμ•„ 이미지 μš©λŸ‰ κ°μ†Œ 효과
# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 싀행에 ν•„μš”ν•œ 라이브러리λ₯Ό μ€€λΉ„
RUN pip install --no-cache-dir -r requirements.txt

# μ»¨ν…Œμ΄λ„ˆ μ•ˆμ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‚¬μš©ν•  ν¬νŠΈκ°€ `5000`μž„μ„ Dockerμ—κ²Œ μ•Œλ €μ€λ‹ˆλ‹€.
# > μ°Έκ³ : μ‹€μ œ μ™ΈλΆ€ 접속은 `docker run -p 5000:5000` λͺ…λ ΉμœΌλ‘œ λ§€ν•‘ν•΄μ•Ό 함
EXPOSE 5000

# μ»¨ν…Œμ΄λ„ˆκ°€ 싀행될 λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” κΈ°λ³Έ λͺ…λ Ήμž…λ‹ˆλ‹€.
# `python app.py` λ₯Ό μ˜λ―Έν•˜λ©°, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‹œμž‘μ 
CMD ["python", "app.py"]
Dockerfile λͺ…λ Ήμ—­ν• 
FROMμ‹€ν–‰ ν™˜κ²½(베이슀 이미지) μ„€μ •
WORKDIRμž‘μ—… 디렉토리 μ„€μ •
COPYμ†ŒμŠ€ μ½”λ“œ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€λ‘œ 볡사
RUN라이브러리 μ„€μΉ˜
EXPOSEμ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” 포트 정보 제곡
CMDμ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ μ‹œ μ‹€ν–‰ν•  κΈ°λ³Έ λͺ…λ Ή μ„€μ •

5) Docker Compose

μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆλ₯Ό ν•œ λ²ˆμ— μ‹€ν–‰/κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 도ꡬ
ꡬ성 파일: docker-compose.yml


6) Docker Hub

이미지λ₯Ό 곡유/배포할 수 μžˆλŠ” ν΄λΌμš°λ“œ 기반 λ ˆμ§€μŠ€νŠΈλ¦¬

  • 도컀 이미지듀을 μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λ©°, μ‚¬μš©μžλ“€μ΄ 이미지λ₯Ό κ²€μƒ‰ν•˜κ³  λ‹€μš΄λ‘œλ“œν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό 생성할 수 μžˆλ„λ‘ ν•˜λŠ” 곡개 λ˜λŠ” λΉ„κ³΅κ°œ λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλΉ„μŠ€
  • μ—… λ‚΄ 자체 λ ˆμ§€μŠ€νŠΈλ¦¬λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ 있음

4. Docker ν™œμš© 사둀 (Use Cases)

λΆ„μ•Όν™œμš© 이유
개발 & ν…ŒμŠ€νŠΈ ν™˜κ²½ ν†΅μΌν™˜κ²½ 차이 제거둜 ν˜‘μ—… ν–₯상
λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜μ„œλΉ„μŠ€λ³„ 독립 배포 및 ν™•μž₯
CI/CD νŒŒμ΄ν”„λΌμΈ μžλ™ν™”ν…ŒμŠ€νŠΈ & 배포 μžλ™ν™”
λ©€ν‹°/ν•˜μ΄λΈŒλ¦¬λ“œ ν΄λΌμš°λ“œ μš΄μ˜μ—¬λŸ¬ ν΄λΌμš°λ“œμ—μ„œ 동일 ν™˜κ²½ μ‹€ν–‰
λŒ€κ·œλͺ¨ 데이터 처리 & AISpark, ML ν”Œλž«νΌ ν™˜κ²½ ꡬ성 μžλ™ν™”

5. Docker μ›Œν¬ν”Œλ‘œμš° μ˜ˆμ‹œ

  1. Dockerfile μž‘μ„± β†’ 이미지 생성
docker build -t my-app .
  1. μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
docker run -d -p 8080:80 my-app
  1. 이미지 ν‘Έμ‹œ (원격 배포)
docker push my-app
  1. 배포 ν™˜κ²½μ—μ„œ μ‹€ν–‰ (Compose μ‚¬μš©)

βœ… μš”μ•½

κ°œλ…ν•΅μ‹¬ μ„€λͺ…
Dockerμ–΄λ””μ„œλ“  λ™μΌν•˜κ²Œ μ‹€ν–‰ κ°€λŠ₯ν•œ ν™˜κ²½ 제곡
Imageμ‹€ν–‰ ν™˜κ²½ ν¬ν•¨λœ νŒ¨ν‚€μ§€ (ν…œν”Œλ¦Ώ)
Containerμ‹€ν–‰ 쀑인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜
Dockerfile이미지 생성 λ ˆμ‹œν”Ό
Composeμ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆ 관리
Hub이미지 곡유 μ €μž₯μ†Œ

DockerλŠ” ν™˜κ²½ 톡일 + ν™•μž₯μ„± + 이식성

0개의 λŒ“κΈ€