[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 | ํธ์คํธ ํ์ผ์ ์ด๋ฏธ์ง๋ก ๋ณต์ฌ |
ADD | COPY + ์์ถ ํด์ ยทURL ๋ค์ด๋ก๋ |
CMD | ์ปจํ ์ด๋ ์คํ ์ ๊ธฐ๋ณธ ๋ช ๋ น(๋ฎ์ด์ฐ๊ธฐ ๊ฐ๋ฅ) |
ENTRYPOINT | ์ปจํ ์ด๋ ์คํ ์ ํญ์ ์คํํ ๋ช ๋ น |
ENV | ํ๊ฒฝ ๋ณ์ ์ค์ |
EXPOSE | ์ฌ์ฉํ ํฌํธ ๋ช ์ |
VOLUME | ๋ฐ์ดํฐ ์ ์ฅ ๋ณผ๋ฅจ ์ง์ |
WORKDIR | ์์ ๋๋ ํฐ๋ฆฌ ์ค์ |
๐ก
CMDvsENTRYPOINTโCMD๋docker run๋ค์ ๋ช ๋ น์ ์ฃผ๋ฉด ๋ฎ์ด์ฐ๊ธฐ๋๋ ๊ธฐ๋ณธ๊ฐ์ด๊ณ ,ENTRYPOINT๋ ํญ์ ๊ณ ์ ์คํ๋๋ค. ๋์ ํจ๊ป ์ฐ๋ฉดENTRYPOINT๊ฐ ์คํ ํ์ผ,CMD๊ฐ ๊ธฐ๋ณธ ์ธ์๊ฐ ๋๋ ์กฐํฉ์ด ์์ฃผ ์ฐ์ธ๋ค.
COPYvsADDโ ๋จ์ ๋ณต์ฌ๋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์ ํต์ฌ์ ๋ช ๋ น์ด๋ก ์ด๋ฏธ์ง๋ฅผ ์ฌํ ๊ฐ๋ฅํ๊ฒ ์ ์ํ๋ ๊ฒ์ด๋ค. ํนํ ๋ฉํฐ ์คํ ์ด์ง ๋น๋๋ ์ค๋ฌด์์ ์ด๋ฏธ์ง ํฌ๊ธฐ์ ๋ณด์์ ๋์์ ์ก๋ ํ์ ๊ธฐ๋ฒ์ด๋ ๊ผญ ์ตํ๋์.
Comments powered by Disqus.