πŸ“š CS [ComputerScience]/πŸ“š CS λ©΄μ ‘

πŸ“š [CSλ©΄μ ‘] μ›Ή λ©΄μ ‘ 질문 [12] [ Docker ]

Dbswnstjd 2024. 3. 3. 16:56

1. λ„μ»€λž€ ?

도컀(Docker)λŠ” λ¦¬λˆ…μŠ€ μ»¨ν…Œμ΄λ„ˆμ— λ¦¬λˆ…μŠ€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν”„λ‘œμ„ΈμŠ€ κ²©λ¦¬κΈ°μˆ μ„ μ‚¬μš©ν•˜μ—¬ 더 μ‰½κ²Œ μ»¨ν…Œμ΄λ„ˆλ‘œ μ‹€ν–‰ν•˜κ³  관리할 수 있게 ν•΄μ£ΌλŠ” μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈμ΄λ‹€. λ„μ»€λŠ” 일반적으둜 도컀 엔진 ν˜Ήμ€ 도컀에 κ΄€λ ¨λœ λͺ¨λ“  ν”„λ‘œμ νŠΈλ₯Ό μ˜λ―Έν•œλ‹€.

 

도컀 엔진(Docker Engine)은 μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μ£Όμ²΄λ‘œμ„œ 이 μžμ²΄λ‘œλ„ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ œμ–΄ν•  수 있고 λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” λ„μ»€μ˜ ν”„λ‘œμ νŠΈμ΄λ‹€. 도컀 μƒνƒœκ³„μ— μžˆλŠ” μ—¬λŸ¬ ν”„λ‘œμ νŠΈλ“€μ€ 도컀 엔진을 μ’€ 더 효율적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•œ 것에 λΆˆκ³Όν•˜κΈ° λ•Œλ¬Έμ— λ„μ»€μ˜ 핡심은 도컀 엔진이닀. 

 

Virtual Machine (가상머신) vs Docker Container (도컀 μ»¨ν…Œμ΄λ„ˆ)

기쑴에 μ‚¬μš©ν•˜λ˜ 가상화 기술과 λ„μ»€μ˜ 차이점을 μ•Œμ•„λ³΄λ„λ‘ ν•˜μž. 

vm κ³Ό docker

기쑴의 가상화 기술인 가상머신은 ν•˜μ΄νΌλ°”μ΄μ €λ₯Ό μ΄μš©ν•΄ μ—¬λŸ¬κ°œμ˜ 운영체제λ₯Ό ν•˜λ‚˜μ˜ ν˜ΈμŠ€νŠΈμ—μ„œ 생성해 μ‚¬μš©ν•˜λŠ” λ°©μ‹μ΄μ—ˆλ‹€. 

 

μ΄λŸ¬ν•œ μ—¬λŸ¬ 개의 μš΄μ˜μ²΄μ œλŠ” 가상 λ¨Έμ‹ μ΄λž€λŠ λ‹¨μœ„λ‘œ κ΅¬λ³„λ˜κ³  각 κ°€μƒλ¨Έμ‹ μ—λŠ” μš΄μ˜μ²΄μ œκ°€ μ„€μΉ˜λ˜μ–΄ μžˆλ‹€. κ·Έλž˜μ„œ ν•˜μ΄νΌλ°”μ΄μ €μ— μ˜ν•΄ μƒμ„±λ˜κ³  κ΄€λ¦¬λ˜λŠ” μš΄μ˜μ²΄μ œλŠ” 게슀트 운영체제(Guest OS)라고 ν•˜λ©°, 각 게슀트 μš΄μ˜μ²΄μ œλŠ” λ‹€λ₯Έ 게슀트 μš΄μ˜μ²΄μ œμ™€λŠ” μ™„μ „νžˆ λ…λ¦½λœ 곡간과 μ‹œμŠ€ν…œ μžμ›μ„ ν• λ‹Ήλ°›μ•„ μ‚¬μš©ν•œλ‹€. μ΄λŸ¬ν•œ 방식을 μ‚¬μš©ν•˜λŠ” νˆ΄μ€ VirtualBox, VMware 등이 μžˆλ‹€. 

 

