Dockerfile์ด๋?!
Docker ์ด๋ฏธ์ง๋ค์ ๋๊ตฐ๊ฐ ๋ง๋ค์ด์ Dockerhub์ ์ฌ๋ ค๋๊ณ , ๊ทธ๊ฑธ ๋ค์ด๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด Docker ์ด๋ฏธ์ง๋ ์ด๋ป๊ฒ ๋ง๋๋๊ฑธ๊น?
Dockerfile์ด๋ผ๋ ๊ฒ์ ํ์ฉํด์ Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด, Dockerfile์ด๋ Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ฒ ํด์ฃผ๋ ํ์ผ์ด๋ค.
FROM : ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์์ฑ
FROM์ ๋ฒ ์ด์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ์ญํ ์ ํ๋ค. Docker ์ปจํ
์ด๋๋ฅผ ํน์ ์ด๊ธฐ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ถ๊ฐ์ ์ธ ์ธํ
์ ํ ์ ์๋ค.
์ฌ๊ธฐ์ ๋งํ๋ 'ํน์ ์ด๊ธฐ ์ด๋ฏธ์ง'๊ฐ ๊ณง ๋ฒ ์ด์ค ์ด๋ฏธ์ง์ด๋ค.
์ปจํ ์ด๋๋ฅผ ์๋ก ๋์์ ๋ฏธ๋ ์ปดํจํฐ ํ๊ฒฝ์ ๊ตฌ์ถํ ๋ ๊ธฐ๋ณธ ํ๋ก๊ทธ๋จ์ด ์ด๋ค ๊ฒ ๊น๋ ค์์ผ๋ฉด ์ข๊ฒ ๋์ง ์ ํํ๋ ์ต์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
# ๋ฌธ๋ฒ
FROM [์ด๋ฏธ์ง๋ช
]
FROM [์ด๋ฏธ์ง๋ช
]:[ํ๊ทธ๋ช
]
๐ ํ๊ทธ๋ช ์ ์ ์ง ์์ผ๋ฉด ํด๋น ์ด๋ฏธ์ง์ ์ต์ (latest) ๋ฒ์ ์ ์ฌ์ฉํ๋ค.
์ค์ต
1. Dockerfile ๋ง๋ค๊ธฐ
# JDK 17
FROM openjdk:17-jdk
2. Dockerfile์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ
$ docker build -t my-jdk17-server .
3. ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋ ๋์ฐ๊ธฐ
$ docker run -d my-jdk17-server
4. ์ปจํ ์ด๋ ์กฐํํ๊ธฐ
$ docker ps # ์คํ๋๊ณ ์๋ ์ปจํ
์ด๋๊ฐ ์๋ค.
$ docker ps -a # ํ์ธํด๋ณด๋ ์ปจํ
์ด๋๊ฐ ์ข
๋ฃ๋์ด ์๋ค.
5. ์ปจํ
์ด๋ ๋ด๋ถ๋ก ๋ค์ด๊ฐ์ jdk๊ฐ ์ ๊น๋ ธ๋์ง ํ์ธํ๊ธฐ
FROM openjdk:17-jdk
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
$ docker build -t my-jdk17-server . # ์ด๋ฏธ์ง ๋น๋
$ docker run -d my-jdk17-server # ์ปจํ
์ด๋ ์คํ
$ docker ps # ์คํ ์ค์ธ ์ปจํ
์ด๋ ์กฐํ
$ docker exec -it [์ปจํ
์ด๋ ID] bash # ์ปจํ
์ด๋ ์ ์
$ java -version # JDK ์ค์น๋์ด ์๋ ์ง ํ์ธ
์ข ๋ฃ๋ ์ปจํ ์ด๋์ ๋ค์ด๊ฐ์ ๋๋ฒ๊น ํ๊ณ ์ถ์ ๋
ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ์ค๊ฐ์ค๊ฐ ์ ์๋ํ๋์ง ํ์ธํ๋ ์ต๊ด์ ๊ต์ฅํ ์ค์ํ๋ค. ์ด๋ค ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๊ณ ๋ ๋ค์ ๋ช ๋ น์ด๊ฐ ์ ์์ ์ผ๋ก ์ํ๋๋์ง ์ด๋ป๊ฒ ํ์ธํ ์ ์๋์ง ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ผ ํ๋ค.
์ด ์ต๊ด์ด ๋ชธ์ ์ต์ผ๋ฉด ์ด๋ค ๋ช ๋ น์ด๋ฅผ ์ํํ๋๋ผ๋ ๊ทธ ๋ช ๋ น์ด๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ํํค์น ์ ์๊ฒ ๋๋ค.
๋ํ ์ด๋ค ๋ช ๋ น์ด๋ฅผ ์คํ์ํจ ๋ค์ ์๋ฌ๊ฐ ์๊ธฐ๋๋ผ๋ ๊ธ๋ฐฉ ๋ฐ๊ฒฌํ ์ ์์ด ๋๋ฒ๊น ๋ ํจ์ฌ ์์ํ๋ค.
๐ docker logs๋ฅผ ํ์ฉํด ์ปจํ
์ด๋ ๋ก๊ทธ ํ์ธํ๊ธฐ
๐ docker exec -it๋ฅผ ํ์ฉํด ์ปจํ
์ด๋ ๋ด๋ถ์ ์ง์ ๋ค์ด๊ฐ ๋ณด๊ธฐ
์์ ๋ฐฉ๋ฒ ์ค docker exec -it์ ์คํ ์ค์ธ ์ปจํ
์ด๋์๋ง ์ธ ์ ์๋ ๋ช
๋ น์ด์ด๋ค.
ํ์ง๋ง ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๋ฉด์ ์ปจํ
์ด๋๋ฅผ ์คํ์์ผ ๋ณด๋ฉด, ์ปจํ
์ด๋์ ํน์ฑ์ ๋ช
๋ น์ด ์ฒ๋ฆฌ๊ฐ ๋ค ๋๋๋ ๋๋ก ์ปจํ
์ด๋๊ฐ ์ข
๋ฃ๋๋ค.
๊ทธ๋ฌ๋ค ๋ณด๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์ปจํ
์ด๋๊ฐ ํ์ฑ๋๋์ง ๋๋ฒ๊น
์ ํ๋๋ฐ ์ด๋ ค์์ ๊ฒช๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
FROM openjdk:17-jdk
...
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 500์ด ๋์ ์์คํ
์ ์ผ์์ ์ง ์ํค๋ ๋ช
๋ น์ด
๐ ์ปจํ ์ด๋๊ฐ ๋ฐ๋ก ์ข ๋ฃ๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค. ๊ทธ๋ฐ ๋ค์ docker exec -it๋ฅผ ํ์ฉํด ์ปจํ ์ด๋ ๋ด๋ถ์ ์ง์ ๋ค์ด๊ฐ์ ๋๋ฒ๊น ์ ํ๋ฉด ๋๋ค.
COPY : ํ์ผ ๋ณต์ฌ(์ด๋)
COPY๋ ํธ์คํธ ์ปดํจํฐ์ ์๋ ํ์ผ์ ๋ณต์ฌํด์ ์ปจํ ์ด๋๋ก ์ ๋ฌํ๋ค.
# ๋ฌธ๋ฒ
COPY [ํธ์คํธ ์ปดํจํฐ์ ์๋ ๋ณต์ฌํ ํ์ผ์ ๊ฒฝ๋ก] [์ปจํ
์ด๋์์ ํ์ผ์ด ์์นํ ๊ฒฝ๋ก]
# ์์
COPY app.txt /app.txt
ํ์ผ ๋ณต์ฌํด ๋ณด๊ธฐ
1. app.txt ํ์ผ ๋ง๋ค๊ธฐ
2. 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
ํดํฐ ์์ ์๋ ๋ชจ๋ ํ์ผ ๋ณต์ฌ
1. my-app ๋๋ ํ ๋ฆฌ ๋ง๋ค๊ธฐ, my-app ๋ํ ํ ๋ฆฌ ์์ ํ์ผ ๋ง๋ค๊ธฐ
2. Dockerfile ๋ง๋ค์ด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
FROM ubuntu
COPY my-app /my-app/
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # ๋๋ฒ๊น
์ฉ ์ฝ๋
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash
$ ls
์์ผ๋์นด๋ ์ฌ์ฉํด ๋ณด๊ธฐ
1. app.txt, readme.txt ํ์ผ 2๊ฐ ๋ง๋ค๊ธฐ
2. Dockerfile ๋ง๋ค์ด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
FROM ubuntu
COPY *.txt /text-files/
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # ๋๋ฒ๊น
์ฉ ์ฝ๋
๐ /text-files๋ผ๊ณ ์ ์ผ๋ฉด ์ ๋๊ณ /text-files/๋ผ๊ณ ์ ์ด์ผ text-files๋ผ๋ ๋๋ ํ ๋ฆฌ ์์ ํ์ผ๋ค์ด ์ ์์ ์ผ๋ก ๋ณต์ฌ๋๋ค.
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash
$ ls
.dockerignore ์ฌ์ฉํด ๋ณด๊ธฐ
ํน์ ํ์ผ ๋๋ ํด๋๋ง COPY๋ฅผ ํ๊ณ ์ถ์ง ์์ ์ ์๋ค. ๊ทธ๋ด ๋ .dockerignore๋ฅผ ํ์ฉํ๋ค.
1. .dockerignore ํ์ผ ๋ง๋ค๊ธฐ
readme.txt
2. Dockerfile ๋ง๋ค์ด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
FROM ubuntu
COPY ./ /
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # ๋๋ฒ๊น
์ฉ ์ฝ๋
$ docker build -t my-server .
$ docker run -d my-server
$ docker exec -it [Container ID] bash
$ ls
ENTRYPOINT : ์ปจํ ์ด๋๊ฐ ์์ํ ๋ ์คํ๋๋ ๋ช ๋ น์ด
ENTRYPOINT๋ ์ปจํ
์ด๋๊ฐ ์์ฑ๋๊ณ ์ต์ด๋ก ์คํํ ๋ ์ํ๋๋ ๋ช
๋ น์ด๋ฅผ ๋ปํ๋ค.
ENTRYPOINT์๋ ๋ฏธ๋ ์ปดํจํฐ์ ์ ์์ ์ผ๊ณ ๋์ ์คํ์ํค๊ณ ์ถ์ ๋ช
๋ น์ด๋ฅผ ์ ์ผ๋ฉด ๋๋ค.
FROM ubuntu
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
$ docker build -t my-server .
$ docker run -d my-server
$ docker ps -a
$ docker logs [Container ID]
RUN : ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ์ฌ์ฉํ ๋ช ๋ น๋ฌธ ์คํ
RUN์ ์ด๋ฏธ์ง ์์ฑ ๊ณผ์ ์์ ๋ช ๋ น์ด๋ฅผ ์คํ์์ผ์ผ ํ ๋ ์ฌ์ฉํ๋ค.
# ๋ฌธ๋ฒ
RUN [๋ช
๋ น๋ฌธ]
# ์์
RUN npm install
RUN vs ENTRYPOINT
RUN์ '์ด๋ฏธ์ง ์์ฑ ๊ณผ์ '์์ ํ์ํ ๋ช
๋ น์ด๋ฅผ ์คํ์ํฌ ๋ ์ฌ์ฉํ๊ณ ,
ENTRYPOINT๋ ์์ฑ๋ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํ ์งํ์ ๋ช
๋ น์ด๋ฅผ ์คํ์ํฌ ๋ ์ฌ์ฉํ๋ค.
WORKDIR : ์์ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์
WORKDIR์ผ๋ก ์์
๋๋ ํ ๋ฆฌ๋ฅผ ์ ํํ๋ฉด ๊ทธ ์ดํ์ ๋ฑ์ฅํ๋ ๋ชจ๋ RUN, CMD, ENTRYPOINT, COPY, ADD ๋ช
๋ น๋ฌธ์ ํด๋น ๋๋ ํ ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ๋๋ค. ์์
๋๋ ํ ๋ฆฌ๋ฅผ ๊ตณ์ด ์ง์ ํด ์ฃผ๋ ์ด์ ๋ ์ปจํ
์ด๋ ๋ด๋ถ์ ํด๋๋ฅผ ๊น๋ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์์ด๋ค.
์ปจํ
์ด๋๋ Dockerfile์ ํตํด ์์ฑ๋๋ ํ์ผ๋ค์ ํน์ ํด๋์ ์ ๋ฆฌํด ๋๋ ๊ฒ์ด ์ถํ์ ๊ด๋ฆฌ๊ฐ ์ฝ๋ค.
๋ง์ฝ WORKDIR์ ์ฐ์ง ์์ผ๋ฉด ์ปจํ
์ด๋ ๋ด๋ถ์ ์กด์ฌํ๋ ๊ธฐ์กด ํ์ผ๋ค๊ณผ ๋ค์์ฌ๋ฒ๋ฆฐ๋ค.
# ๋ฌธ๋ฒ
WORKDIR [์์
๋๋ ํ ๋ฆฌ๋ก ์ฌ์ฉํ ์ ๋ ๊ฒฝ๋ก]
# ์์
WORKDIR /usr/src/app
EXPOSE : ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ฌ์ฉ ์ค์ธ ํฌํธ๋ฅผ ๋ฌธ์ํํ๊ธฐ
EXPOSE๋ ์ปจํ
์ด๋ ๋ด๋ถ์์ ์ด๋ค ํฌํธ์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์ง๋ฅผ ๋ฌธ์ํํ๋ ์ญํ ๋ง ํ๋ค.
์ฝ๊ฒ ์๊ธฐํ๋ฉด EXPOSE ๋ช
๋ น์ด๋ ์ฐ๋ ์ ์ฐ๋ ์๋ํ๋ ๋ฐฉ์์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
# ๋ฌธ๋ฒ
EXPOSE [ํฌํธ ๋ฒํธ]
# ์์
EXPOSE 3000