Docker 기초

Docker 기초

1. Dockerλž€?

DockerλŠ” μ»¨ν…Œμ΄λ„ˆ 기반 가상화 ν”Œλž«νΌμž…λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ·Έ μ‹€ν–‰ ν™˜κ²½μ„ νŒ¨ν‚€μ§•ν•˜μ—¬ μ–΄λ””μ„œλ“  λ™μΌν•˜κ²Œ μ‹€ν–‰ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

μ™œ Dockerλ₯Ό μ‚¬μš©ν• κΉŒμš”?

문제 상황:

개발자 A: "λ‚΄ μ»΄ν“¨ν„°μ—μ„œλŠ” λ˜λŠ”λ°μš”?"
개발자 B: "μ €λŠ” Node 18인데 μ„œλ²„λŠ” Node 16μ΄λ„€μš”..."
μš΄μ˜νŒ€: "라이브러리 버전이 λ‹¬λΌμ„œ μ—λŸ¬κ°€ λ‚˜μš”"

Docker ν•΄κ²°μ±…:

λͺ¨λ“  ν™˜κ²½μ„ μ»¨ν…Œμ΄λ„ˆλ‘œ νŒ¨ν‚€μ§• β†’ μ–΄λ””μ„œλ“  λ™μΌν•˜κ²Œ μ‹€ν–‰

Docker의 μž₯점

μž₯점 μ„€λͺ…
일관성 개발/ν…ŒμŠ€νŠΈ/운영 ν™˜κ²½ 동일
격리 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°„ 독립 μ‹€ν–‰
이식성 μ–΄λ””μ„œλ“  λ™μΌν•˜κ²Œ μ‹€ν–‰
κ²½λŸ‰ VM보닀 λΉ λ₯΄κ³  가벼움
버전 관리 μ΄λ―Έμ§€λ‘œ ν™˜κ²½ 버전 관리

2. μ»¨ν…Œμ΄λ„ˆ vs 가상머신 (VM)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚            가상머신 (VM)              μ»¨ν…Œμ΄λ„ˆ               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”     β”‚
β”‚  β”‚App Aβ”‚ β”‚App Bβ”‚ β”‚App Cβ”‚     β”‚App Aβ”‚ β”‚App Bβ”‚ β”‚App Cβ”‚     β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€     β”œβ”€β”€β”€β”€β”€β”΄β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”΄β”€β”€β”€β”€β”€β”€     β”‚
β”‚  β”‚Guestβ”‚ β”‚Guestβ”‚ β”‚Guestβ”‚     β”‚     Docker Engine    β”‚     β”‚
β”‚  β”‚ OS  β”‚ β”‚ OS  β”‚ β”‚ OS  β”‚     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€     β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”΄β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”΄β”€β”€β”€β”€β”€β”€     β”‚       Host OS        β”‚     β”‚
β”‚  β”‚     Hypervisor      β”‚     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€     β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€     β”‚      Hardware        β”‚     β”‚
β”‚  β”‚       Host OS        β”‚     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€                                  β”‚
β”‚  β”‚      Hardware        β”‚     βœ“ OS 곡유 β†’ 가볍고 빠름       β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     βœ“ 초 λ‹¨μœ„ μ‹œμž‘               β”‚
β”‚  βœ— 각 VMλ§ˆλ‹€ OS ν•„μš”          βœ“ 적은 λ¦¬μ†ŒμŠ€ μ‚¬μš©            β”‚
β”‚  βœ— λΆ„ λ‹¨μœ„ μ‹œμž‘                                            β”‚
β”‚  βœ— λ§Žμ€ λ¦¬μ†ŒμŠ€ μ‚¬μš©                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3. Docker 핡심 κ°œλ…

이미지 (Image)

  • μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§Œλ“€κΈ° μœ„ν•œ ν…œν”Œλ¦Ώ
  • 읽기 μ „μš©
  • λ ˆμ΄μ–΄ ꡬ쑰둜 ꡬ성
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Application       β”‚  ← λ‚΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚   Node.js 18        β”‚  ← λŸ°νƒ€μž„
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚   Ubuntu 22.04      β”‚  ← κΈ°λ³Έ OS
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       이미지 λ ˆμ΄μ–΄

μ»¨ν…Œμ΄λ„ˆ (Container)

  • 이미지λ₯Ό μ‹€ν–‰ν•œ μΈμŠ€ν„΄μŠ€
  • 읽기/μ“°κΈ° κ°€λŠ₯
  • 격리된 ν™˜κ²½μ—μ„œ μ‹€ν–‰
이미지 ────▢ μ»¨ν…Œμ΄λ„ˆ
(섀계도)     (μ‹€μ œ 건물)

ν•˜λ‚˜μ˜ 이미지 β†’ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆ 생성 κ°€λŠ₯

Docker Hub

  • Docker 이미지 μ €μž₯μ†Œ (GitHub 같은 μ—­ν• )
  • 곡식 이미지 제곡: nginx, node, python, mysql λ“±
  • https://hub.docker.com

