Search
๐Ÿ“„

Dockerfile

Date
2024/12/06
Category
Devops
Tag
Docker
๋ชฉ์ฐจ

ย 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 ๋ช…๋ น์— ๋Œ€ํ•œ ์ž‘์—… ๋””ํ…ํ† ๋ฆฌ ์„ค์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋จ