[[Docker ๐ณ] 4. DockerFile์ ํ์ฉํด ์ด๋ฏธ์ง ์ง์ ๋ง๋ค๊ธฐ
![[[Docker ๐ณ] 4. DockerFile์ ํ์ฉํด ์ด๋ฏธ์ง ์ง์ ๋ง๋ค๊ธฐ](/images/useBlog/docker.png)
DockerFile์ด๋?
Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ฒ ํด์ฃผ๋ ํ์ผ์ด๋ค.
FROM
FROM์ ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ์ญํ ์ ํ๋ค.
Docker ์ปจํ
์ด๋๋ฅผ ํน์ ์ด๊ธฐ ์ด๋ฏธ์ง ๊ธฐ๋ฐ์ผ๋ก ์ถ๊ฐ์ ์ธ ์ธํ
์ ํ ์ ์๋ค.
์ฌ๊ธฐ์ ๋งํ 'ํน์ ์ด๊ธฐ ์ด๋ฏธ์ง'๊ฐ ๊ณง ๋ฒ ์ด์ค ์ด๋ฏธ์ง์ด๋ค.
์ฌ์ฉ๋ฒ
# ๋ฌธ๋ฒ
FROM [์ด๋ฏธ์ง๋ช
]
FROM [์ด๋ฏธ์ง๋ช
]:[ํ๊ทธ๋ช
]
// ํ๊ทธ๋ช
์ ์ ์ง ์์ผ๋ฉด ํด๋น ์ด๋ฏธ์ง์ ์ต์ (latest) ๋ฒ์ ์ ์ฌ์ฉํ๋ค.
์ค์ต : FROM์ ์ด์ฉํ์ฌ ๋ ธ๋ ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
- Dockerfile ๋ง๋ค๊ธฐ
FROM NODE
- Dockerfile ๊ธฐ๋ฐ ์ด๋ฏธ์ง ๋ง๋๋ ๋ช ๋ น์ด
# docker build -t [์ด๋ฏธ์ง๋ช
]:[ํ๊ทธ๋ช
] [Dockerfile์ด ์กด์ฌํ๋ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก]
$ docker build -t my-next-app .
- ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋ ๋์ฐ๊ธฐ
$ docker run -d my-next-app

- ์ปจํ ์ด๋ ์กฐํํ๊ธฐ
$ docker ps # ์คํ๋๊ณ ์๋ ์ปจํ
์ด๋๊ฐ ์๋ค.
$ docker ps -a # ํ์ธํด๋ณด๋ ์ปจํ
์ด๋๊ฐ ์ข
๋ฃ๋์ด ์๋ค.
Docker์ ์ปจํ ์ด๋๋ ๋ด๋ถ์ ์ผ๋ก ํ์ํ ๋ช ๋ น์ ๋ค ์ํํ๋ฉด ์ปจํ ์ด๋๊ฐ ์ ์ ๋ก ์ข ๋ฃ๋๋ค.
- ์ปจํ ์ด๋ ๋ด๋ถ๋ก ๋ค์ด๊ฐ์ node๊ฐ ์ ๊น๋ ธ๋์ง ํ์ธํด๋ณด๊ธฐ Dockerfile
FROM node
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-next-app . # ์ด๋ฏธ์ง ๋น๋
$ docker run -d my-next-app # ์ปจํ
์ด๋ ์คํ
$ docker ps # ์คํ ์ค์ธ ์ปจํ
์ด๋ ์กฐํ
$ docker exec -it [์ปจํ
์ด๋ ID] bash # ์ปจํ
์ด๋ ์ ์
$ node -version # node ์ค์น๋์ด ์๋ ์ง ํ์ธ

COPY
COPY๋??
ํธ์คํธ ์ปดํจํฐ์ ์๋ ํ์ผ์ ๋ณต์ฌํด์ ์ปจํ ์ด๋๋ก ์ ๋ฌํ๋ค.
์ฌ์ฉ๋ฒ
# ๋ฌธ๋ฒ
COPY [ํธ์คํธ ์ปดํจํฐ์ ์๋ ๋ณต์ฌํ ํ์ผ์ ๊ฒฝ๋ก] [์ปจํ
์ด๋์์ ํ์ผ์ด ์์นํ ๊ฒฝ๋ก]
# ์์
COPY app.txt /app.txt
์ค์ต : ํ์ผ ๋ณต์ฌํด๋ณด๊ธฐ
app.txtํ์ผ ๋ง๋ค๊ธฐ- Dockerfile ๋ง๋ค์ด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ Dockerfile
FROM ubuntu
COPY app.txt /app.txt
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash
$ ls

์ค์ต : ํด๋ ์์ ๋ชจ๋ ํ์ผ๋ค ๋ณต์ฌ
-
my-app๋๋ ํฐ๋ฆฌ ๋ง๋ค๊ธฐ,my-app๋๋ ํฐ๋ฆฌ ์์ ํ์ผ ๋ง๋ค๊ธฐ -
Dockerfile ๋ง๋ค์ด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
FROM ubuntu
COPY my-app /my-app/
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server2 .
$ docker run -d my-server2
$ docker exec -it [Container ID] bash
$ ls

์ค์ต : ์์ผ๋ ์นด๋ ์ฌ์ฉํด๋ณด๊ธฐ
app.txt,readme.txtํ์ผ 2๊ฐ ๋ง๋ค๊ธฐ- Dockerfile ๋ง๋ค์ด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
FROM ubuntu
COPY *.txt /text-files/
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- ์ฃผ์)
/text-files๋ผ๊ณ ์ ์ผ๋ฉด ์ ๋๊ณ/text-files/๋ผ๊ณ ์ ์ด์ผtext-files๋ผ๋ ๋๋ ํ ๋ฆฌ ์์ ํ์ผ๋ค์ด ์ ์์ ์ผ๋ก ๋ณต์ฌ๋๋ค.
$ docker build -t my-server3 .
$ docker run -d my-server3
$ docker exec -it [Container ID] bash
$ ls