4. Docker μ„€μΉ˜

macOS

Docker Desktop μ„€μΉ˜ (ꢌμž₯): 1. Docker Desktop λ‹€μš΄λ‘œλ“œ 2. DMG 파일 μ‹€ν–‰ 3. Applications ν΄λ”λ‘œ λ“œλž˜κ·Έ 4. Docker Desktop μ‹€ν–‰

Homebrew둜 μ„€μΉ˜:

brew install --cask docker

Windows

  1. Docker Desktop λ‹€μš΄λ‘œλ“œ
  2. μ„€μΉ˜ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰
  3. WSL 2 λ°±μ—”λ“œ ν™œμ„±ν™” (ꢌμž₯)
  4. μž¬μ‹œμž‘ ν›„ Docker Desktop μ‹€ν–‰

Linux (Ubuntu)

# 1. 이전 버전 제거
sudo apt remove docker docker-engine docker.io containerd runc

# 2. ν•„μš”ν•œ νŒ¨ν‚€μ§€ μ„€μΉ˜
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

# 3. Docker GPG ν‚€ μΆ”κ°€
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 4. Docker μ €μž₯μ†Œ μΆ”κ°€
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. Docker μ„€μΉ˜
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 6. μ‚¬μš©μžλ₯Ό docker 그룹에 μΆ”κ°€ (sudo 없이 μ‚¬μš©)
sudo usermod -aG docker $USER
# λ‘œκ·Έμ•„μ›ƒ ν›„ λ‹€μ‹œ 둜그인

5. μ„€μΉ˜ 확인

# Docker 버전 확인
docker --version
# 좜λ ₯ 예: Docker version 24.0.7, build afdd53b

# Docker 상세 정보
docker info

# ν…ŒμŠ€νŠΈ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
docker run hello-world

hello-world μ‹€ν–‰ κ²°κ³Ό

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image.
 4. The Docker daemon streamed that output to the Docker client.
...

6. Docker μž‘λ™ 흐름

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                                 β”‚
β”‚  docker run nginx                                               β”‚
β”‚       β”‚                                                         β”‚
β”‚       β–Ό                                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚  β”‚   Docker    │───▢│   Docker    │───▢│  Docker     β”‚         β”‚
β”‚  β”‚   Client    β”‚    β”‚   Daemon    β”‚    β”‚  Hub        β”‚         β”‚
β”‚  β”‚  (CLI)      β”‚    β”‚  (μ„œλ²„)     β”‚    β”‚ (이미지저μž₯μ†Œ)β”‚         β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
β”‚                            β”‚                  β”‚                 β”‚
β”‚                            β”‚   이미지 λ‹€μš΄λ‘œλ“œ  β”‚                 β”‚
β”‚                            β”‚β—€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚
β”‚                            β”‚                                    β”‚
β”‚                            β–Ό                                    β”‚
β”‚                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                             β”‚
β”‚                     β”‚  Container  β”‚                             β”‚
β”‚                     β”‚   (nginx)   β”‚                             β”‚
β”‚                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                             β”‚
β”‚                                                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  1. docker run λͺ…λ Ή μ‹€ν–‰
  2. Docker Clientκ°€ Docker Daemon에 μš”μ²­
  3. λ‘œμ»¬μ— 이미지 μ—†μœΌλ©΄ Docker Hubμ—μ„œ λ‹€μš΄λ‘œλ“œ
  4. μ΄λ―Έμ§€λ‘œ μ»¨ν…Œμ΄λ„ˆ 생성 및 μ‹€ν–‰

μ‹€μŠ΅ 예제

예제 1: 첫 번째 μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰

# hello-world 이미지 μ‹€ν–‰
docker run hello-world

# μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ 확인
docker ps

# λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ 확인 (μ’…λ£Œλœ 것 포함)
docker ps -a

예제 2: Nginx μ›Ήμ„œλ²„ μ‹€ν–‰

# Nginx μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ (λ°±κ·ΈλΌμš΄λ“œ)
docker run -d -p 8080:80 nginx

# λΈŒλΌμš°μ €μ—μ„œ http://localhost:8080 접속

# μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ 확인
docker ps

# μ»¨ν…Œμ΄λ„ˆ 쀑지
docker stop <μ»¨ν…Œμ΄λ„ˆID>

λͺ…λ Ήμ–΄ μš”μ•½

λͺ…λ Ήμ–΄ μ„€λͺ…
docker --version 버전 확인
docker info Docker 상세 정보
docker run 이미지 μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
docker ps μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘
docker ps -a λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘

λ‹€μŒ 단계

02_Images_and_Containers.mdμ—μ„œ 이미지와 μ»¨ν…Œμ΄λ„ˆλ₯Ό μžμ„Ένžˆ λ‹€λ€„λ΄…μ‹œλ‹€!

to navigate between lessons