Docker ํŒ: ๋จธ์‹ ์˜ ์ •ํฌ ์ œ๊ฑฐ

Docker ํŒ: ๋จธ์‹ ์˜ ์ •ํฌ ์ œ๊ฑฐ

ํ—ค์ด ํ•˜๋ธŒ๋ฅด! ๋‚˜๋Š” ๊ธฐ์‚ฌ์˜ ๋ฒˆ์—ญ์„ ๋‹น์‹ ์˜ ๊ด€์‹ฌ์— ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค "Docker ํŒ: ๋กœ์ปฌ ๋จธ์‹  ์ •๋ฆฌ" ์ €์ž ๋คฝ ์ €๊ฑฐ๋ฆฌ.

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” Docker๊ฐ€ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ , ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ์Šคํฌ๋žฉ์—์„œ ์ด ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


Docker ํŒ: ๋จธ์‹ ์˜ ์ •ํฌ ์ œ๊ฑฐ

์ด ์†Œ๋น„๋Ÿ‰

Docker๋Š” ๋ฉ‹์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์˜ค๋Š˜๋‚  ์˜์‹ฌํ•˜๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถˆ๊ณผ ๋ช‡ ๋…„ ์ „๋งŒ ํ•ด๋„ ์ด ์ œํ’ˆ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋ชจ๋“  ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•, ์ œ๊ณต ๋ฐ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ CPU ๋ฐ RAM ๋ฆฌ์†Œ์Šค๋ฅผ ํฌ๊ฒŒ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„(์ผ๋ถ€์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค) Docker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ๋†€๋ผ์šธ ์ •๋„๋กœ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ˜„๋Œ€ ์ƒํ™œ์˜ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ฆ๊ฑฐ์›€์—๋Š” ๋Œ€๊ฐ€๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ž์ฒด ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๊ณ , ๋ณต์žกํ•œ ์ƒํƒœ๊ณ„๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋ฉด ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ ๋””์Šคํฌ ๊ณต๊ฐ„์œผ๋กœ ๋น„์šฉ์„ ์ง€๋ถˆํ•ฉ๋‹ˆ๋‹ค.

Docker๊ฐ€ ์‹ค์ œ๋กœ ์ปดํ“จํ„ฐ์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณธ ์ ์ด ์—†๋‹ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์˜ ์ถœ๋ ฅ์— ๋ถˆ์พŒํ•˜๊ฒŒ ๋†€๋ž„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker system df

Docker ํŒ: ๋จธ์‹ ์˜ ์ •ํฌ ์ œ๊ฑฐ

์ด๋Š” ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ Docker์˜ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€ โ€“ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜์–ด ์‹œ์Šคํ…œ์— ๊ตฌ์ถ•๋œ ์ด๋ฏธ์ง€์˜ ์ด ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ โ€“ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋””์Šคํฌ ๊ณต๊ฐ„์˜ ์ด๋Ÿ‰(๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์˜ ์ฝ๊ธฐ-์“ฐ๊ธฐ ๋ ˆ์ด์–ด์˜ ์ด ๋ณผ๋ฅจ์„ ์˜๋ฏธ)
  • ๋กœ์ปฌ ๋ณผ๋ฅจ โ€“ ์ปจํ…Œ์ด๋„ˆ์— ํƒ‘์žฌ๋œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์˜ ๋ณผ๋ฅจ
  • ๋นŒ๋“œ ์บ์‹œ โ€“ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ์ƒ์„ฑ๋œ ์ž„์‹œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค(Docker ๋ฒ„์ „ 18.09๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ BuildKit ๋„๊ตฌ ์‚ฌ์šฉ).

์ด ๊ฐ„๋‹จํ•œ ์ „์†ก ํ›„์— ๊ท€ํ•˜๋Š” ๋””์Šคํฌ์—์„œ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ฒญ์†Œํ•˜๊ณ  ๊ท€์ค‘ํ•œ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์‹ถ์–ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฐธ๊ณ : ํŠนํžˆ ๋งค์›” ์ด ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์— ๋Œ€ํ•œ ์ž„๋Œ€๋ฃŒ๋ฅผ ์ง€๋ถˆํ•˜๋Š” ๊ฒฝ์šฐ).

