Post

[Docker] ๋„์ปคํŒŒ์ผ(Dockerfile)

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋‚˜๋งŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” Dockerfile์„ ์ •๋ฆฌํ•œ๋‹ค. ์ด๋ฏธ์ง€ ์ƒ์„ฑ์˜ ์„ค๊ณ„๋„ ์—ญํ• ์„ ํ•˜๋Š” Dockerfile์˜ ๋ช…๋ น์–ด๋“ค๊ณผ, ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ณ„ ๋นŒ๋“œ ์˜ˆ์‹œ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

Dockerfile์ด๋ž€? ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด๋“ค์„ ๋‹ด์€ ํ…์ŠคํŠธ ํŒŒ์ผ. ๊ฑด์ถ• ์„ค๊ณ„๋„์ฒ˜๋Ÿผ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ยทํŒจํ‚ค์ง€ ์„ค์น˜ยทํŒŒ์ผ ๋ณต์‚ฌยท์‹คํ–‰ ๋ช…๋ น ๋“ฑ์„ ์ •์˜ํ•˜๊ณ , docker build๋กœ ๋ช…๋ น์„ ์ˆœ์ฐจ ์‹คํ–‰ํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.


1. ๋นŒ๋“œ ํ๋ฆ„

flowchart LR
    DF["๐Ÿ“„ Dockerfile"]
    Build["๐Ÿ”จ docker build"]
    Image["๐Ÿ“€ ์ด๋ฏธ์ง€"]
    Run["๐Ÿ“ฆ ์ปจํ…Œ์ด๋„ˆ"]
    Hub[("๐Ÿณ Docker Hub")]
    DF --> Build --> Image
    Image -- run --> Run
    Image -- push --> Hub

2. ์ฃผ์š” ๋ช…๋ น์–ด

๋ช…๋ น์–ด์—ญํ• 
FROM๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ง€์ •(๋ฐ˜๋“œ์‹œ ์ฒซ ์ค„)
RUN์ด๋ฏธ์ง€ ๋นŒ๋“œ ์ค‘ ๋ช…๋ น ์‹คํ–‰(ํŒจํ‚ค์ง€ ์„ค์น˜ ๋“ฑ)
COPYํ˜ธ์ŠคํŠธ ํŒŒ์ผ์„ ์ด๋ฏธ์ง€๋กœ ๋ณต์‚ฌ
ADDCOPY + ์••์ถ• ํ•ด์ œยทURL ๋‹ค์šด๋กœ๋“œ
CMD์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ๊ธฐ๋ณธ ๋ช…๋ น(๋ฎ์–ด์“ฐ๊ธฐ ๊ฐ€๋Šฅ)
ENTRYPOINT์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ํ•ญ์ƒ ์‹คํ–‰ํ•  ๋ช…๋ น
ENVํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
EXPOSE์‚ฌ์šฉํ•  ํฌํŠธ ๋ช…์‹œ
VOLUME๋ฐ์ดํ„ฐ ์ €์žฅ ๋ณผ๋ฅจ ์ง€์ •
WORKDIR์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ์„ค์ •

๐Ÿ’ก CMD vs ENTRYPOINT โ€” CMD๋Š” docker run ๋’ค์— ๋ช…๋ น์„ ์ฃผ๋ฉด ๋ฎ์–ด์“ฐ๊ธฐ๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ด๊ณ , ENTRYPOINT๋Š” ํ•ญ์ƒ ๊ณ ์ • ์‹คํ–‰๋œ๋‹ค. ๋‘˜์„ ํ•จ๊ป˜ ์“ฐ๋ฉด ENTRYPOINT๊ฐ€ ์‹คํ–‰ ํŒŒ์ผ, CMD๊ฐ€ ๊ธฐ๋ณธ ์ธ์ž๊ฐ€ ๋˜๋Š” ์กฐํ•ฉ์ด ์ž์ฃผ ์“ฐ์ธ๋‹ค.

COPY vs ADD โ€” ๋‹จ์ˆœ ๋ณต์‚ฌ๋Š” COPY๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ๊ถŒ์žฅ๋œ๋‹ค. ADD๋Š” tar ์ž๋™ ํ•ด์ œยทURL ๋‹ค์šด๋กœ๋“œ ๊ฐ™์€ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ์ง€๋งŒ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์„ ํ”ผํ•˜๋ ค๋ฉด ๊ผญ ํ•„์š”ํ•  ๋•Œ๋งŒ ์“ด๋‹ค.


3. ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ โ€” ์ด๋ฏธ์ง€ ๋‹ค์ด์–ดํŠธ