์ค์ต : .dockerignore ์ฌ์ฉํด๋ณด๊ธฐ
ํน์ ํ์ผ ๋๋ ํด๋๋ง
COPY๋ฅผ ํ๊ณ ์ถ์ง ์์ ์ ์๋ค. ๊ทธ๋ด ๋.dockerignore๋ฅผ ํ์ฉํ๋ค.
.dockerignoreํ์ผ ๋ง๋ค๊ธฐ .dockerignore
readme.txt
- Dockerfile ๋ง๋ค์ด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
FROM ubuntu
COPY ./ /
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server4 .
$ docker run -d my-server4
$ docker exec -it [Container ID] bash
$ ls
ENTRYPOINT
ENTRYPOINT๋ ์ปจํ
์ด๋๊ฐ ์์ฑ๋๊ณ ์ต์ด๋ก ์คํํ ๋ ์ํ๋๋ ๋ช
๋ น์ด๋ฅผ ๋ปํ๋ค.
์ฝ๊ฒ ์ค๋ช
ํ์๋ฉด ENTRYPOINT์๋ ๋ฏธ๋ ์ปดํจํฐ์ ์ ์์ ํค๊ณ ๋์ ์คํ์ํค๊ณ ์ถ์ ๋ช
๋ น์ด๋ฅผ ์ ์ผ๋ฉด ๋๋ค.
์ฌ์ฉ๋ฒ
# ๋ฌธ๋ฒ
ENTRYPOINT [๋ช
๋ น๋ฌธ...]
# ์์
ENTRYPOINT ["node", "dist/main.js"]
์ค์ต
Dockerfile
FROM ubuntu
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
$ docker build -t my-server5 .
$ docker run -d my-server5
$ docker ps -a
$ docker logs [Container ID]

RUN
์ด๋ฏธ์ง ์์ฑ ๊ณผ์ ์์ ๋ช ๋ น์ด๋ฅผ ์คํ์์ผ์ผ ํ ๋ ์ฌ์ฉํ๋ค.
์ฌ์ฉ๋ฒ
# ๋ฌธ๋ฒ
RUN [๋ช
๋ น๋ฌธ]
# ์์
RUN npm install
โ
ย RUN vs ENTRYPOINT
RUN ๋ช
๋ น์ด์ ENTRYPOINT ๋ช
๋ น์ด๊ฐ ํท๊ฐ๋ฆด ๋๊ฐ ์๋ค.
๋ ๋ค ๊ฐ์ด ๋ช
๋ น์ด๋ฅผ ์คํ์ํค๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์์ฐํ ๋์ ์ฌ์ฉ ์ฉ๋๋ ๋ค๋ฅด๋ค.
RUN์ โ์ด๋ฏธ์ง ์์ฑ ๊ณผ์ โ์์ ํ์ํ ๋ช
๋ น์ด๋ฅผ ์คํ์ํฌ ๋ ์ฌ์ฉํ๊ณ , ENTRYPOINT๋ ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํ ์งํ์ ๋ช
๋ น์ด๋ฅผ ์คํ์ํฌ ๋ ์ฌ์ฉํ๋ค.
์ค์ต
๋ฏธ๋ ์ปดํจํฐ ํ๊ฒฝ์ด ubuntu๋ก ๊ตฌ์ฑ๋์์ผ๋ฉด ์ข๊ฒ ๊ณ git์ด ๊น๋ ค์์ผ๋ฉด ์ข๊ฒ ๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ธฐ ์ํด Dockerfile์ ํ์ฉํด ubuntu, git์ด ๊น๋ ค์๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
- Dockerfile ์์ฑํ๊ธฐ Dockerfile
FROM ubuntu
RUN apt update && apt install -y git
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
- ์ด๋ฏธ์ง ๋น๋ ๋ฐ ์ปจํ ์ด๋ ์คํ
$ docker build -t my-server6 .
$ docker run -d my-server6
$ docker exec -it [Container ID] bash
$ git -v # ์ปจํ
์ด๋ ๋ด์ git์ด ์ ์ค์น๋๋ ์ง ํ์ธ