์ปจํ…Œ์ด๋„ˆ๋ณ„ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰

ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค /var/lib/docker ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์—ฌ๋Ÿฌ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ๊ทธ์ค‘ ๋‹ค์Œ ์‚ฌํ•ญ์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋””๋ ‰ํ† ๋ฆฌ /var/lib/docker/containers/container_ID โ€“ ํ‘œ์ค€ ๋กœ๊น… ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ ๋กœ๊ทธ๊ฐ€ JSON ํ˜•์‹์œผ๋กœ ์ €์žฅ๋˜๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ƒ์„ธํ•œ ๋กœ๊ทธ์™€ ์•„๋ฌด๋„ ์ฝ๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋กœ๊ทธ๋กœ ์ธํ•ด ๋””์Šคํฌ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • /var/lib/docker/overlay2 ๋””๋ ‰ํ„ฐ๋ฆฌ์—๋Š” ์ปจํ…Œ์ด๋„ˆ ์ฝ๊ธฐ-์“ฐ๊ธฐ ๊ณ„์ธต์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(overlay2๋Š” ๋Œ€๋ถ€๋ถ„์˜ Linux ๋ฐฐํฌํŒ์—์„œ ์„ ํ˜ธ๋˜๋Š” ๋“œ๋ผ์ด๋ฒ„์ž…๋‹ˆ๋‹ค). ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ „ํ˜€ ๊ด€์—ฌํ•œ ์ ์ด ์—†๋Š” ๊นจ๋—ํ•œ Docker๊ฐ€ ์„ค์น˜๋œ ์‹œ์Šคํ…œ์„ ์ƒ์ƒํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋””์Šคํฌ ๊ณต๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰ ๋ณด๊ณ ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         0          0          0B         0B
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

์˜ˆ๋ฅผ ๋“ค์–ด NGINX์™€ ๊ฐ™์€ ์ผ๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

$ docker container run --name www -d -p 8000:80 nginx:1.16

๋””์Šคํฌ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

  • ์ด๋ฏธ์ง€๋Š” 126MB๋ฅผ ์ฐจ์ง€ํ•˜๋ฉฐ ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹œ์ž‘ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ NGINX์ž…๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ๋Š” ํ„ฐ๋ฌด๋‹ˆ์—†๋Š” 2๋ฐ”์ดํŠธ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          1          2B         0B (0%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

๊ฒฐ๋ก ์ ์œผ๋กœ ํŒ๋‹จํ•˜๋ฉด ์•„์ง ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. 2๋ฐ”์ดํŠธ๋Š” ์™„์ „ํžˆ ๋ฌด์˜๋ฏธํ•˜๋ฏ€๋กœ NGINX๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์–ด๋”˜๊ฐ€์— 100MB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ๋‚ด๋ถ€์— ์ •ํ™•ํžˆ ์ด ํฌ๊ธฐ์˜ test.img ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ docker exec -ti www 
  dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]

