7. μ»¨ν…Œμ΄λ„ˆλ₯Ό 관리해야지

μ»¨ν…Œμ΄λ„ˆ λ¦¬μ†ŒμŠ€ μ œν•œ

ν•˜λ“œμ›¨μ–΄ λ¦¬μ†ŒμŠ€λž€?

  • CPU, memory(RAM), disk
  • 도컀 ν˜ΈμŠ€νŠΈλ„ ν•˜λ“œμ›¨μ–΄ λ¦¬μ†ŒμŠ€λ₯Ό κ°–κ³  μžˆλ‹€ γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€

기본적으둜 μ»¨ν…Œμ΄λ„ˆλŠ” 호슀트 ν•˜λ“œμ›¨μ–΄ λ¦¬μ†ŒμŠ€μ˜ μ‚¬μš© μ œν•œμ„ 받지 μ•ŠλŠ”λ‹€.

  • λ‹€μ‹œ 말해, μ»¨ν…Œμ΄λ„ˆλŠ” ν˜ΈμŠ€νŠΈμ— μžˆλŠ” λͺ¨λ“  λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
  • κ·ΈλŸ¬λ‚˜ 효율적인 λ¦¬μ†ŒμŠ€ μš΄μ˜μ„ μœ„ν•΄ λ¦¬μ†ŒμŠ€ μ œν•œμ΄ ν•„μš”ν•˜λ‹€. γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€

Docker commandλ₯Ό 톡해 μ œν•œν•  수 μžˆλŠ” λ¦¬μ†ŒμŠ€

  • CPU, memory, disk io
  • docker run --help 
    
    • μ‚¬μš© κ°€λŠ₯ν•œ μ˜΅μ…˜ list λ‚˜μ—΄

memory λ¦¬μ†ŒμŠ€ μ œν•œ

μ£Όμš” μ‚¬μš© μ˜΅μ…˜

  • --memory, -m
    
    • μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν•  λ©”λͺ¨λ¦¬ 양을 지정 (μ΅œλŒ€κ°’)
  • --memory-swap
    
    • μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν•  μŠ€μ™‘ λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•œ μ„€μ •
    • 지정 κ°’ = λ©”λͺ¨λ¦¬+μŠ€μ™‘
    • κΈ°λ³Έ κ°’ λ©”λͺ¨λ¦¬μ˜ 2λ°°
  • --memory-reservation
    
    • μž‘μ€ κ°’μœΌλ‘œ κ΅¬μ„±ν•˜λŠ” μ œν•œκ°’ (μ΅œμ†Œκ°’)
  • --oom-kill-disable
    
    • OOM killerκ°€ ν”„λ‘œμ„ΈμŠ€ killν•˜μ§€ λͺ»ν•˜λ„둝 보호

μ‚¬μš© μ˜ˆμ‹œ

  • docker run -d -m 512m nginx:1.14
    
    • 엔진 μ—‘μŠ€ μ›Ήμ„œλ²„ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
    • μ΅œλŒ€ μ‚¬μš©ν•  수 μžˆλŠ” μ–‘ 512mb μš©λŸ‰ μ œν•œ
    • 엔진 μ—‘μŠ€ μ»¨ν…Œμ΄λ„ˆλŠ” μžμ‹ μ—κ²Œ 할상 된 μš©λŸ‰ 이상을 μ‚¬μš©ν•  수 μ—†κ³ , κ·Έ 이상 μ‚¬μš© μ‹œ kill λ˜μ–΄λ²„λ¦Ό
  • docker run -d -m 1g --memory-reservation 300m nginx:1.14
    
    • μ΅œλŒ€λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ 1gb
    • μ΅œμ†Œ (적어도) 500mb 보μž₯
  • docker run -d -m 200m --memory-swap 300m nginx:1.14
    
    • μŠ€μ™‘μ΄λž€, λ””μŠ€ν¬λ₯Ό λ©”λͺ¨λ¦¬μ²˜λŸΌ μ‚¬μš©ν•˜λŠ” 것
    • λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 200mb μ œν•œ
    • swap size = 300mb = memory + swap
    • μ‹€μ œ 순 swap sizeλŠ” 100mb
  • docker run -d -m 200m --oom-kill-disable nginx:1.14
    
    • oom kill
      • λ¦¬λˆ…μŠ€ 컀널이 κ°–κ³  μžˆλŠ” κΈ°λŠ₯쀑 ν•˜λ‚˜
      • physicalν•œ memory μš©λŸ‰μ΄ λΆ€μ‘±ν•˜λ©΄ out of memory killerλ₯Ό λ™μž‘ μ‹œμΌœ processλ₯Ό kill μ‹œν‚΄
    • 이 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜κ²Œ 되면 피지컬 λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜κ²Œ λ˜λ”λΌλ„ oom kill을 λ™μž‘μ‹œν‚€μ§€ μ•Šκ²Œ 함

