๋ชฉ์ฐจ
ย Dockerfile
Dockerfile์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ ์ํด ์คํํด์ผ ํ ๋ชจ๋ ๋ช
๋ น์ด๋ฅผ ํฌํจํ๋ ํ
ํ๋ฆฟ ํ์ผ๋ก, ์คํฌ๋ฆฝํธ์ ์ ์ฌํ๋ค. Dockerfile์ ํ์ฅ์๊ฐ ์์ผ๋ฉฐ docker build ๋ช
๋ น์ด์ ์ํด ์ฌ์ฉ๋๊ณ ํด์๋๋ค. Dockerfile ๋ด๋ถ์ ๋ช
๋ น์ด๋ ํน๋ณํ ๋๋ฉ์ธ ํนํ ์ธ์ด(DSL)๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
ย docker build
์ด๋ฏธ์ง ๋น๋ ์ ์ฌ์ฉํ๋ ๋ช
๋ น์ด๋ก, Dockerfile ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ค.
docker build [option] [dockerfile ๊ฒฝ๋ก]
Bash
๋ณต์ฌ
ย Multi-Platform Builds
๋์ปค๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ข
์์ฑ์ ์ปจํ
์ด๋๋ก ํจํค์งํ์ฌ โ๋ด ์ปด์์ ๋๋๋ฐโ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ๋ค์ํ ํ๊ฒฝ์์ ๋์ผํ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ ์ ์์ง๋ง, ์ปจํ
์ด๋๋ ํธ์คํธ ์ปค๋์ ๊ณต์ ํ๋ฏ๋ก, ์ปจํ
์ด๋ ๋ด๋ถ์์ ์คํ๋๋ ์ฝ๋๋ ํธ์คํธ์ ์ํคํ
์ฒ์ ํธํ๋์ด์ผ ํ๋ค. ๋ฐ๋ผ์ linux/arm64 ์์๋ linux/amd64 ์ปจํ
์ด๋๋ฅผ ์คํํ ์ ์๊ณ , ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ ๋งค๋ํ์คํธ(manifest) ๋ฆฌ์คํธ๋ฅผ ํฌํจํ๋ฉฐ, ๊ฐ ๋งค๋ํ์คํธ๋ ๋ค๋ฅธ config์ ๋ ์ด์ด ์ธํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ ์ง์คํธ๋ฆฌ(registry)์ ๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ฅผ ํธ์ํ๋ฉด ๋ ์ง์คํธ๋ฆฌ๋ ๋งค๋ํ์คํธ ๋ฆฌ์คํธ์ ๋ชจ๋ ๊ฐ๋ณ ๋งค๋ํ์คํธ๋ฅผ ์ ์ฅํ๋ค. ์ด๋ฏธ์ง๋ฅผ Pullํ๋ฉด ๋ ์ง์คํธ๋ฆฌ๋ ๋งค๋ํ์คํธ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๊ณ Docker๋ ํธ์คํธ์ ์ํคํ
์ฒ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๋ณํ๋๋ค.
ย Prerequisites
๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ธฐ ์ํด์๋ Docker ํ๊ฒฝ์ด ์ด๋ฅผ ์ง์ํ๋๋ก ์ค์ ์ด ๋์ด์๋์ง ํ์ธํด์ผ ํ๋๋ฐ, ์ด๋์ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง์ด๋ค.
1.
โClassicโ image store โ Containerd image store ์ ํ
โข
Docker Engine์ ๊ธฐ๋ณธ ์ด๋ฏธ์ง ์ ์ฅ์(store)๋ ๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ฅผ ์ง์ํ์ง ์๋๋ค. containerd์ด๋ฏธ์ง๋ก ์ ํํ๋ฉด Docker Engine์ด ๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ฅผ push, pull, build ํ ์ ์๋ค.
2.
Custom builder ์ฌ์ฉ
โข
docker-container ๋๋ผ์ด๋ฒ์ฒ๋ผ ๋ค์ค ํ๋ซํผ์ ์ง์ํ๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๋ ์ปค์คํ
๋น๋๋ฅผ ๋ง๋ค๋ฉด, ๋ค๋ฅธ ์ด๋ฏธ์ง ์ ์ฅ์๋ก ์ ํํ์ง ์์๋ ๋๋ค. ํ์ง๋ง Docker Engine image store์ ๋น๋ํ ๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ์๋ ์๋ค. ํ์ง๋ง docker build --push ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ปจํ
์ด๋ ๋ ์ง์คํธ๋ฆฌ์ ์ง์ ํธ์ํ ์ ์๋ค.
ย Custom builder
์์ ์๊ฐ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค Custom builder๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ์ ํ๋ค.
๋จผ์ buildx๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ธฐ ๋๋ฌธ์ ์ค์น๋ฅผ ์งํํ๋ค. buildx๋ ๋ฉํฐํ๋ซํผ ๋น๋, ๋ณ๋ ฌ ๋น๋, ์บ์ ๊ด๋ฆฌ, ๋น๋ ์๋ฎฌ๋ ์ด์
ํ์ธ์ ์ง์ํ๋ docker CLI ํ์ฅ ํ๋ฌ๊ทธ์ธ์ด๋ค. Docker 19.03 ์ดํ ๋ฒ์ ๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
sudo apt install docker-buildx
Bash
๋ณต์ฌ
docker builder ls๋ก ๋น๋ ๋ชฉ๋ก๊ณผ ์ ๋ณด๋ฅผ ํ์ธํ๋ค. ํ์ฌ ์ฌ์ฉ ์ค์ธ ๋น๋์๋ * ํ์๊ฐ ๋์ด ์๋ค.
$ docker builder ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * docker
default default running v0.11.7+d3e6c1360f6e linux/arm64
Shell
๋ณต์ฌ
๋ฉํฐ ํ๋ซํผ์ ์ง์ํ๋ ๋๋ผ์ด๋ฒ์ธ docker-container๋ฅผ ์ฌ์ฉํ๋ ๋น๋๋ฅผ ์์ฑํ๋ค.
$ docker buildx create --name multi-arch-builder --driver docker-container --bootstrap --use
[+] Building 2.6s (1/1) FINISHED
=> [internal] booting buildkit 2.6s
=> => pulling image moby/buildkit:buildx-stable-1 2.0s
=> => creating container buildx_buildkit_multi-arch-builder0 0.6s
multi-arch-builder
Shell
๋ณต์ฌ
โข
--driver: ์ฌ์ฉํ ๋๋ผ์ด๋ฒ ์ค์
โข
--bootstrap: ๋น๋ ์์ฑ์ด ๋๋๋ฉด ์๋ ์ด๊ธฐํ
โข
--use: ๋น๋ ์ฌ์ฉ
์ปจํ
์ด๋ ๋ ์ง์คํธ๋ฆฌ์ --push ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํฐ ํ๋ซํผ ์ด๋ฏธ์ง ๋น๋์ ๋์์ ์ปจํ
์ด๋ ๋ ์ง์คํธ๋ฆฌ์ pushํ๋ค. ์ด๋ -t ์ต์
์ ์ฌ๋ฐ๋ฅธ ์ปจํ
์ด๋ ๋ ์ง์คํธ๋ฆฌ URI๋ฅผ ์ฌ์ฉํด์ผํ๋ฉฐ, docker login์ผ๋ก ์ฌ์ฉํ ์ปจํ
์ด๋ ๋ ์ง์คํธ๋ฆฌ์ ๋ก๊ทธ์ธ์ด ์ ํ๋์ด์ผ ํ๋ค.
$ docker buildx build --platform linux/arm64,linux/amd64 -t <Registry URI>/buildx-test --push .
[+] Building 9.2s (9/9) FINISHED docker-container:multi-arch-builder
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 90B 0.0s
=> [linux/amd64 internal] load metadata for docker.io/library/nginx:latest 0.7s
=> [linux/arm64 internal] load metadata for docker.io/library/nginx:latest 0.7s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> CACHED [linux/amd64 1/1] FROM docker.io/library/nginx:latest@sha256:fb197595ebe76b9c0 0.0s
... (์ดํ ์๋ต)
Shell
๋ณต์ฌ
์์ ์ค๋ช
ํ๋ฏ Docker Engine image store์๋ ๋น๋ํ ๋ค์ค ํ๋ซํผ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ์ ์๊ธฐ ๋๋ฌธ์ --push ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด๋ฏธ์ง ๋น๋๊ฐ ์ ์์ ์ผ๋ก ์๋ฃ๋์ง ์๋๋ค.
ย Dockerfile Instructions
FROM | ์ปจํ
์ด๋ ์์ ์์ฑํ ๊ธฐ๋ณธ Image ์ง์ ..)
Dockerfile์ ์ฒซ ๋ผ์ธ์ ์์ฑ
ํ์ : FROM <์ด๋ฏธ์ง>
์ : FROM openjdk:1.7 |
RUN | ์ด๋ฏธ์ง build process ์ค์ ์คํํ ๋ช
๋ น์ด ์ค์
ํ์ : RUN <command_name> |
CMD | ์ปจํ
์ด๋ ์์์ ์คํํ ๋ช
๋ น์ด(application์ ์คํํ๊ธฐ ์ํ ๋ช
๋ น์ด)
๋๊ฐ ์ด์์ CMD ์กด์ฌ์ ๋ง์ง๋ง CMD๋ง ์คํ
CMD [โ์คํ ๊ฐ๋ฅโ, โparam1โ, โparam2โ]
ENTROYPOINT์์ ์ฐจ์ด์ : ์คํ์ ๋ฐ์ ์ธ์๋ก ๋์ฒดํด์ ์คํ ๊ฐ๋ฅ
๋ช
๋ น์ด์ ์ถ๊ฐ ๋๋ ์ธ์ ๊ฐ ์ ์ํด์ฃผ๋ ํ์์ผ๋ก ์ฌ์ฉ |
LABEL | ์ด๋ฏธ์ง์ ๋ ์ด๋ธ ์ง์ ํด์ project ์ด๋ฏธ์ง ๊ตฌ์ฑ |
EXPOSE | ์ปจํ
์ด๋์์ ๋
ธ์ถํ๋ ํฌํธ ๋ฒํธ ์ค์
์ปจํ
์ด๋๊ฐ ๋ฐํ์์ ์์ ํ ํฌํธ๋ฅผ docker์๊ฒ ์๋ ค์ค
ํธ์คํธ์ ์ฐ๊ฒฐํ ํฌํธ ๋ฒํธ๋ฅผ ์ง์ |
ENV | ์ด๋ฏธ์ง ๋ด๋ถ ๋ฐ ์คํ ์ค์ธ ์ปจํ
์ด๋์์ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ ๋ณ์ ์ค์ |
ADD | ์ด๋ฏธ์ง์ ํ์ผ ๋ณต์ฌ
tar์ ๊ฐ์ ์์ถํ์ผ์ ํ์ด์ ์ถ๊ฐ, wget๋ฑ๊ณผ ๊ฐ์ ์๊ฒฉ ์ ์ฅ์์ ์์ ์ค์ ๊ฐ๋ฅ(remote-url) |
COPY | ์ด๋ฏธ์ง์ ํ์ผ ๋ณต์ฌ
ํธ์คํธ์ ๋ก์ปฌ ์์์ ๋๋ ํ ๋ฆฌ ๋๋ ํ์ผ์ ๊ทธ๋๋ก ๋ณต์ฌ |
ENTRYPOINT | ์ปจํ
์ด๋ ์์์ ์คํํ ์ปค๋งจ๋ ์ค์
์์ฑ๋ ์ด๋ฏธ์ง ํ์ผ์์ ์ ์๋ ๋ช
๋ น์ด๋ก๋ง ์คํ
๊ณ ์ ๋ช
๋ น์ด ์ค์ ์ ์ ์ฉ |
VOLUME | ๋ณผ๋ฅจ์ด ๋ง์ดํธ ๋ ์์น ์ค์
ํธ์คํธ์ ๊ณต์ ํ ๋๋ ํ ๋ฆฌ ๋ชฉ |
USER | ์ปค๋งจ๋๋ฅผ ์คํํ ๋ ์ฌ์ฉ์ ID ์ค์ |
WORKDIR | docker์๊ฒ ์ปจํ
์ด๋์ ์์
๋๋ ํฐ๋ฆฌ๋ก ์ค์
๋๋ ํ ๋ฆฌ ๋ฏธ ์กด์ฌ์ ์์ฑ |
ARG | ๋น๋ ์์๋ง ์ฌ์ฉ๋๋ ๋ณ์ ์ค์ |
ONBUILD | ์ด๋ฏธ์ง๋ฅผ ๋ฒ ์ด์ค๋ก ๋น๋ํ ๋ ์ปค๋งจ๋๊ฐ ์คํ๋๋๋ก ํ๊ธฐ |
STOPSIGNAL | ์ปจํ
์ด๋๋ฅผ ์ค์ง์ํฌ ๋์ ์๊ทธ๋ ๋ฒํธ ์ค์ |
HEALTHCHECK | ํฌ์ค ์ฒดํฌ(์ปจํ
์ด๋๊ฐ ๊ณ์ ์๋ํ๋์ง ํ์ธ)๋ฅผ ์ํ ์ปค๋งจ๋ ์ค์ |
WORKDIR | Docker File์ ์๋ RUN, CMD, ENTRYPOINT, COPY, ADD ๋ฑ์ ์ง์๋ฅผ ์ํํ ๊ณณ
COPY ๋ช
๋ น์ ๋ํ ์์
๋ํ
ํ ๋ฆฌ ์ค์ ํ๋๋ฐ ์ฌ์ฉ
์์
๋๋ ํฐ๋ฆฌ๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ ํ ๋ฆฌ๊ฐ ์์ฑ๋จ |