[Recent Interests] Data Engineering / MLOps
Docker ๋นŒ๋“œ ์‹œ๊ฐ„์„ 40% ๋‹จ์ถ•ํ•œ ๋ฐฉ๋ฒ• (๋ฒˆ์—ญ)

docker์—์„œ ์ตœ์ดˆ๋กœ ๋นŒ๋“œ๋ฅผ ํ•  ๋•Œ์— ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ์ถ”๊ฐ€๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋ฉด ๋ ˆ์ด์–ด๊ฐ€ ์Œ“์ด๋ฉด์„œ ์†๋„๊ฐ€ ์ฒ˜์Œ ๋ณด๋‹ค๋Š” ์ค„๊ธฐ๋Š” ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ˆ˜์˜ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์†๋„์™€ ์šฉ๋Ÿ‰์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง€๊ธฐ๋„ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” medium์—์„œ Niels Claeys์˜ How we reduced our docker build times by 40% ๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์บ์‹œ ์ •๋ณด๋ฅผ ์›๊ฒฉ์œผ๋กœ ์ €์žฅํ•˜๊ณ , link ์˜ต์…˜์„ ํ™œ์šฉํ•ด์„œ ๋นŒ๋“œ ์‹œ๊ฐ„์„ 40% ๊ฐ€๊นŒ์ด ๋‹จ์ถ•ํ–ˆ๋‹ค๋Š” ํฅ๋ฏธ๋กœ์šด ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค!
 

๋ฐฐ๊ฒฝ

  • ์ œํ’ˆ์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ์— ๋Œ€ํ•œ ๋„์ปค ์ด๋ฏธ์ง€ ๊ตฌ์ถ•
  • CI ๋นŒ๋“œ ์‹œ๊ฐ„์ด 5๋ถ„ ์ด์ƒ ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ(์ปคํ”ผ ํ•œ ์ž” ํ•  ์ •๋„์˜ ์ด์ƒ์  ๊ธธ์ด)
  • 5๋ถ„ ์ด์ƒ ๊ฑธ๋ฆฌ๋ฉด ์ƒ์‚ฐ์„ฑ์ด ์ €ํ•˜

์ƒ์‚ฐ์„ฑ ์ €ํ•˜์˜ ์›์ธ

  • ๊ฐœ๋ฐœ์ž๋Š” ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์‹œ๊ฐ„ ๋‚ญ๋น„
  • ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์€ ์ปจํ…์ŠคํŠธ ์ „ํ™˜์— ๋น„ํšจ์œจ ์ดˆ๋ž˜

 
๊ฐœ์„  ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „์— best practices for writing Dockerfile ๋‚ด์šฉ์„ ์ด๋ฏธ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

  • minimize the number of layers
  • use multistage builds
  • use a minimal base image
  • โ€ฆ

Buildkit๊ณผ Buildx

Buildkit

๊ธฐ์กด Docker Builder๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฐœ์„ ๋œ ๋ฐฑ์—”๋“œ. (๋„์ปค ์—”์ง„ 23.0๋ถ€ํ„ฐ ๊ธฐ๋ณธ ๋นŒ๋”)

  • ๊ฐœ์„ ๋œ ์บ์‹ฑ ๊ธฐ๋Šฅ
  • ๋ ˆ์ด์–ด ๋ณ‘๋ ฌ ๋นŒ๋“œ ๊ธฐ๋Šฅ
  • ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์˜ lazy pulling (โ‰ฅ Buildkit 0.9)

Builkit์„ ์‚ฌ์šฉํ•˜๋ฉด docker build ๋ช…๋ น์˜ ์ถœ๋ ฅ์ด ๊น”๋”ํ•˜๊ณ  ๊ตฌ์กฐ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
 
๋ฒ„์ „ 23.0 ์ด์ „์˜ Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Buildkit์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด Buildkit ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์„ค์ •ํ•˜์„ธ์š”

DOCKER_BUILDKIT=1 docker build --platform linux/amd64 . -t someImage:someVersion
DOCKER_BUILDKIT=1 docker push someImage:someVersion

Buildx 

Buildx๋Š” Docker์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ Buildkit์˜ ๋ชจ๋“  ์ž ์žฌ๋ ฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด configuration option๋“ค์ด Buildkit์—์„œ ์ง€์›๋˜์ง€๋งŒ, ์ด์ „ ๋ฒ„์ „์˜ docker build ๋ช…๋ น์–ด์— ์—ญํ˜ธํ™˜ ๋ฐฉ์‹์œผ๋กœ ํ†ตํ•ฉ๋˜๊ธฐ ์–ด๋ ค์›Œ์„œ ๊ฐœ๋ฐœ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค.
 
์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ Buildx๋Š” ์—ฌ๋Ÿฌ ๋นŒ๋”๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. (CI์—์„œ ์Šค์ฝ”ํ”„๊ฐ€ ์ง€์ •๋œ ํ™˜๊ฒฝ์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์œ ์šฉ) ๊ณต์œ  Docker ๋ฐ๋ชฌ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์—ฌ๋Ÿฌ ๋นŒ๋”๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
Buildx๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์„ธ์š”.

docker buildx create --bootstrap --name builder
docker buildx use builder

 

remote cache์˜ ์ด์ 

์ด๋ฏธ์ง€๋ฅผ ์›๊ฒฉ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์บ์‹œํ•˜์—ฌ ๋นŒ๋“œ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. CI์—์„œ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์—๋„ ๋นŒ๋“œ ์บ์‹œ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ์ตœ์‹  ๋ฒ„์ „์„ ๊ฐ€์ ธ์™€์„œ ๋กœ์ปฌ์— ์บ์‹œํ•ด์„œ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์†ํ™”ํ•ฉ๋‹ˆ๋‹ค. (์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๋ ˆ์ด์–ด๋ฅผ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ๋กœ์ปฌ์—์„œ ์บ์‹œ ์‚ฌ์šฉ)

