Docker

Docker

Huijinn 2024. 11. 29. 11:27

Dockerλž€

DockerλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΉ λ₯΄κ³  κ°„νŽΈν•˜κ²Œ λ°°ν¬ν•˜κ³  μ‹€ν–‰ν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ 기반 ν”Œλž«νΌμž…λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ·Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν•„μš”λ‘œ ν•˜λŠ” λͺ¨λ“  μ˜μ‘΄μ„±μ„ ν•˜λ‚˜λ‘œ λ¬Άμ–΄ λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 "ν•œ 번 κ΅¬μΆ•ν•˜λ©΄ μ–΄λ””μ„œλ“  μ‹€ν–‰"ν•  수 μžˆλŠ” ν™˜κ²½μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 


Docker의 μ£Όμš” ν‚€μ›Œλ“œ

1. 이미지(Image)

  • Docker μ΄λ―Έμ§€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ·Έ 싀행에 ν•„μš”ν•œ λͺ¨λ“  것을 ν¬ν•¨ν•˜λŠ” 읽기 μ „μš© ν…œν”Œλ¦Ώμž…λ‹ˆλ‹€. μ΄λ―Έμ§€μ—λŠ” μ½”λ“œ, λŸ°νƒ€μž„, 라이브러리, ν™˜κ²½ λ³€μˆ˜, ꡬ성 파일 등이 ν¬ν•¨λ©λ‹ˆλ‹€.
  • μ΄λ―Έμ§€λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ 청사진 역할을 ν•©λ‹ˆλ‹€.

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

  • μ»¨ν…Œμ΄λ„ˆλŠ” 이미지λ₯Ό μ‹€ν–‰ν•œ μƒνƒœλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • μ»¨ν…Œμ΄λ„ˆλŠ” 격리된 κ³΅κ°„μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λ©°, ν•„μš”ν•œ λͺ¨λ“  μ˜μ‘΄μ„±μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.
  • ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμ—μ„œ μ—¬λŸ¬ 개의 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. 도컀 파일(Dockerfile)

  • Dockerfile은 Docker 이미지λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μŠ€ν¬λ¦½νŠΈμž…λ‹ˆλ‹€. 이 νŒŒμΌμ—λŠ” 이미지λ₯Ό λΉŒλ“œν•˜λŠ” 데 ν•„μš”ν•œ λͺ…령어듀이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • Dockerfile을 μ‚¬μš©ν•˜λ©΄ 이미지 생성 과정을 μžλ™ν™”ν•˜κ³  μΌκ΄€λ˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

4. Docker Hub

  • Docker HubλŠ” Docker 이미지λ₯Ό κ³΅μœ ν•˜κ³  μ €μž₯ν•˜λŠ” 쀑앙 μ €μž₯μ†Œμž…λ‹ˆλ‹€. μ‚¬μš©μžλŠ” Docker Hubμ—μ„œ λ‹€μ–‘ν•œ 곡개 이미지λ₯Ό λ‹€μš΄λ‘œλ“œν•˜κ±°λ‚˜ μžμ‹ λ§Œμ˜ 이미지λ₯Ό μ—…λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. λ³Όλ₯¨ (Volume)

  • λ³Όλ₯¨μ€ μ»¨ν…Œμ΄λ„ˆμ˜ 데이터λ₯Ό μ§€μ†μ μœΌλ‘œ μ €μž₯ν•  수 μžˆλŠ” λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆκ°€ μ‚­μ œλ˜λ”λΌλ„ λ³Όλ₯¨μ— μ €μž₯된 λ°μ΄ν„°λŠ” μœ μ§€λ©λ‹ˆλ‹€.
  • λ³Όλ₯¨μ„ μ‚¬μš©ν•˜λ©΄ 데이터λ₯Ό μ»¨ν…Œμ΄λ„ˆμ™€ λ…λ¦½μ μœΌλ‘œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

6. λ„€νŠΈμ›Œν¬ (Network)

  • Docker λ„€νŠΈμ›Œν¬λŠ” μ»¨ν…Œμ΄λ„ˆ κ°„μ˜ 톡신을 κ΄€λ¦¬ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. DockerλŠ” μ—¬λŸ¬ κ°€μ§€ λ„€νŠΈμ›Œν¬ λ“œλΌμ΄λ²„λ₯Ό μ œκ³΅ν•˜μ—¬ λ‹€μ–‘ν•œ λ„€νŠΈμ›Œν¬ 섀정을 μ§€μ›ν•©λ‹ˆλ‹€.
  • 기본적으둜 λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆλŠ” λΈŒλ¦¬μ§€ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 톡신할 수 μžˆμŠ΅λ‹ˆλ‹€.

6.1. λ„€νŠΈμ›Œν¬ μ’…λ₯˜

