Dockerfile์ด๋
Docker ์ด๋ฏธ์ง๊ฐ ์ด๋ค ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๋น๋(build)๊ฐ ๋๋ ๊ณผ์ ์ ํ
์คํธ ํ์ผ๋ก ํํํ ๊ฒ์
๋๋ค. Docker ์ด๋ฏธ์ง์๋ Layer)๊ฐ ์๋๋ฐ ์ด ๋ช
๋ น์ด ๋ผ์ธ ํ๋ ํ๋๊ฐ ์คํ๋๋ฉด์ image Layer
๋ฅผ ์ด๋ค์ ๊ฒฐ๊ตญ์๋ ํ๋์ ์ด๋ฏธ์ง๊ฐ ๋๋ ๊ฒ์
๋๋ค. (*์ถํ ํฌ์คํ
์์ )
*Dockerfile์ ํญ์ ์ต์์ ๋๋ ํ ๋ฆฌ์ ์์ด์ผ ํฉ๋๋ค.
Dockerfile ๋ช ๋ น๋ฌธ ํ์ Key Value
# ์ฃผ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ช
๋ น์ด(INSTRUCTION) ์ธ์(arguments)
๋ช
๋ น๋ฌธ์ ๋ช
๋ น์ด๋ก ์์ํ๊ณ ๊ทธ ๋ค์๋ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ์ค ์ ์์ต๋๋ค.
๋ช
๋ น์ด๋ ๋๋ฌธ์, ์ธ์๋ ์๋ฌธ์๋ก ๊ตฌ๋ถ์ง์ด ์ฌ์ฉํ๋ ๊ฒ์ด ๊ด๋ก๋ผ๊ณ ํฉ๋๋ค.
FROM :
# tag ์๋ต ์ default = latest
FROM <image>:<tag>
Docker ์ด๋ฏธ์ง์๋ base ์ด๋ฏธ์ง๊ฐ ์กด์ฌํด์ผ ํฉ๋๋ค. base ์ด๋ฏธ์ง์ ๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฌ๊ณ ์ฌ๋ฌ ๊ฐ์ Image Layer๋ฅผ ์์๊ฐ๋ฉฐ ๋ง๋ค ์ ์์ต๋๋ค.
base ์ด๋ฏธ์ง๋ฅผ ์ ์ธํด์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณดํต ๋งจ ์์ ์ ์ธํด์ค๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ๋ง์ด ์ ํํ๊ณ ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
- openjdk 1.8 (alpine)์ base ์ด๋ฏธ์ง๋ก ์ฌ์ฉ
FROM openjdk:8-alpine
- ubuntu ์ต์ ๋ฒ์ ์ base ์ด๋ฏธ์ง๋ก ์ฌ์ฉ
FROM ubuntu:latest
WORKDIR
WORKDIR
๋ช
๋ น์ด๋ ์(shell)์์ cd
๋ช
๋ น์ด ์ฒ๋ผ ์ปจํ
์ด๋ ์์์ ์์
๋๋ ํ ๋ฆฌ ์ค์ ์ ์ํด์ ์ฌ์ฉ๋๋ ๋ช
๋ น์ด์
๋๋ค. WORKDIR
๋ก ์์
๋๋ ํ ๋ฆฌ๋ฅผ ์ฎ๊ธฐ๋ฉด ํด๋น ๋๋ ํ ๋ฆฌ ๊ธฐ์ค์ผ๋ก ์์ผ๋ก ์ฌ์ฉํ๋ ๋ช
๋ น์ด๊ฐ ์คํ๋ฉ๋๋ค.
WORKDIR /app/v0.0.1/bin
RUN
RUN ["<command>", "<parameter>", "<parameter>", ..]
RUN <์ ์ฒด ์ปค๋งจ๋>
RUN
๋ช
๋ น์ด๋ ์(shell)์์ ์ปค๋งจ๋๋ฅผ ์คํํ๋ ๋ช
๋ น์ด์
๋๋ค. ์ด๋ฏธ์ง ๋น๋ ๊ณผ์ ์์ ํ์ํ ์ปค๋งจ๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ณดํต ์ด๋ฏธ์ง ์์ ํน์ ์ํํธ์จ์ด๋ฅผ ์ค์นํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- npm ํจํค์ง ์ค์น
RUN npm install
ENTRYPOINT
ENTRYPOINT ["<command>", "<parameter>", "<parameter">, ..]
ENTRYPOINT <์ ์ฒด ์ปค๋งจ๋>
ENTRYPOINT
๋ช
๋ น์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ปจํ
์ด๋๋ก ๋์ธ ๋ ํญ์ ์คํ๋์ผ ํ๋ ์ปค๋งจ๋๋ฅผ ์ง์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
CMD
CMD ["<command>", "<parameter>", "<parameter>", ..]
CMD ["<parameter>", "<parameter>"]
CMD <์ ์ฒด ์ปค๋งจ๋>
CMD
๋ช
๋ น์ด๋ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ปจํ
์ด๋๋ก ๋์ธ ๋๋ default๋ก ์คํํ ์ปค๋งจ๋, ENTRYPOINT
๋ช
๋ น์ด๋ก ์ง์ ๋ ์ปค๋งจ๋์ default๋ก ๋๊ธธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
CMD
๋ช
๋ น์ด๋ ENTRYPOINT
์ ํจ๊ป ์ฌ์ฉ๋๊ธฐ๋ ํ๋๋ฐ, ์ด๋ ๋ณดํต ENTRYPOINT
๋ ์ปค๋งจ๋๋ก CMD
๋ default ํ๋ผ๋ฏธํฐ๋ก ์ง์ ํด์ฃผ๋ฉด ์ ์ฐํ๊ฒ ์คํํ ์ ์๊ฒ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก
node test1.js
๋ฅผ ์คํํ๊ธฐ ์ํ Dockerfile
# test-image
ENTRYPOINT ["node"]
CMD ["test1.js"]
node test1.js
์คํ
docker run test-image
node test2.js
์คํ
docker run test-image test2.js
CMD
vs RUN
๋ช
๋ น์ด
RUN
๋ช
๋ น์ด๋ ์ด๋ฏธ์ง ๋น๋ ์ ํญ์ ์คํ๋๋ฉฐ, ํ dockerfile ์์ ์ฌ๋ฌ ๊ฐ์ RUN
๋ช
๋ น์ด๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
ํ์ง๋ง, CMD
๋ ๋ฑ ํ๋ฒ ์คํ์ ํ ์ ์์ผ๋ฉฐ, ์ด ๋ง์ ๋ docker run
์ธ์๋ก ์ธํด ๋ฎ์ฌ์์์ง๊ฒ ๋ฉ๋๋ค.
- ํ๋ฒ๋ง ์คํ๋๋
CMD
๋ช ๋ น๋ฌธ (๋ง์ง๋งCMD
๋ช ๋ น๋ฌธ ์คํ)last
์ถ๋ ฅ!
CMD ["echo", "first"]
CMD ["echo", "last"]
- ๋ ๋ค๋ฅธ ์์๋ก,
hello world!
๋ฅผ ์ถ๋ ฅํ๋ ์ปค๋งจ๋
# test2 image
CMD ["echo", "hello world!"]
hello world!
์ถ๋ ฅ
docker run test2
bye world!
์ถ๋ ฅ
docker run test2 echo bye world!
Expose ๋ช ๋ น์ด
EXPOSE <port>
EXPOSE <port>/<protocol>
EXPOSE
๋ช
๋ น์ด๋ ํธ์คํธ๊ฐ ์ปจํ
์ด๋๋ก ์ ์ํ๊ธฐ ์ํ ํฌํธ๋ฅผ ์ง์ ํด์ค ์ ์์ต๋๋ค. ํฌํธ๋ง ์ ์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก TCP๊ฐ ์ ์ฉ์ด ๋ฉ๋๋ค.
์ฃผ์ํ ์ !
EXPOSE
๋ช ๋ น์ด๋ ํธ์คํธ์ ์ฐ๊ฒฐ๋ง ํ ๋ฟ ์ธ๋ถ๋ก ๋ ธ์ถ๋์ง ์์ต๋๋ค. ์ธ๋ถ๋ ํธ์คํธ๋ ์ง์ ๋ ํฌํธ๋ก ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ธ๋ถ๋ก ๋ ธ์ถ์ํค๊ธฐ ์ํด์docker run -p 8080:8080
์ฒ๋ผ ํฌํธํฌ์๋ฉ์ ํด์ค์ผ๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
- 8080/TCP ์ฐ๊ฒฐ
EXPOSE 8080
- 8082/UDP ์ฐ๊ฒฐ
EXPOSE 8082/UDP
COPY / ADD ๋ช ๋ น์ด
COPY <๋ณต์ฌํ ํ์ผ>... <๋ณต์ฌํ ํ์ผ์ ์ด๋ฏธ์ง์ ๋ณต์ฌํ ๊ณณ>
COPY ["<ํ์ผ>", ... "<๋ณต์ฌํ ๊ณณ>"]
COPY
๋ช
๋ น์ด๋ ํธ์คํธ ์ปดํจํฐ์ ์๋ ๋๋ ํ ๋ฆฌ๋ ํ์ผ์ Docker ์ด๋ฏธ์ง์ ํ์ผ์์คํ
์ผ๋ก ๋ณต์ฌํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค. ์ ๋๊ฒฝ๋ก์ ์๋๊ฒฝ๋ก ๋๋ค ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ๋์๋ ํ์ฌ WORKDIR
๊ฐ ์ด๋์ธ์ง ์ฒดํฌ๋ฅผ ํด์ผํฉ๋๋ค.
hello.java
ํ์ผ์ ๋ณต์ฌ
COPY hello.java hello.java
- ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ํ์ผ์ ์ปจํ
์ด๋์
app/
๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌ
WORKDIR app/
COPY . .
ADD
๋ช
๋ น๋ฌธ์ COPY
๋ช
๋ น์ด์ ๋ค๋ฅด๊ฒ ์ผ๋ฐ ํ์ผ ๋ฟ๋ง ์๋๋ผ ์์ถ ํ์ผ์ด๋ ๋คํธ์ํฌ ์์ ํ์ผ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํน์ํ ํ์ผ์ ๋ค๋ฃจ๋๊ฒ ์๋๋ผ๋ฉด COPY
๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ข์ต๋๋ค.
ENV / ARG ๋ช ๋ น์ด
ENV
ENV <KEY> <VALUE>
ENV <KEY>=<VALUE>
ENV
๋ช
๋ น์ด๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ENV
๋ช
๋ น์ด๋ ARG
๋ช
๋ น์ด์ ๋ค๋ฅด๊ฒ ์ปจํ
์ด๋ ๋ด๋ถ์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
SERVER_PORT
๋ฅผ ๊ธฐ๋ณธ๊ฐ 8080์ผ๋ก ์ค์
ENV SERVER_PORT 8080
- ํ๊ฒฝ๋ณ์
SERVER_PORT
๋ฅผ 9090์ผ๋ก ์ค์
$ docker run -e SERVER_PORT=9090 ....
ARG
ARG <KEY>
ARG <KEY>=<default>
ARG
๋ช
๋ น์ด๋ ENV
๋ช
๋ ์ด์ ๋ค๋ฅด๊ฒ ์ด๋ฏธ์ง ๋น๋์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋น๋ ์
ARG
์ค์
$ docker build --build-arg SERVER_PORT=1234 ...
CMD
์ ํจ๊ป ์ฌ์ฉ์ ์๋์ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
ARG SERVER_PORT=8080
CMD java -jar -Dserver.port=${SERVER_PORT} hello.jar
REFERENCE
์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค - YES24
Dockerfile์์ ์์ฃผ ์ฐ์ด๋ ๋ช
๋ น์ด | Engineering Blog by Dale Seo
๋์ปค (Docker) - ํ๊ฒฝ๋ณ์(ENV) ์ ๋ฌํ๊ธฐ : ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
docker ํท๊ฐ๋ฆฌ๋ Dockerfile ๋ช
๋ น์ด · Issue #90 · heowc/programming-study · GitHub
Docker Dockerfile ํ๊ฒฝ๋ณ์ ์ค์ (ENV)