docker pull someImage:latest || true
docker build --platform linux/amd64 . \
-t someImage:someVersion \
-f Dockerfile \
--cache-from someImage:latest

 
Buildx๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์บ์‹œ ์ •๋ณด๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์ €์žฅ ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค.(ex. container registry, blob storage, ..)
๋นŒ๋”๋Š” ํŠน์ • ๋ ˆ์ด์–ด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ , ์กด์žฌํ•œ๋‹ค๋ฉด ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  โ†’ ์ด ์ž‘์—…์€ ๋กœ์ปฌ๋กœ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ ๋„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ.
 
`--push` ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ ๋ช…๋ น์–ด๋ฅผ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

docker buildx build --platform linux/amd64 . \
-t someImage:someVersion --push \
--cache-to type=registry,ref=someCachedImage:someVersion,mode=max \
--cache-from type=registry,ref=someCachedImage:someVersion

 
`max` ๋ชจ๋“œ๋Š” ์ตœ์ข… ์ด๋ฏธ์ง€์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ ˆ์ด์–ด๋ฅผ ํฌํ•จํ•ด์„œ, ๋ชจ๋“  ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ๋นŒ๋“œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.(ex. multi stage build)
  โ†’ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” 'min' ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ตœ์ข… ์ด๋ฏธ์ง€์— ํ•„์š”ํ•œ ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ๋นŒ๋“œ ์ •๋ณด ์ €์žฅ
 
์บ์‹ฑ์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋Š” ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ `inline`์œผ๋กœ ์ €์žฅํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. Buildx ์—†์ด Buildkit์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ค‘ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๋” ๋ณต์žกํ•˜๊ณ , ์•„ํ‹ฐํŒฉํŠธ ์ถœ๋ ฅ๊ณผ ์บ์‹œ๊ฐ„์— ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. inline ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

docker buildx build - platform linux/amd64 . \
-t someImage:someVersion --push \
--cache-to type=inline,mode=max \
--cache-from someImage:somePreviousVersion

Docker ์ด๋ฏธ์ง€์— ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•

๋„์ปค์—์„œ๋Š” ๋„์ปค ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์„ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.`#syntax=docker/dockerfile:1.4`
COPY, ADD ๋ช…๋ น์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
 
์ด์ „์—๋Š” COPY ๋˜๋Š” ADD ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋”๊ฐ€ ์ƒˆ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜์—ฌ ์ƒˆ ํŒŒ์ผ์„ ๊ธฐ์กด ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ƒ์œ„ ๋ ˆ์ด์–ด๊ฐ€ ๋ชจ๋‘ ์กด์žฌํ•ด์•ผ ํ•จ
  • ์ด๋ฏธ์ง€(๋นŒ๋“œ ๋ช…๋ น์˜ ๊ฒฐ๊ณผ)๋Š” ๊ฐ ์Šค๋ƒ…์ƒท ๊ฐ„์˜ ์ฐจ์ด์ ์„ ํฌํ•จํ•˜๋Š” ๋ ˆ์ด์–ด๋‹น tarball ํŒŒ์ผ๋“ค๋กœ ๊ตฌ์„ฑ
FROM baseImage:version
COPY binary /opt/

 
link ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „ ๋ ˆ์ด์–ด์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ํŒŒ์ผ์ด ์ž์ฒด ์Šค๋ƒ…์ƒท์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๋งํฌ๋œ ํŒŒ์ผ์€ ์ž์ฒด tarball์— ์ €์žฅ๋˜๊ณ , ์•„๋ž˜์ฒ˜๋Ÿผ ๊ธฐ์กด ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ tarball์ด ํ•จ๊ป˜ ๋งํฌ ๋ฉ๋‹ˆ๋‹ค.

https://www.docker.com/blog/image-rebase-and-improved-remote-cache-support-in-new-buildkit/
# syntax=docker/dockerfile:1.4
FROM baseImage:version
COPY [--chown=<user>:<group>] [--chmod=<perms>] --link binary /opt/

์ด ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํŒŒ์ผ์ด ๋” ์ด์ƒ ์ด์ „ ๋ ˆ์ด์–ด์— ์ข…์†๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
(์ƒ์œ„ ๋ ˆ์ด์–ด๊ฐ€ ๋ณ€๊ฒฝ ๋˜๋”๋ผ๋„ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•œ ๋ ˆ์ด์–ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ์†๋„์˜ ํ–ฅ์ƒ๋„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

CI ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™”๋ฅผ ํ•˜๋ฉฐ ์–ป์€ ๋ช‡ ๊ฐ€์ง€ ํ†ต์ฐฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋„์ปค ๋นŒ๋“œ ์‹œ๊ฐ„์„ 40% ๋‹จ์ถ•ํ•˜๋Š” ๋ฐ์— ๋„์›€์ด ๋˜์—ˆ๋˜ ์ ์šฉ ๋‚ด์šฉ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋นŒ๋“œ ์บ์‹œ ์ •๋ณด๋ฅผ ์›๊ฒฉ ์ €์žฅ
  • Docker ์ด๋ฏธ์ง€์— ํŒŒ์ผ ์ถ”๊ฐ€, ๋ณต์‚ฌํ•  ๋•Œ link ์˜ต์…˜ ์‚ฌ์šฉ