1. Bridge Network (λΈŒλ¦¬μ§€ λ„€νŠΈμ›Œν¬)

  • 기본적으둜 Dockerκ°€ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ„€νŠΈμ›Œν¬μž…λ‹ˆλ‹€.
  • λ™μΌν•œ λΈŒλ¦¬μ§€ λ„€νŠΈμ›Œν¬μ— μ—°κ²°λœ μ»¨ν…Œμ΄λ„ˆλ“€μ€ μ„œλ‘œ 톡신할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ™ΈλΆ€ λ„€νŠΈμ›Œν¬μ™€λŠ” NAT (λ‚΄λΆ€ λ„€νŠΈμ›Œν¬μ˜ μ—¬λŸ¬ μž₯μΉ˜κ°€ ν•˜λ‚˜μ˜ 곡용 IP μ£Όμ†Œλ₯Ό 톡해 μ™ΈλΆ€ λ„€νŠΈμ›Œν¬μ™€ 톡신할 수 μžˆλ„λ‘ IP μ£Όμ†Œλ₯Ό λ³€ν™˜ν•˜λŠ” 기술) λ₯Ό 톡해 ν†΅μ‹ ν•©λ‹ˆλ‹€.
  • 일반적으둜 단일 ν˜ΈμŠ€νŠΈμ—μ„œ μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ—°κ²°ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ λͺ¨λ‘ λΈŒλ¦¬μ§€ λ„€νŠΈμ›Œν¬μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.
docker network create my-bridge-network 
docker run -d --name container1 --network my-bridge-network nginx 
docker run -d --name container2 --network my-bridge-network nginx

 

2. Host Network (호슀트 λ„€νŠΈμ›Œν¬)

  • μ»¨ν…Œμ΄λ„ˆκ°€ 호슀트의 λ„€νŠΈμ›Œν¬ μŠ€νƒμ„ 직접 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • λ„€νŠΈμ›Œν¬ 격리가 μ—†κΈ° λ•Œλ¬Έμ— μ„±λŠ₯상 이점이 μžˆμ§€λ§Œ, λ³΄μ•ˆ 및 λ„€νŠΈμ›Œν¬ 좩돌 μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.
  • 일반적으둜 μ„±λŠ₯이 μ€‘μš”ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ‚¬μš©λ©λ‹ˆλ‹€.
docker run -d --network host nginx

 

3. Overlay Network (μ˜€λ²„λ ˆμ΄ λ„€νŠΈμ›Œν¬)

  • μ—¬λŸ¬ Docker ν˜ΈμŠ€νŠΈμ— 걸쳐 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μ—°κ²°ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • Swarm λͺ¨λ“œ(Docker μ»¨ν…Œμ΄λ„ˆμ˜ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜κ³Ό ν΄λŸ¬μŠ€ν„°λ§μ„ μ§€μ›ν•˜μ—¬ μ—¬λŸ¬ ν˜ΈμŠ€νŠΈμ—μ„œ μ»¨ν…Œμ΄λ„ˆλ₯Ό κ΄€λ¦¬ν•˜κ³  배포할 수 μžˆλŠ” κΈ°λŠ₯)λ‚˜ Kubernetes 같은 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 도ꡬ와 ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 데이터 μ„Όν„° λ˜λŠ” ν΄λΌμš°λ“œ ν™˜κ²½μ—μ„œ λΆ„μ‚° μ‹œμŠ€ν…œμ„ ꡬ좕할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

 


Docker의 μ£Όμš” νŠΉμ§•

  1. 이식성
    • Docker μ΄λ―Έμ§€λŠ” ν•œ ν™˜κ²½μ—μ„œ μƒμ„±λ˜λ©΄, λ™μΌν•œ 이미지가 λ‹€λ₯Έ ν™˜κ²½μ—μ„œλ„ λ™μΌν•˜κ²Œ μ‹€ν–‰λ©λ‹ˆλ‹€. 둜컬 ν™˜κ²½, μ„œλ²„, ν΄λΌμš°λ“œ λ“± μ–΄λ””μ„œλ‚˜ μΌκ΄€λœ λ™μž‘μ„ 보μž₯ν•©λ‹ˆλ‹€.
  2. κ²½λŸ‰ν™”
    • Docker μ»¨ν…Œμ΄λ„ˆλŠ” 가상 λ¨Έμ‹ (VM)보닀 κ°€λ³μŠ΅λ‹ˆλ‹€. VM은 각자 운영체제λ₯Ό ν¬ν•¨ν•˜μ§€λ§Œ, Docker μ»¨ν…Œμ΄λ„ˆλŠ” 호슀트 OS의 컀널을 κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ 속도가 λΉ λ₯΄κ³  μžμ› μ†Œλͺ¨κ°€ μ μŠ΅λ‹ˆλ‹€.
  3. 격리성
    • 각 μ»¨ν…Œμ΄λ„ˆλŠ” 독립적인 ν™˜κ²½μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ, μ„œλ‘œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ•ˆμ •μ„±κ³Ό λ³΄μ•ˆμ„±μ„ 확보할 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. ν™•μž₯μ„±
    • μ»¨ν…Œμ΄λ„ˆλŠ” ν•„μš”μ— 따라 μ‰½κ²Œ μŠ€μΌ€μΌ 아웃(ν™•μž₯)ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ³‘λ ¬λ‘œ μ‹€ν–‰ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν™•μž₯ν•˜κ±°λ‚˜ λ‘œλ“œλ₯Ό λΆ„μ‚°μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

 


Dockerλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유

  1. 개발 및 배포 ν™˜κ²½μ˜ 일관성
    • λ‘œμ»¬μ—μ„œ λ™μž‘ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ„œλ²„μ—μ„œλ„ λ™μΌν•˜κ²Œ μ‹€ν–‰λ©λ‹ˆλ‹€. "λ‘œμ»¬μ—μ„œλŠ” 잘 μž‘λ™ν–ˆλŠ”λ° μ„œλ²„μ—μ„œλŠ” μ—λŸ¬κ°€ λ°œμƒ"ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.
  2. 효율적인 λ¦¬μ†ŒμŠ€ μ‚¬μš©
    • Docker μ»¨ν…Œμ΄λ„ˆλŠ” 가상 머신보닀 적은 λ¦¬μ†ŒμŠ€λ₯Ό μ†ŒλΉ„ν•˜λ©°, 더 λ§Žμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ™μ‹œμ— μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. λΉ λ₯Έ 배포 및 볡ꡬ
    • μ»¨ν…Œμ΄λ„ˆλŠ” λͺ‡ 초 λ§Œμ— μ‹€ν–‰ν•  수 있으며, λ¬Έμ œκ°€ 생길 경우 μ¦‰μ‹œ μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•΄ 볡ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

 


Docker κΈ°λ³Έ μ‚¬μš©λ²•

1. Docker μ„€μΉ˜

  • DockerλŠ” macOS, Windows, Linux λ“± λ‹€μ–‘ν•œ ν”Œλž«νΌμ—μ„œ μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 도컀 곡식 ν™ˆνŽ˜μ΄μ§€μ—μ„œ μ„€μΉ˜ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•˜λ©΄ λ©λ‹ˆλ‹€.
# μ„€μΉ˜ 확인
docker --version

2. 이미지 λ‹€μš΄λ‘œλ“œ

# docker hubμ—μ„œ nginxλ₯Ό λ‹€μš΄λ‘œλ“œ λ°›μŠ΅λ‹ˆλ‹€.
$ docker pull nginx

3. μ΄λ―Έμ§€ μ‹€ν–‰

  • Docker Hubμ—μ„œ 이미지λ₯Ό λ‹€μš΄λ‘œλ“œλ°›κ³  μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
docker run nginx

4. μ΄λ―Έμ§€ λΉŒλ“œ

  • Dockerfile을 μ‚¬μš©ν•˜μ—¬ 이미지λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
# -t μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μ΄λ―Έμ§€μ˜ 이름과 νƒœκ·Έλ₯Ό μž…λ ₯ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
docker build -t {이미지λͺ…} .

5.이미지 관리

# 이미지 λͺ©λ‘ 확인
docker images
# 이미지 μ‚­μ œ
docker rmi {이미지 ID}

6. μ»¨ν…Œμ΄λ„ˆ 관리

# μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ 확인
docker ps
# λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆ 확인
docker ps -a
# μ»¨ν…Œμ΄λ„ˆ 쀑지
docker stop {μ»¨ν…Œμ΄λ„ˆ ID}
# μ»¨ν…Œμ΄λ„ˆ μ‚­μ œ
docker rm {μ»¨ν…Œμ΄λ„ˆ ID}

 


Dockerλ₯Ό ν™œμš©ν•œ μ‹€μŠ΅

  • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰: Docker둜 Node.js, Spring Boot, λ˜λŠ” Django μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ν•΄ 보기
  • λ°μ΄ν„°λ² μ΄μŠ€ μ»¨ν…Œμ΄λ„ˆ μ‚¬μš©: MySQL, PostgreSQL, Redis λ“± λ°μ΄ν„°λ² μ΄μŠ€ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
  • λ©€ν‹° μ»¨ν…Œμ΄λ„ˆ 관리: Docker Composeλ₯Ό μ‚¬μš©ν•΄ ν”„λ‘ νŠΈμ—”λ“œ, λ°±μ—”λ“œ, λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€λ‘œ ꡬ성

 


마무리

DockerλŠ” ν˜„λŒ€ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ ν•„μˆ˜ λ„κ΅¬λ‘œ 자리 μž‘μ•˜μŠ΅λ‹ˆλ‹€. Dockerλ₯Ό μ‚¬μš©ν•˜λ©΄ 개발과 배포 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‹¨μˆœν™”ν•˜κ³ , 더 λ‚˜μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이식성과 ν™•μž₯성을 μ œκ³΅ν•©λ‹ˆλ‹€.