κ·ΈλŸ¬λ‚˜, 각쒅 μ‹œμŠ€ν…œ μžμ›μ„ κ°€μƒν™”ν•˜κ³  λ…λ¦½λœ 곡간을 μƒμ„±ν•˜λŠ” μž‘μ—…μ€ ν•˜μ΄νΌλ°”μ΄μ €λ₯Ό λ°˜λ“œμ‹œ 거치기 λ•Œλ¬Έμ— 일반 ν˜ΈμŠ€νŠΈμ— λΉ„ν•΄ μ„±λŠ₯의 손싀이 λ°œμƒν•œλ‹€. κ·Έ 뿐만 μ•„λ‹ˆλΌ 가상 머신은 게슀트 운영체제λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•œ 라이브러리, 컀널 등을 μ „λΆ€ ν¬ν•¨ν•˜κΈ° λ•Œλ¬Έμ— 가상 머신을 λ°°ν¬ν•˜κΈ° μœ„ν•œ μ΄λ―Έμ§€λ‘œ λ§Œλ“€μ—ˆμ„ λ•Œ μ΄λ―Έμ§€μ˜ 크기가 맀우 크닀. 

μ˜ˆμ „μ— μ„œλ²„λ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ VirtualBox에 ubuntuλ₯Ό μ„€μΉ˜ν•˜λŠ”λ° μš©λŸ‰μ΄ λΆ€μ‘±ν•΄ νŒŒμΌμ •λ¦¬λ₯Ό ν–ˆλ˜ κ²½ν—˜μ΄ μžˆλ‹€..

 

즉, 가상 머신은 μ™„λ²½ν•œ 운영체제λ₯Ό 생성할 수 μžˆλ‹€λŠ” μž₯점이 μ‘΄μž¬ν•˜μ§€λ§Œ 일반 ν˜ΈμŠ€νŠΈμ— λΉ„ν•΄ μ„±λŠ₯이 떨어지고, μš©λŸ‰μ΄ 큰 이미지λ₯Ό λ°°ν¬ν•˜κΈ°μ—λŠ” λΆ€λ‹΄μŠ€λŸ½λ‹€λŠ” 단점이 μžˆλ‹€.

 

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

λ‚˜λŠ” 도컀λ₯Ό μž‘λ…„μ— 처음 μ‚¬μš©ν•΄ λ΄€λŠ”λ° μ™œ μ‚¬μš©ν•˜λŠ”μ§€ λͺ°λžκ³  μ‚¬μš©ν•˜κΈ° 전에 μ΄ν•΄ν•˜κΈ°λ„ 어렀움이 μžˆμ—ˆλ‹€. μ‹€μ œλ‘œ 배포 ν™˜κ²½μ„ κ΅¬μ„±ν•˜κΈ° μ „κΉŒμ§€λŠ” κ·Έλƒ₯ μ„œλ²„μ— μ˜¬λ €μ„œ λ°°ν¬ν•˜μ§€ ꡳ이 도컀λ₯Ό 써? λΌλŠ” λ¬΄μ§€ν•œ 생각을 ν–ˆλ‹€. 사싀 ν”„λ‘œμ νŠΈμ—μ„œ μš”κ΅¬μ‚¬ν•­μ΄ μΆ”κ°€λ˜λ©΄μ„œ 도컀λ₯Ό μ–΄μ©”μˆ˜ 없이 μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆλŠ”λ° μ΄λŠ” 정말 ν–‰μš΄μ΄μ—ˆλ‹€.

docker container

도컀 μ»¨ν…Œμ΄λ„ˆλŠ” κ°€μƒν™”λœ 곡간을 μƒμ„±ν•˜κΈ° μœ„ν•΄ λ¦¬λˆ…μŠ€ 자체 κΈ°λŠ₯인 chroot, λ„€μž„μŠ€νŽ˜μ΄μŠ€, cgroup을 μ‚¬μš©ν•¨μœΌλ‘œμ¨ ν”„λ‘œμ„ΈμŠ€ λ‹¨μœ„μ˜ 격리 ν™˜κ²½μ„ λ§Œλ“€κΈ° λ•Œλ¬Έμ— μ„±λŠ₯ 손싀이 거의 μ—†λ‹€. μ»¨ν…Œμ΄λ„ˆμ— ν•„μš”ν•œ 컀널을 κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•˜κ³ , μ»¨ν…Œμ΄λ„ˆ μ•ˆμ—λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬λ™ν•˜λŠ” 데 ν•„μš”ν•œ 라이브러리 및 μ‹€ν–‰ 파일만 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μ»¨ν…Œμ΄λ„ˆλ₯Ό μ΄λ―Έμ§€λ‘œ λ§Œλ“€μ—ˆμ„ λ•Œ μ΄λ―Έμ§€μ˜ μš©λŸ‰ λ˜ν•œ 가상 머신에 λΉ„ν•΄ λŒ€ν­ 쀄어든닀. λ”°λΌμ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ΄λ―Έμ§€λ‘œ λ§Œλ“€μ–΄ λ°°ν¬ν•˜λŠ” μ‹œκ°„μ΄ 가상 머신에 λΉ„ν•΄ λΉ λ₯΄κ³ , κ°€μƒν™”λœ 곡간을 μ‚¬μš©ν•  λ•Œμ˜ μ„±λŠ₯ 손싀도 거의 μ—†λ‹€λŠ” μž₯점이 μžˆλ‹€.

 

