3 minute read

Chapter 1. 가상화 기술과 μ»¨ν…Œμ΄λ„ˆ 가상화

ν•΄λ‹Ή ν¬μŠ€νŠΈλŠ” κ΅° 볡무 쀑 γ€Žκ°œλ°œμžλ₯Ό μœ„ν•œ μ‰¬μš΄ 도컀』λ₯Ό 읽고 ν•™μŠ΅ν•œ λ‚΄μš©μ„ 개인적으둜 μ •λ¦¬ν•œ 글을 μƒμ„±ν˜• AIλ₯Ό 톡해 1μ°¨ κ°€κ³΅ν•œ κΈ€μž…λ‹ˆλ‹€.

μš°μ„  DockerλŠ” μ„œλ²„μ™€ 깊게 μ—°κ΄€λœ 기술이기 λ•Œλ¬Έμ— μ—”ν„°ν”„λΌμ΄μ¦ˆ ν™˜κ²½μ—μ„œ μ„œλ²„λ₯Ό μš΄μ˜ν•˜λŠ” 방식에 λŒ€ν•΄ λ¨Όμ € μ†Œκ°œν•˜κ³  κ°€κ² μŠ΅λ‹ˆλ‹€.

1. μ„œλ²„ 운영 방식과 가상화 기술

μ„œλ²„μ—μ„œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‹€ν–‰ν•˜λŠ” λ°©μ‹μ—λŠ” λ² μ–΄λ©”νƒˆ, ν•˜μ΄νΌλ°”μ΄μ €λ₯Ό μ΄μš©ν•œ 가상머신, μ»¨ν…Œμ΄λ„ˆ 등이 μžˆμŠ΅λ‹ˆλ‹€.

1.1. λ² μ–΄λ©”νƒˆ(Bare Metal)

물리적인 ν•˜λ“œμ›¨μ–΄μ— OSλ₯Ό 직접 μ„€μΉ˜ν•˜κ³ , ν•΄λ‹Ή OS μœ„μ—μ„œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‹€ν–‰ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     Application     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚     Operating OS    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚       Hardware      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

1.2. ν•˜μ΄νΌλ°”μ΄μ €(Hypervisor)

ν•˜λ‚˜μ˜ 물리적 μ‹œμŠ€ν…œμ—μ„œ μ—¬λŸ¬ 가상머신을 μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 가상화 κΈ°μˆ μž…λ‹ˆλ‹€.

ν•˜μ΄νΌλ°”μ΄μ €λŠ” 각 가상머신에 CPU, λ©”λͺ¨λ¦¬ λ“±μ˜ λ¦¬μ†ŒμŠ€λ₯Ό ν• λ‹Ήν•˜κ³ , 가상 ν•˜λ“œμ›¨μ–΄μ— λŒ€ν•œ 접근을 κ΄€λ¦¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

ν•˜μ΄νΌλ°”μ΄μ €λŠ” ν•˜λ“œμ›¨μ–΄ μœ„μ—μ„œ 직접 μ‹€ν–‰λ˜λŠ” 방식(Type 1)κ³Ό 호슀트 OS μœ„μ—μ„œ μ‹€ν–‰λ˜λŠ” 방식(Type 2)으둜 κ΅¬λΆ„λ©λ‹ˆλ‹€.

λ‹€μŒμ€ Type 1 ν•˜μ΄νΌλ°”μ΄μ €λ₯Ό κΈ°μ€€μœΌλ‘œ ν•œ κ΅¬μ‘°μž…λ‹ˆλ‹€.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Application  β”‚ Application  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Guest OS A  β”‚  Guest OS B  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚         Hypervisor          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚          Hardware           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

각 κ°€μƒλ¨Έμ‹ μ—λŠ” 독립적인 게슀트 OS와 컀널이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

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

μ»¨ν…Œμ΄λ„ˆλŠ” OS μ»€λ„μ˜ κΈ°λŠ₯을 ν™œμš©ν•˜μ—¬ 격리된 μ‹€ν–‰ ν™˜κ²½μ„ λ§Œλ“œλŠ” κΈ°μˆ μž…λ‹ˆλ‹€.

λ¦¬λˆ…μŠ€μ—μ„œλŠ” 주둜 Namespaces와 Cgroupsλ₯Ό ν™œμš©ν•©λ‹ˆλ‹€.

  • Namespaces: ν”„λ‘œμ„ΈμŠ€, νŒŒμΌμ‹œμŠ€ν…œμ˜ 마운트 ν™˜κ²½, λ„€νŠΈμ›Œν¬ λ“±μ˜ μ‹œμŠ€ν…œ μžμ›μ„ κ²©λ¦¬ν•©λ‹ˆλ‹€.
  • Cgroups: CPU, λ©”λͺ¨λ¦¬ λ“±μ˜ λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰μ„ μ œν•œν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€.