CPU λ¦¬μ†ŒμŠ€ μ œν•œ

μ£Όμš” μ‚¬μš© μ˜΅μ…˜

  • --cpus
    
    • μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν• (ν• λ‹Ήν• ) CPU core 수λ₯Ό 지정 (μ΅œλŒ€κ°’)
    • μ΅œλŒ€ μ‚¬μš©ν•  수 μžˆλŠ” CPU μ‚¬μš©λŸ‰ μ œν•œ
  • --cpuset-cpus
    
    • μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν•  수 μžˆλŠ” CPUλ‚˜ μ½”μ•„λ₯Ό ν• λ‹Ή
    • cpu indexλŠ” 0 λΆ€ν„°
    • (μ°Έκ³ ) 4CPU이면, 0,1,2,3번 core라고 numberλ₯Ό λΆ™μž„
  • --cpu-share 
    
    • μ»¨ν…Œμ΄λ„ˆκ°€ μ‚¬μš©ν•˜λŠ” CPU 비쀑을 1024값을 κΈ°μ€€(기반)으둜 μ„€μ •
    • (μ˜ˆμ‹œ) 2048: κΈ°λ³Έ κ°’ 보닀 두배 λ§Žμ€ CPU μžμ›μ„ ν• λ‹Ή

μ‚¬μš© μ˜ˆμ‹œ

  • docker run -d --cpus=".5" ubuntu:1.14
    
    • 0.5μ½”μ–΄λ§ŒνΌ μ‚¬μš© κ°€λŠ₯
    • μ–΄λ–€ 것을 μ“°λŠ”μ§€λŠ” λͺ¨λ¦„
    • 4코어라고 κ°€μ •, κ·Έ 쀑에 ν•˜λ‚˜λ₯Ό μ“°λŠ”λ°, κ·Έ 쀑에 μ ˆλ°˜κΉŒμ§€ μ‚¬μš©
  • docker run -d --cpu-share 2048 ubuntu:1.14
    
    • λ‹€λ₯Έ μ»¨ν…Œμ΄λ„ˆ 보닀 νŠΉλ³„νžˆ 이 μ»¨ν…Œμ΄λ„ˆλŠ” CPU λ¦¬μ†ŒμŠ€λ₯Ό 더 많이 λ°›μ•˜μœΌλ©΄ 쒋겠을 λ•Œ
    • μƒλŒ€μ  κΈ°μ€€μΉ˜ ν• λ‹Ή
  • docker run -d -cpuset-cpus 0-3 ubuntu:1.14
    
    • CPU nunber 0λ²ˆλΆ€ν„° 3λ²ˆκΉŒμ§€ ν• λ‹Ή

Block I/O μ œν•œ (disk)

μ£Όμš” μ‚¬μš© μ˜΅μ…˜

  • --blkio-weight / --blkio-weight-device
    
    • block i/o의 quota μ„€μ •ν•  수 있으며, 100~1000κΉŒμ§€ 선택
    • κΈ°λ³Έ κ°’ 500
      • μ’€ μ „μ˜ cpu share와 ꡉμž₯히 λΉ„μŠ·ν•œ κΈ°λŠ₯
      • μƒλŒ€μ  κ°€μ€‘μΉ˜
      • λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆκ°€ λ™μž‘λ  λ•Œ I/O scheduling을 λ°›λŠ”λ°, μ›λž˜λŠ” λ™μΌν•œ I/O schedule을 λ°›μŒ
      • 이 μ»¨ν…Œμ΄λ„ˆλ§Œ νŠΉλ³„νžˆ λ™μž‘μ‹œν‚€κ³  μ‹Άμ„λ•Œ
    • diceve μ˜΅μ…˜ μ‚¬μš©μœΌλ‘œ λ””λ°”μ΄μŠ€ 선택 κ°€λŠ₯
  • --device-read-bps / --device-write-bps
    
    • νŠΉμ • λ””λ°”μ΄μŠ€μ— λŒ€ν•œ 읽기와 μ“°κΈ° μž‘μ—…μ˜ μ΄ˆλ‹Ή μ œν•œ
    • μ΄ˆλ‹Ή μ–Όλ§ˆλ§ŒνΌ biteλ₯Ό read/write ν•  수 μžˆλŠ”μ§€ μ œν•œ
  • --device-read-iops / --device-write-iops
    
    • μ»¨ν…Œμ΄λ„ˆμ˜ read/wrtie 속도 μ œν•œ
    • μ΄ˆλ‹Ή quota μ œν•œ
    • 0 μ΄μƒμ˜ μ •μˆ˜λ‘œ ν‘œκΈ°
    • μ΄ˆλ‹Ή 데이터 μ „μ†‘λŸ‰ = IOPS * λΈ”λŸ­ 크기 (λ‹¨μœ„ 데이터 μš©λŸ‰)

μ‚¬μš© μ˜ˆμ‹œ

  • docker run -it --rm --blkio-weight 100 ubuntu:latest /bin/bash 
    
    • λ¦¬μ†ŒμŠ€ 적게 ν• λ‹Ή
  • docker run -it --rm --device-write-bps /dev/vda:1mb ubuntu:latest /bin/bash 
    
    • vda에 writeν•  λ•ŒλŠ” μ΅œλŒ€ 1mb둜 μ΄ˆλ‹Ή 전솑할 수 μžˆλ‹€
  • docker run -it --rm --device-write-bps /dev/vda:10mb ubuntu:latest /bin/bash 
    
    • 10mb
  • docker run -it --rm --device-write-iops /dev/vda:10 ubuntu:lastest /bin/bash
    
  • docker run -it --rm --device-write-iops /dev/vda:100 ubuntu:latest /bin/bash
    

λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§

  • μ§€κΈˆκΉŒμ§€λŠ” λ¦¬μ†ŒμŠ€λ₯Ό μ œν•œν•˜λŠ” 방법을 확인
  • μ œν•œ μ‹œν‚¨ λ¦¬μ†ŒμŠ€κ°€ μ œλŒ€λ‘œ ν• λ‹Ήλ˜μ–΄ μ‚¬μš© 쀑인지 확인 ν•„μš”

docker monitoring commands

  • docker stats [OPTION] [CONTAINER...]
    
    • μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆμ˜ λŸ°νƒ€μž„ 톡계 확인
    • λ™μž‘λ˜κ³  μžˆλŠ” μ»¨ν…Œμ΄λ„ˆκ°€ CPUλŠ” μ–Όλ§ˆλ§ŒνΌ, λ©”λͺ¨λ¦¬λŠ” μ–Όλ§ˆλ§ŒνΌ, λ””μŠ€ν¬ I/OλŠ” μ–Όλ§ˆλ§ŒνΌ μΌμœΌν‚€κ³  μžˆλŠ” 지 μ‹€μ‹œκ°„μœΌλ‘œ 톡계값을 λ³΄μ—¬μ€Œ
  • docker event
    
    • docker event -f container=<NAME>
      
    • docker evnet -f container=<NAME>
      
    • μ»¨ν…Œμ΄λ„ˆ κ΄€λ ¨λœ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κ²Œ 되면, 보고싢은 이벀트 이름을 λ„£μ–΄ 좜λ ₯된 λ©”μ‹œμ§€ 확인
  • cAdvisor
    • κ΅¬κΈ€μ—μ„œ λ§Œλ“  도컀 λͺ¨λ‹ˆν„°λ§ 툴
    • λ‹€μ–‘ν•œ λͺ¨λ‹ˆν„°λ§ 방법을 톡해 λ¦¬μ†ŒμŠ€λ₯Ό μ œν•œν•œ μ»¨ν…Œμ΄λ„ˆ λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰μ„ λͺ¨λ‹ˆν„°λ§ ν•  수 있음 γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€ γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€ γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€ γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€ γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€ γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€ γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€ γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€γ€€ κ°μ‚¬ν•©λ‹ˆλ‹€.