WORkDIR
WORKDIR์ผ๋ก ์์
๋๋ ํฐ๋ฆฌ๋ฅผ ์ ํํ๋ฉด ๊ทธ ์ดํ์ ๋ฑ์ฅํ๋ ๋ชจ๋ RUN, CMD, ENTRYPOINT, COPY, ADD ๋ช
๋ น๋ฌธ์ ํด๋น ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ๋๋ค.
์์
๋๋ ํฐ๋ฆฌ๋ฅผ ๊ตณ์ด ์ง์ ํด์ฃผ๋ ์ด์ ๋ ์ปจํ
์ด๋ ๋ด๋ถ์ ํด๋๋ฅผ ๊น๋ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์์ด๋ค.
์ปจํ
์ด๋๋ ๋ฏธ๋ ์ปดํจํฐ์ ๊ฐ๊ธฐ ๋๋ฌธ์ Dockerfile์ ํตํด ์์ฑ๋๋ ํ์ผ๋ค์ ํน์ ํด๋์ ์ ๋ฆฌํด๋๋ ๊ฒ์ด ์ถํ์ ๊ด๋ฆฌ๊ฐ ์ฝ๋ค.
๋ง์ฝ WORKDIR์ ์ฐ์ง ์์ผ๋ฉด ์ปจํ
์ด๋ ๋ด๋ถ์ ์กด์ฌํ๋ ๊ธฐ์กด ํ์ผ๋ค๊ณผ ๋ค์์ฌ๋ฒ๋ฆฐ๋ค.
์ฌ์ฉ๋ฒ
# ๋ฌธ๋ฒ
WORKDIR [์์
๋๋ ํ ๋ฆฌ๋ก ์ฌ์ฉํ ์ ๋ ๊ฒฝ๋ก]
# ์์
WORKDIR /usr/src/app
์ค์ต
-
app.txt,src,config.jsonํ์ผ ๋ง๋ค๊ธฐ -
Dockerfile๋ง๋ค์ด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํWORKDIR์ ์ ์ผ์ ๋ ํ์ผ์ด ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๋์ง ๋จผ์ ํ์ธDockerfile
FROM ubuntu COPY ./ ./ ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server7 . $ docker run -d my-server7 $ docker exec -it [Container ID] bash
$ ls

---
>WORKDIR์ ์ผ์ ๋ ํ์ผ์ด ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๋ ์ง ํ์ธ
Dockerfile
```docker
FROM ubuntu
WORKDIR /my-dir
COPY ./ ./
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-server8 .
$ docker run -d my-server8
$ docker exec -it [Container ID] bash
$ ls

์น ํ๋ก ํธ์๋ ํ๋ก์ ํธ (Next.js)๋ฅผ Docker๋ก ๋ฐฐํฌํ๊ธฐ
- Next.js ํ๋ก์ ํธ ๋ง๋ค๊ธฐ
$ npx create-next-app@latest
- Dockerfile ์์ฑํ๊ธฐ Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3000
ENTRYPOINT [ "npm", "run", "start" ]
- .dockerignore ์์ฑํ๊ธฐ .dockerignore
node_modules
- ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ npm install์ ํตํด ์ฒ์๋ถํฐ ๊น๋ํ๊ฒ ํ์ํ ์์กด์ฑ๋ง ์ค์นํ๋ค. ๋ฐ๋ผ์ ํธ์คํธ ์ปดํจํฐ์ ์๋ node_modules๋ ์ปจํ ์ด๋๋ก ๋ณต์ฌํด๊ฐ ํ์๊ฐ ์๋ค.
- Dockerfile์ ๋ฐํ์ผ๋ก ์ด๋ฏธ์ง ๋น๋ํ๊ธฐ
$ docker build -t my-web-server .
- ์ด๋ฏธ์ง๊ฐ ์ ์์ฑ๋๋์ง ํ์ธํ๊ธฐ
$ docker image ls
- ์์ฑํ ์ด๋ฏธ์ง๋ฅผ ์ปจํ ์ด๋๋ก ์คํ์์ผ๋ณด๊ธฐ
$ docker run -d -p 80:3000 my-web-server
- ์ปจํ ์ด๋๊ฐ ์ ์คํ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ
$ docker ps
- localhost:80์ผ๋ก ๋ค์ด๊ฐ๋ณด๊ธฐ

๊ทธ๋ฆผ์ผ๋ก ์ดํดํ๊ธฐ

FROM node vs FROM node:20-alpine
node: "์ ๋ถ ๋ค ๋ค์ด์๋ ์ข ํฉ ์ ๋ฌผ ์ธํธ" (๋ฌด๊ฒ์ง๋ง ํธ๋ฆฌํจ)
node:alpine: "๋ฑ ํ์ํ ๊ฒ๋ง ๋ค์ด์๋ ๋ฏธ๋๋ฉ๋ฆฌ์ฆ ์ธํธ" (๊ฐ๋ณ๊ณ ๋น ๋ฆ)
์ด๋ฌํ ์ฐจ์ด์ ๋๋ฌธ์ ์ฉ๋์ฐจ์ด๊ฐ ๋๋ค.