LXC(Linux Containers)λŠ” μ΄λŸ¬ν•œ λ¦¬λˆ…μŠ€ 컀널 κΈ°λŠ₯을 ν™œμš©ν•˜λŠ” λŒ€ν‘œμ μΈ μ»¨ν…Œμ΄λ„ˆ 기술 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Container A  β”‚ Container B  β”‚
β”‚              β”‚              β”‚
β”‚ Application  β”‚ Application  β”‚
β”‚ Libraries    β”‚ Libraries    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚         Host Kernel         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚          Hardware           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

μ»¨ν…Œμ΄λ„ˆλ§ˆλ‹€ λ³„λ„μ˜ 컀널이 μ‘΄μž¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆκ°€ ν•˜λ‚˜μ˜ 호슀트 컀널을 κ³΅μœ ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

2. ν•˜μ΄νΌλ°”μ΄μ €μ™€ μ»¨ν…Œμ΄λ„ˆμ˜ 차이

ν•˜μ΄νΌλ°”μ΄μ €μ™€ μ»¨ν…Œμ΄λ„ˆμ˜ 곡톡점은 λͺ¨λ‘ 격리된 가상화 ν™˜κ²½μ„ μ œκ³΅ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ°¨μ΄μ μœΌλ‘œλŠ” ν•˜μ΄νΌλ°”μ΄μ € 기반 κ°€μƒλ¨Έμ‹ μ—λŠ” 게슀트 OS와 호슀트 OS의 컀널이 λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•  수 μžˆμ§€λ§Œ, μ»¨ν…Œμ΄λ„ˆλŠ” 호슀트 컀널을 κ³΅μœ ν•œλ‹€λŠ” 점이 μžˆμŠ΅λ‹ˆλ‹€.

κ°€μƒλ¨Έμ‹ μ˜ 경우 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°œμƒν•œ μ‹œμŠ€ν…œ 콜(System Call)은 게슀트 OS의 μ»€λ„μ—μ„œ μ²˜λ¦¬λ©λ‹ˆλ‹€. μ΄λ•Œ 가상 ν•˜λ“œμ›¨μ–΄ μ ‘κ·Όκ³Ό 같은 일뢀 μž‘μ—…μ—λŠ” ν•˜μ΄νΌλ°”μ΄μ €μ˜ κ°œμž…μ΄ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

반면 μ»¨ν…Œμ΄λ„ˆλŠ” 호슀트 컀널을 κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°œμƒν•œ μ‹œμŠ€ν…œ μ½œμ„ 호슀트 μ»€λ„μ—μ„œ 직접 μ²˜λ¦¬ν•©λ‹ˆλ‹€.

[ Virtual Machine ]

Application
     β”‚
     β–Ό
Guest OS Kernel
     β”‚
     β–Ό
Virtual Hardware
     β”‚
     β–Ό
Physical Hardware


[ Container ]

Application
     β”‚
     β–Ό
Host OS Kernel
     β”‚
     β–Ό
Physical Hardware

μœ„ κ΅¬μ‘°λŠ” κ°œλ…μ μœΌλ‘œ λ‹¨μˆœν™”ν•œ κ²ƒμœΌλ‘œ, κ°€μƒλ¨Έμ‹ μ˜ λͺ¨λ“  μ‹œμŠ€ν…œ 콜이 ν•˜μ΄νΌλ°”μ΄μ €λ₯Ό κ±°μΉ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

결과적으둜 μ»¨ν…Œμ΄λ„ˆλŠ” λ³„λ„μ˜ 게슀트 OSλ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 가상머신에 λΉ„ν•΄ 일반적으둜 λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰μ΄ 적고 μ‹€ν–‰ μ€€λΉ„ μ‹œκ°„μ΄ λΉ λ₯΄λ‹€λŠ” 이점을 κ°€μ§‘λ‹ˆλ‹€.

DockerλŠ” μ΄λŸ¬ν•œ μ»¨ν…Œμ΄λ„ˆ 가상화 κΈ°μˆ μ„ μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” ν”Œλž«νΌμ΄λΌκ³  보면 λ©λ‹ˆλ‹€.

3. Docker의 λ™μž‘ ꡬ쑰