์—ฌ๋Ÿฌ FROM์„ ์จ์„œ ๋นŒ๋“œ ๋‹จ๊ณ„์™€ ์‹คํ–‰ ๋‹จ๊ณ„๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. ๋นŒ๋“œ ๋„๊ตฌยท์ค‘๊ฐ„ ์‚ฐ์ถœ๋ฌผ์„ ์ตœ์ข… ์ด๋ฏธ์ง€์—์„œ ๋นผ, ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ณด์•ˆ์„ ๋†’์ธ๋‹ค.

1
2
3
4
5
6
7
8
9
10
# โ‘  ๋นŒ๋“œ ๋‹จ๊ณ„
FROM golang:1.15-alpine3.12 AS gobuilder-stage
WORKDIR /app/
COPY gostart.go /app/
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /app/gostart

# โ‘ก ์‹คํ–‰ ๋‹จ๊ณ„ (๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋ณต์‚ฌ)
FROM scratch
COPY --from=gobuilder-stage /app/gostart /app/gostart
CMD ["/app/gostart"]

๐Ÿ’ก ํ•ต์‹ฌ์€ COPY --from์ด๋‹ค. ๋นŒ๋“œ ๋‹จ๊ณ„(๋ฌด๊ฑฐ์šด golang ์ด๋ฏธ์ง€)์—์„œ ์ปดํŒŒ์ผํ•œ ๊ฒฐ๊ณผ ๋ฐ”์ด๋„ˆ๋ฆฌ๋งŒ ์ตœ์ข… ๋‹จ๊ณ„(scratch, ๊ฑฐ์˜ ๋นˆ ์ด๋ฏธ์ง€)๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌยท์†Œ์Šค๋Š” ์ตœ์ข… ์ด๋ฏธ์ง€์— ๋‚จ์ง€ ์•Š์•„ ํฌ๊ธฐ๊ฐ€ ๊ทน์ ์œผ๋กœ ์ค„์–ด๋“ ๋‹ค.


4. ์–ธ์–ด๋ณ„ ๋นŒ๋“œ ์˜ˆ์‹œ

Nginx ์›น ์„œ๋ฒ„:

1
2
3
4
5
FROM ubuntu:20.04
RUN apt -y update && apt install -y -q nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Flask ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜:

1
2
3
4
5
6
7
8
FROM python:3.9-slim
WORKDIR /app
COPY requirement.txt .
COPY app/static static
COPY app/template template
COPY app.py .
RUN pip install --no-cache-dir -r requirement.txt
CMD ["python", "app.py"]

๐Ÿ’ก python:3.9-slim์ฒ˜๋Ÿผ -slim/-alpine ๊ฒฝ๋Ÿ‰ ๋ฒ ์ด์Šค๋ฅผ ์“ฐ๊ณ , pip install --no-cache-dir๋กœ ์บ์‹œ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š์œผ๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ๋” ๊ฐ€๋ฒผ์›Œ์ง„๋‹ค. Nexus ๊ฐ™์€ ๋„๊ตฌ๋กœ ํ”„๋ผ์ด๋น— ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด ์ด๋Ÿฐ ์ด๋ฏธ์ง€๋ฅผ ํŒ€ ๋‚ด๋ถ€์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
Dockerfile
โ”œโ”€ ๊ฐœ๋…   ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์„ค๊ณ„๋„(docker build๋กœ ์‹คํ–‰)
โ”œโ”€ ๋ช…๋ น   FROM/RUN/COPY/CMD/ENTRYPOINT/ENV/EXPOSE...
โ”œโ”€ ์ตœ์ ํ™” ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ(COPY --from)๋กœ ํฌ๊ธฐโ†“
โ””โ”€ ์‹ค์Šต   ๊ฒฝ๋Ÿ‰ ๋ฒ ์ด์Šค(-slim/-alpine) + ์บ์‹œ ์ œ๊ฑฐ
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
Dockerfile์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ช…๋ น์„œ
CMD vs ENTRYPOINT๋ฎ์–ด์“ฐ๊ธฐ ๊ธฐ๋ณธ๊ฐ’ vs ๊ณ ์ • ์‹คํ–‰
๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€๋นŒ๋“œ/์‹คํ–‰ ๋ถ„๋ฆฌ๋กœ ์ด๋ฏธ์ง€ ๊ฒฝ๋Ÿ‰ํ™”

Dockerfile์˜ ํ•ต์‹ฌ์€ ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€๋ฅผ ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํŠนํžˆ ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋Š” ์‹ค๋ฌด์—์„œ ์ด๋ฏธ์ง€ ํฌ๊ธฐ์™€ ๋ณด์•ˆ์„ ๋™์‹œ์— ์žก๋Š” ํ•„์ˆ˜ ๊ธฐ๋ฒ•์ด๋‹ˆ ๊ผญ ์ตํ˜€๋‘์ž.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.