ํ˜ธ์ŠคํŠธ์˜ ๋””์Šคํฌ ๊ณต๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ์ปจํ…Œ์ด๋„ˆ(์ปจํ…Œ์ด๋„ˆ)๊ฐ€ 100MB๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          1          104.9MB    0B (0%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

๋‹น์‹ ์˜ ํ˜ธ๊ธฐ์‹ฌ ๋งŽ์€ ๋‘๋‡Œ๋Š” ์ด๋ฏธ test.img ํŒŒ์ผ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์ฐพ์•„๋ณด์ž:

$ find /var/lib/docker -type f -name test.img
/var/lib/docker/overlay2/83f177...630078/merged/test.img
/var/lib/docker/overlay2/83f177...630078/diff/test.img

์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ณ ๋„ test.img ํŒŒ์ผ์€ ์˜ค๋ฒ„๋ ˆ์ด2 ๋“œ๋ผ์ด๋ฒ„์— ์˜ํ•ด ์ œ์–ด๋˜๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ˆ˜์ค€์— ํŽธ๋ฆฌํ•˜๊ฒŒ ์œ„์น˜ํ•œ๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•˜๋ฉด ํ˜ธ์ŠคํŠธ๋Š” ์›์น™์ ์œผ๋กœ ์ด ๊ณต๊ฐ„์„ ๋น„์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

# Stopping the www container
$ docker stop www

# Visualizing the impact on the disk usage
$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          0          104.9MB    104.9MB (100%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์ฝ๊ธฐ-์“ฐ๊ธฐ ์ˆ˜์ค€์—์„œ ํ•ด๋‹น ๊ณต๊ฐ„์ด ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ค์น˜๋œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•œ ๋ฒˆ์— ์ œ๊ฑฐํ•˜๊ณ  ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ฝ๊ธฐ-์“ฐ๊ธฐ ํŒŒ์ผ์„ ๋””์Šคํฌ์—์„œ ์ง€์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2

Total reclaimed space: 104.9MB

๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•˜์—ฌ 104,9MB๋ฅผ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „์— ๋‹ค์šด๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ํ•ด์ œํ•  ํ›„๋ณด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          0          126M       126M (100%)
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

์ฐธ๊ณ : ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ์ด ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์‚ฌ์šฉํ•œ prune ํ•˜์œ„ ๋ช…๋ น์€ ์ค‘์ง€๋œ ์ปจํ…Œ์ด๋„ˆ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ค‘์ง€๋œ ์ปจํ…Œ์ด๋„ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋„ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# Historical command
$ docker rm -f $(docker ps โ€“aq)

# More recent command
$ docker container rm -f $(docker container ls -aq)

์ฐธ๊ณ  ์‚ฌํ•ญ: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ -rm ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘์ง€๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฐจ์ง€ํ–ˆ๋˜ ๋ชจ๋“  ๋””์Šคํฌ ๊ณต๊ฐ„์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

๋””์Šคํฌ ์ด๋ฏธ์ง€ ์‚ฌ์šฉ

๋ช‡ ๋…„ ์ „์—๋Š” ์ˆ˜๋ฐฑ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ์˜ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ์™„์ „ํžˆ ์ •์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Ubuntu ์ด๋ฏธ์ง€์˜ ๋ฌด๊ฒŒ๋Š” 600MB์ด๊ณ  Microsoft .Net ์ด๋ฏธ์ง€์˜ ๋ฌด๊ฒŒ๋Š” ์ˆ˜ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์‹œ์ ˆ์—๋Š” ์ด๋ฏธ์ง€ ํ•˜๋‚˜๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉด ์ด๋ฏธ์ง€ ๊ฐ„์— ๋ ˆ๋ฒจ์„ ๊ณต์œ ํ•˜๋”๋ผ๋„ ์—ฌ์œ  ๋””์Šคํฌ ๊ณต๊ฐ„์— ํฐ ํƒ€๊ฒฉ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  โ€“ ์œ„๋Œ€ํ•จ์„ ์ฐฌ์–‘ํ•ฉ๋‹ˆ๋‹ค โ€“ ์ด๋ฏธ์ง€์˜ ๋ฌด๊ฒŒ๋Š” ํ›จ์”ฌ ๊ฐ€๋ฒผ์›Œ์ง€์ง€๋งŒ, ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฐฉ ์กฐ์น˜๋ฅผ ์ทจํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง์ ‘ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ค‘๊ฐ„ ์ด๋ฏธ์ง€ - ์ด๋Ÿฌํ•œ "๊ธฐํƒ€" ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋Œ•๊ธ€๋ง ์ด๋ฏธ์ง€๋Š” ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ์ค‘๊ฐ„ ์ด๋ฏธ์ง€์ด๋ฏ€๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์— ๋งค๋‹ฌ๋ฆฐ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker image ls -f dangling=true
REPOSITORY  TAG      IMAGE ID         CREATED             SIZE
none      none   21e658fe5351     12 minutes ago      71.3MB

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker image rm $(docker image ls -f dangling=true -q)

prune ํ•˜์œ„ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
deleted: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
deleted: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
deleted: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
deleted: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f

Total reclaimed space: 12.9kB

ํ•˜๋‚˜์˜ ๋ช…๋ น์œผ๋กœ ๊ฐ‘์ž๊ธฐ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ (๋‹จ์ง€ ๋งค๋‹ฌ๋ฆฐ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ) ๋ชจ๋‘ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker image rm $(docker image ls -q)

๋ณผ๋ฅจ๋ณ„ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰

๋ณผ๋ฅจ์€ ์ปจํ…Œ์ด๋„ˆ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ์™ธ๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค.

MongoDB ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€์— ๋ณผ๋ฅจ์„ ํƒ‘์žฌํ•˜๊ณ , ์—ฌ๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฑ์—…์„ ๋ณต์›ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(bck.json ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ).

# Running a mongo container
$ docker run --name db -v $PWD:/tmp -p 27017:27017 -d mongo:4.0

# Importing an existing backup (from a huge bck.json file)
$ docker exec -ti db mongoimport 
  --db 'test' 
  --collection 'demo' 
  --file /tmp/bck.json 
  --jsonArray

๋ฐ์ดํ„ฐ๋Š” ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ /var/lib/docker/volumes ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์™œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ˆ˜์ค€์ด ์•„๋‹Œ๊ฐ€? MongoDB ์ด๋ฏธ์ง€์˜ Dockerfile์—์„œ /data/db ๋””๋ ‰ํ„ฐ๋ฆฌ(MongoDB๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ)๊ฐ€ ๋ณผ๋ฅจ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Docker ํŒ: ๋จธ์‹ ์˜ ์ •ํฌ ์ œ๊ฑฐ

์ฐธ๊ณ  ์‚ฌํ•ญ: ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๋งŽ์€ ์ด๋ฏธ์ง€๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

MongoDB๋ฅผ ์ถฉ๋ถ„ํžˆ ์‚ฌ์šฉํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€(๋˜๋Š” ์‚ญ์ œ)ํ•ด๋„ ๋ณผ๋ฅจ์€ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ์‚ญ์ œํ•  ๋•Œ๊นŒ์ง€ ๊ท€์ค‘ํ•œ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ๊ณ„์† ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

$ docker volume rm $(docker volume ls -q)

์•„๋‹ˆ๋ฉด ์ด๋ฏธ ์šฐ๋ฆฌ์—๊ฒŒ ์นœ์ˆ™ํ•œ prune ํ•˜์œ„ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da

Total reclaimed space: 25.82GB
luc@saturn:~$

์ด๋ฏธ์ง€ ๋นŒ๋“œ ์บ์‹œ์— ๋””์Šคํฌ ์‚ฌ์šฉ

Docker 18.09์—์„œ๋Š” BuildKit ๋„๊ตฌ ๋•๋ถ„์— ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ๋ถ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค ์†๋„๊ฐ€ ํ–ฅ์ƒ๋˜๊ณ  ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๋ณด์•ˆ ๊ด€๋ฆฌ๊ฐ€ ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ด ํ›Œ๋ฅญํ•œ ๋„๊ตฌ์˜ ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋””์Šคํฌ ๊ณต๊ฐ„ ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋งŒ ์ค‘์ ์„ ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™„์ „ํžˆ ๊ฐ„๋‹จํ•œ Node.Js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • index.js ํŒŒ์ผ์€ ์ˆ˜์‹ ๋œ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ํ•œ ์ค„๋กœ ์‘๋‹ตํ•˜๋Š” ๊ฐ„๋‹จํ•œ HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • package.json ํŒŒ์ผ์€ HTTP ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ expressjs๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ข…์†์„ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

$ cat index.js
var express = require('express');
var util    = require('util');
var app = express();
app.get('/', function(req, res) {
  res.setHeader('Content-Type', 'text/plain');
  res.end(util.format("%s - %s", new Date(), 'Got Request'));
});
app.listen(process.env.PORT || 80);

$ cat package.json
    {
      "name": "testnode",
      "version": "0.0.1",
      "main": "index.js",
      "scripts": {
        "start": "node index.js"
      },
      "dependencies": {
        "express": "^4.14.0"
      }
    }

์ด๋ฏธ์ง€ ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ Dockerfile์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]

BuildKit์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ docker build -t app:1.0 .

๋””์Šคํฌ ๊ณต๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๋ฉด ๊ธฐ๋ณธ ์ด๋ฏธ์ง€(node:13-alpine)์™€ ๋Œ€์ƒ ์ด๋ฏธ์ง€(app:1.0)๋งŒ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         2          0          109.3MB    109.3MB (100%)
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

BuildKit์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‘ ๋ฒˆ์งธ ๋ฒ„์ „์„ ๋นŒ๋“œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด DOCKER_BUILDKIT ๋ณ€์ˆ˜๋ฅผ 1๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .

์ด์ œ ๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๋ฉด ๋นŒ๋“œ ์บ์‹œ(buid-cache)๊ฐ€ ์—ฌ๊ธฐ์— ํฌํ•จ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         2          0          109.3MB    109.3MB (100%)
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    11         0          8.949kB    8.949kB

์ด๋ฅผ ์ง€์šฐ๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

$ docker builder prune
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
Deleted build cache objects:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi

Total reclaimed space: 8.949kB

๋ชจ๋‘ ์ง€์šฐ์„ธ์š”!

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ปจํ…Œ์ด๋„ˆ, ์ด๋ฏธ์ง€, ๋ณผ๋ฅจ์ด ์ฐจ์ง€ํ•˜๋Š” ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. prune ํ•˜์œ„ ๋ช…๋ น์ด ์ด๋ฅผ ๋„์™€์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Docker ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N]

์–ด๋–ค ์ด์œ ๋กœ Docker ๋จธ์‹ ์˜ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ •๊ธฐ์ ์œผ๋กœ ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์Šต๊ด€์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€