DockerλŠ” ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„(Client-Server) λͺ¨λΈμ„ 기반으둜 ν•©λ‹ˆλ‹€.

DockerλŠ” μ‚¬μš©μžμ˜ λͺ…령을 μ „λ‹¬ν•˜λŠ” Docker Client와 μ»¨ν…Œμ΄λ„ˆλ₯Ό κ΄€λ¦¬ν•˜λŠ” Docker Daemon으둜 κ΅¬μ„±λ©λ‹ˆλ‹€.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      User       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚ CLI Command
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Docker Client  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚ API Request
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Docker Daemon  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Containers    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ν΄λΌμ΄μ–ΈνŠΈκ°€ Docker κ΄€λ ¨ λͺ…λ Ήμ–΄λ₯Ό CLI둜 μ‹€ν–‰ν•˜λ©΄ μ‚¬μš©μžμ˜ λͺ…령을 API μš”μ²­μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ Docker Daemon에 μ „λ‹¬ν•©λ‹ˆλ‹€.

Docker Daemon은 ν•΄λ‹Ή μš”μ²­μ— 따라 μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜κ±°λ‚˜ κ΄€λ¦¬ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ— μ „λ‹¬ν•©λ‹ˆλ‹€.

CLIλ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” Docker Daemon의 API에 직접 μš”μ²­μ„ λ³΄λ‚΄λŠ” 과정이 λ³΅μž‘ν•˜κΈ° λ•Œλ¬Έμ—, μ‚¬μš©μžκ°€ κ°„λ‹¨ν•œ λͺ…λ Ήμ–΄λ§ŒμœΌλ‘œ APIλ₯Ό ν˜ΈμΆœν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œμž…λ‹ˆλ‹€.

4. Docker CLI κΈ°λ³Έ λͺ…λ Ήμ–΄

docker --help

Docker λͺ…령어에 λŒ€ν•œ 도움말을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Docker λͺ…λ Ήμ–΄λŠ” 주둜 λ‹€μŒκ³Ό 같은 ν˜•μ‹μ„ μ·¨ν•©λ‹ˆλ‹€.

docker [Management Command] [Command]

λŒ€λΆ„λ₯˜μ— ν•΄λ‹Ήν•˜λŠ” Management CommandλŠ” 관리할 λŒ€μƒμ„ λ‚˜νƒ€λ‚΄λ©°, 일뢀 λͺ…λ Ήμ–΄μ—μ„œλŠ” μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ 및 μ‚­μ œ λͺ…λ Ήμ–΄λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

# μ»¨ν…Œμ΄λ„ˆ 생성 및 μ‹€ν–‰
docker run [μ˜΅μ…˜] 이미지λͺ…

# μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ
docker rm μ»¨ν…Œμ΄λ„ˆλͺ…/ID

μœ„ λͺ…λ Ήμ–΄λŠ” Management Commandλ₯Ό λͺ…μ‹œν•˜μ—¬ λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

# μ»¨ν…Œμ΄λ„ˆ 생성 및 μ‹€ν–‰
docker container run [μ˜΅μ…˜] 이미지λͺ…

# μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ
docker container rm μ»¨ν…Œμ΄λ„ˆλͺ…/ID

즉, docker runκ³Ό docker container run은 λ™μΌν•œ λͺ…령어이며, docker rmκ³Ό docker container rm μ—­μ‹œ λ™μΌν•œ λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.


정리

ꡬ뢄 νŠΉμ§•
λ² μ–΄λ©”νƒˆ 물리적 ν•˜λ“œμ›¨μ–΄μ— OSλ₯Ό 직접 μ„€μΉ˜
ν•˜μ΄νΌλ°”μ΄μ € κ°€μƒλ¨Έμ‹ λ§ˆλ‹€ 독립적인 게슀트 OS와 컀널 μ‚¬μš©
μ»¨ν…Œμ΄λ„ˆ 호슀트 컀널을 κ³΅μœ ν•˜λ©΄μ„œ μ‹€ν–‰ ν™˜κ²½ 격리
Docker μ»¨ν…Œμ΄λ„ˆ 생성 및 관리λ₯Ό μœ„ν•œ ν”Œλž«νΌ
Docker Client CLI λͺ…령을 API μš”μ²­μœΌλ‘œ λ³€ν™˜ 및 전달
Docker Daemon API μš”μ²­μ— 따라 μ»¨ν…Œμ΄λ„ˆ 관리 μž‘μ—… μˆ˜ν–‰

Categories:

Updated:

Leave a comment