- 도컀 μ»¨ν…Œμ΄λ„ˆλŠ” κ°€μƒν™”λœ 곡간을 생성할 λ•Œ λ¦¬λˆ…μŠ€ 자체 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€ λ‹¨μœ„μ˜ 격리 ν™˜κ²½μ„ λ§Œλ“€μ–΄ μ„±λŠ₯ 손싀이 μ—†μŒ

- 가상 λ¨Έμ‹ κ³Ό 달리 컀널을 κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•˜λ―€λ‘œ, μ»¨ν…Œμ΄λ„ˆμ—λŠ” 라이브러리 및 μ‹€ν–‰νŒŒμΌλ§Œ 쑴재

 

Docker ꡬ성 μš”μ†Œ

Docker Client - 도컀λ₯Ό μ„€μΉ˜ν•˜λ©΄ 그것이 Clientκ³  build, pull, run λ“±μ˜ 도컀 λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰

DOCKER_HOST - 도컀가 λ„μ›Œμ Έ μžˆλŠ” μ„œλ²„λ₯Ό 의미

Docker daemon - 도컀 엔진

Registry - μ™ΈλΆ€ 이미지 μ €μž₯μ†Œ

 

도컀 이미지와 μ»¨ν…Œμ΄λ„ˆ

도컀 μ—”μ§„μ—μ„œ μ‚¬μš©ν•˜λŠ” κΈ°λ³Έ λ‹¨μœ„λŠ” 이미지와 μ»¨ν…Œμ΄λ„ˆμ΄λ©° 도컀 μ—”μ§„μ˜ 핡심이닀.

 

도컀 이미지와 μ»¨ν…Œμ΄λ„ˆλŠ” 1:N의 관계이닀. 

docker image, container

도컀 νŒŒμΌμ„ μƒμ„±ν•˜κ³  이λ₯Ό build ν•˜κ²Œλ˜λ©΄ 도컀 이미지가 μƒμ„±λœλ‹€. μƒμ„±λœ 이미지λ₯Ό runν•˜λ©΄ 도컀 μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λ˜λŠ” ꡬ쑰이닀. 

FROM openjdk:17
CMD ["./mvnw", "package", "-DuserTests=true"]
ARG JAR_FILE_PATH=./target/*.jar
COPY ${JAR_FILE_PATH} app.jar
ENTRYPOINT ["java", "-jar", "-Duser.timezone=Asia/Seoul", "app.jar"]

// ν•΄λ‹Ή λ””λ ‰ν† λ¦¬μ—μ„œ 도컀 이미지 생성
$ docker build -t ${Docker_IMAGE}.

// 도컀 μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
$ docker run -d 80:80 --name ${DOCKER_CONTAINER} ${DOCKER_HUB_IMAGE}:latest

 

μœ„λŠ” ν”„λ‘œμ νŠΈ λ‹Ήμ‹œ maven으둜 배포λ₯Ό ν•˜λ˜ 도컀 νŒŒμΌμ΄λ‹€. 

μ΄λ ‡κ²Œ λ§Œλ“  도컀 νŒŒμΌμ„ λΉŒλ“œν•΄μ£Όλ„λ‘ ν•œλ‹€. μ΄λ ‡κ²Œ 되면 docker imageκ°€ μƒκΈ°κ²Œ λ˜λŠ”λ° 이 이미지 νŒŒμΌμ„ runν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆκ°€ μ‹€ν–‰λœλ‹€. 

 

도컀λ₯Ό μ‹€μ œλ‘œ μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ 정말 νŽΈλ¦¬ν•˜λ‹€λŠ” 것을 λŠλ‚„ 수 μžˆλ‹€. λ°°μš°λŠ” 데에도 큰 어렀움이 μ—†κ³  μžλ£Œκ°€ λ§ŽμœΌλ‹ˆ κ³΅μ‹λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜λ©΄ λ§Žμ€ 도움이 될 수 μžˆλ‹€.