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์ด ํจ๊ป ๋งํฌ ๋ฉ๋๋ค.
# syntax=docker/dockerfile:1.4
FROM baseImage:version
COPY [--chown=<user>:<group>] [--chmod=<perms>] --link binary /opt/
์ด ๋ฐฉ์์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ํ์ผ์ด ๋ ์ด์ ์ด์ ๋ ์ด์ด์ ์ข
์๋์ง ์๋๋ค๋ ์ ์
๋๋ค.
(์์ ๋ ์ด์ด๊ฐ ๋ณ๊ฒฝ ๋๋๋ผ๋ ํ์ผ์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ ๋ ์ด์ด ์ฌ์ฌ์ฉ ๊ฐ๋ฅ)
๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ์ฌ๋ฌ ๋ ์ด์ด๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น๋ ์๋์ ํฅ์๋ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
CI ํ์ดํ๋ผ์ธ ์ต์ ํ๋ฅผ ํ๋ฉฐ ์ป์ ๋ช ๊ฐ์ง ํต์ฐฐ์ ๋ํด ์ด์ผ๊ธฐ ํ์ต๋๋ค. ์ ์ฒด ๋์ปค ๋น๋ ์๊ฐ์ 40% ๋จ์ถํ๋ ๋ฐ์ ๋์์ด ๋์๋ ์ ์ฉ ๋ด์ฉ๋ค์ ์๋์ ๊ฐ์ต๋๋ค.
- ๋น๋ ์บ์ ์ ๋ณด๋ฅผ ์๊ฒฉ ์ ์ฅ
- Docker ์ด๋ฏธ์ง์ ํ์ผ ์ถ๊ฐ, ๋ณต์ฌํ ๋ link ์ต์ ์ฌ์ฉ