[Docker๐Ÿณ] Dockerfile

Jeong SeongYunยท2022๋…„ 10์›” 8์ผ
0

Docker

๋ชฉ๋ก ๋ณด๊ธฐ
6/10
post-thumbnail

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“ค์–ด ๋†“์€ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์ผ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์•ผ ๋‚˜์ค‘์— ์‹ค๋ฌด์—๋„ ์จ๋จน๊ฒ ์ฃ ? ๐Ÿ˜

Docker์˜ ์ด๋ฏธ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ dockerfile์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ๊ผญ ํ•„์š”ํ•˜๋‹ˆ, ์ต์ˆ™ํ•ด์ ธ๋ด…์‹œ๋‹ค!


โ— Dockerfile์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ๋ฐ ๋ช…๋ น์–ด

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช…๋ น๊ณผ ์ธ์ž๋กœ ๊ตฌ์„ฑ
  • ๋ช…๋ น์€ ๋Œ€๋ฌธ์ž๋กœ ์ธ์ž๋Š” ์†Œ๋ฌธ์ž๋กœ ์ž‘์„ฑํ•จ
  • ์ฃผ์„์€ python๊ณผ ๋™์ผํ•˜๊ฒŒ #
  • AWS๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ณดํ†ต vi ์‚ฌ์šฉ
  • vi Dockerfile๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๊ฒฝ๋กœ์— Dockerfile ์ž‘์„ฑ ๊ฐ€๋Šฅ

FROM

๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์ง€์ • ๋ช…๋ น์–ด
ํ•ญ์ƒ ๋งจ ์ฒ˜์Œ์— ์ž‘์„ฑ๋˜๋Š” ๋ช…๋ น์–ด

์ž‘์„ฑ ์˜ˆ์‹œ

FROM alpine:ํƒœ๊ทธ

โ— docker build

  • Docker ์ด๋ฏธ์ง€๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋Š” docker ๋ช…๋ น์–ด (Dockerfile ์‚ฌ์šฉํ•จ)
  • docker build {์˜ต์…˜} {๋„์ปคํŒŒ์ผ ๊ฒฝ๋กœ}
  • default๋กœ๋Š” Dockerfile ์ด๋ผ๋Š” ์ด๋ฆ„์„ ์ฐพ๋Š”๋‹ค.
  • -tag : ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„ ์ง€์ • ๊ฐ€๋Šฅ (์ด๋ฆ„ ์˜†์— :Tag๋„ ์ง€์ • ๊ฐ€๋Šฅํ•˜๋‹ค)
  • -f : default๋กœ ์ง€์ •๋œ Dockerfile ์ด๋ฆ„ ์™ธ์— ๋‹ค๋ฅธ Dockerfile์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ (๊ฒฝ๋กœ๋Š” ์•Œ๋ ค์ค˜์•ผํ•จ)
  • --pull : ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‚ด๋ถ€์˜ ๊ด€๋ จ๋œ ์ด๋ฏธ์ง€๋“ค์„ ์ƒˆ๋กœ ๋‹ค์šด ๋ฐ›์„์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜ true๋กœ ๋‘๋ฉด ๋ชจ๋‘ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๋‹ค์šด ๋ฐ›์Œ.[์‚ฌ์šฉ ์˜ˆ์‹œ : --pull=true]

LABEL

๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ

์ž‘์„ฑ ์˜ˆ์‹œ

LABEL maintainer = "It's me!!"
LABEL version = "1.0.0"
LABEL description = "Description of Image"

docker inspect

์ด๋ฏธ์ง€๋‚˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด

COPY

ํŠน์ • ํด๋”์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฅธ ํด๋”๋กœ ๋ณต์‚ฌํ•˜๋Š” ๋ช…๋ น์–ด
์ถ”๊ฐ€์ ์ธ ํด๋”๋ฅผ ๋„ฃ์€ ์ƒํƒœ์˜ Conatainer๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

์ž‘์„ฑ ์˜ˆ์‹œ

COPY ./2021_DEV /usr/local/apache2/htdocs

โ— CMD

docker์— CMD๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ช…๋ น์–ด
๋ชจ๋“  Docker๋Š” ์‹คํ–‰๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๊ฐ€ ์žˆ๋‹ค. ๊ทธ ๋ช…๋ น์–ด๊ฐ€ ๋ฐ”๋กœ CMD!! ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ Dockerfile์— ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด๋„ ๋งˆ์ง€๋ง‰ ํ•˜๋‚˜๋งŒ ์‹คํ–‰๋จ.

-c : ์ดํ›„์— ์˜ค๋Š” ๋ช…๋ น์–ด๋“ค์„ ์ธ์ž๋กœ ๋ฐ›์Œ

๋‚ด๋ถ€ ์ด๋ฏธ์ง€์˜ CMD ๋ณด๋‹ค ์šฐ์„ ํ•˜์—ฌ CMD๋ฅผ dockerfile์— ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ ์ž‘์„ฑํ•œ CMD๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ž‘์„ฑ ์˜ˆ์‹œ

1. CMD ["/bin/sh", "-c", "echo", "Hello"] ## ๋ชจ๋‘ ""๋กœ ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค. '' ์•ˆ๋จ.
2. CMD /bin/sh -c echo Hello

โž• CMD ๋ช…๋ น ๋ฎ์–ด์”Œ์šฐ๊ธฐ!
vim์œผ๋กœ CMD๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ๊ท€์ฐฎ๋‹ค๋ฉด? docker run์„ ํ•  ๋•Œ ์ด๋ฏธ์ง€ ๊ด€๋ จ ๋ช…๋ น์–ด๋ฅผ ๋ชจ๋‘ ์ž…๋ ฅํ•œ ๋’ค์— ๋ฎ์–ด ์”Œ์šธ CMD๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๋‹น CMD๋กœ ์‹คํ–‰ํ•ด์ค€๋‹ค!!
docker run -dit -p 9999:80 --name httpdweb2 myweb2 /bin/sh -c httpd-foreground
์œ„ ์ฝ”๋“œ์˜ /bin~~~ ๋ถ€ํ„ฐ ๋ฎ์–ด ์”Œ์šธ CMD๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž˜ ๋ฐ”๋€ ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅ!

CMD๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•˜๋ฉด
vim์œผ๋กœ ์ง์ ‘ Dockerfile์„ํŽธ์ง‘ํ•˜๋“ ์ง€ docker run์œผ๋กœ ์ž‘์„ฑํ•˜๋“ ์ง€๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค!


โž• ๋ช…๋ น์–ด์™€ ์ธ์ž์˜ ๊ด€๊ณ„
๋ช…๋ น์–ด์™€ ์ธ์ž์˜ ๊ด€๊ณ„๋ฅผ ์•Œ๊ธฐ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ echo๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ

echo : python์˜ print์™€ ๊ฐ™์€ ์—ญํ• 

๋งŒ์•ฝ main ๋ช…๋ น์–ด echo์— ์ธ์ž๋กœ Hello๊ฐ€ ๋ถ™๋Š” ๊ฒƒ์„ CMD๋กœ ํ‘œํ˜„ํ•˜๋ฉด

CMD ["/bin/echo", "Hello"] ์ด๋ผ๊ณ  ์ ์–ด๋‘๋ฉด docker run์„ ํ†ตํ•ด container๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ž๋™์œผ๋กœ Hello๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

python์œผ๋กœ ๋น„์œ ํ•˜๋ฉด ํ•จ์ˆ˜์˜ parameter์™€ ๋น„์Šทํ•œ ์—ญํ• ์ด๋ผ๊ณ  ์ดํ•ดํ•ด๋„ ๋  ๊ฒƒ๊ฐ™๋‹ค.



docker logs

Docker์˜ Container๊ฐ€ ๊ธฐ๋กํ•œ logs๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์—๋Ÿฌ๋‚˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์›๋ž˜๋Š” log ํŒŒ์ผ์— ๊ธฐ๋ก๋œ ๋‚ด์šฉ๋“ค ์ž…๋‹ˆ๋‹ค.
docker logs {Container ์ด๋ฆ„}

docker kill

๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฆ‰์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
stop๋ณด๋‹ค ์ข€ ๋” ๋น ๋ฅด๊ฒŒ ์ค‘์ง€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
docker kill {Container ์ด๋ฆ„}

โ— ENTRYPOINT

๋ฎ์—ฌ์”Œ์›Œ์ง€๋ฉด ์•ˆ ๋˜๋Š” CMD ๋ช…๋ น์„ ๊ธฐ์ž…ํ•ด์•ผํ•  ๋•Œ ์‚ฌ์šฉ
Dockerfile์˜ CMD๋‚˜ docker run์˜ CMD ๋ณด๋‹ค ์šฐ์„ ๋˜์–ด Dockerfile์˜ CMD์™€ docker run์˜ CMD๋Š” ENTRYPOINT ๋ช…๋ น์–ด์˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ๋จ

์ž‘์„ฑ ์˜ˆ์‹œ

ENTRYPOINT ["/bin/sh"]

์œ„์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด Container ์ƒ์„ฑ์‹œ, ๊ทธ ์–ด๋–ค CMD๋ณด๋‹ค ๊ฐ€์žฅ ์šฐ์„ ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ

docker run์ด๋‚˜ Dockerfile์— ์ž‘์„ฑํ•œ CMD๋Š” ENTRYPOINT์˜ ์ธ์ž๋กœ์„œ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

RUN

ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋Š” ๋˜ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋“ค๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
Dockerfile์„ ์ด๋ฏธ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ด๋ฏธ์ง€ Layer์— ์ƒˆ๋กœ์šด Layer๋ฅผ ์Œ“๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ

apt-get install apt-utils : ์ด๋ฏธ ์„ค์น˜๋œ Layer ์ด๋ฏธ์ง€๋ฅผ ๋˜ ์„ค์น˜ํ•˜์ง€ ๋ง๊ณ  ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋” ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ Dockerfile์—์„œ ubuntu๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์œผ๋กœ apache2๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋” ๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ RUN์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

EXPOSE

์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ํฌํŠธ๋ฅผ ์™ธ๋ถ€์— ์˜คํ”ˆํ•˜๋Š” ์„ค์ •
docker run -p xxxx:yy๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์€ "๋ณธ์ธ์˜ ํŠน์ • ํฌํŠธ"๋ฅผ ์˜คํ”ˆํ•˜๋Š” ๊ฒƒ
์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€์˜ ํŒŒ์ผ์„ ๋ณด๊ฒŒํ•˜๊ณ  ์‹ถ์„ ๋•Œ : docker run -p
๋‚ด๋ถ€ ์ด๋ฏธ์ง€๋“ค ๋ผ๋ฆฌ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ : EXPOSE


์ด๋Ÿฐ ์‹์œผ๋กœ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋ฅผ "์—ด์–ด ๋‘๊ฒ ๋‹ค!"๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker build๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  docker inspect๋ฅผ ํ†ตํ•ด config๋ฅผ ํ™•์ธํ•˜์‹œ๋ฉด ExposedPorts ํ•ญ๋ชฉ์— 80๋ฒˆ ํฌํŠธ๊ฐ€ ์ž˜ ์—ด๋ ค์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โž•
docker run -p๊ฐ€ ์•„๋‹ˆ๋ผ docker run -P ์ฒ˜๋Ÿผ p๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์ž…๋ ฅํ•˜๋ฉด EXPOSE๋กœ ์—ด๋ ค์žˆ๋Š” ํฌํŠธ๋กœ Randomํ•œ ํฌํŠธ๋ฅผ ํ†ตํ•ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์›๋ž˜๋Š” -p 9999:80์ด๋Ÿฐ ์‹์œผ๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ์ง€๋งŒ -P๋กœ ํ•˜๋ฉด 123123:EXPOSE๋œ ํฌํŠธ๋กœ ์•Œ์•„์„œ ๊ฐ€์ค๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์ด ์„ค์ •๋„ AWS ๋”ฐ๋กœ ๋‹ค ์—ด์–ด์ค˜์•ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ENV

์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ
ํ™˜๊ฒฝ ๋ณ€์ˆ˜ : ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜
x๋ผ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด, ๊ทธ ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

์ž‘์„ฑ ์˜ˆ์‹œ

ENV MYSQL_ROOT_PASSWORD=thisismypassword
ENV MYSQL_DATABASE=thisisdbname
ENV PATH /usr/bin:$PATH

์ดํ›„ mysql Container์— ์ ‘์†ํ•ด์„œ ํ™•์ธํ•ด๋ณด๋ฉด ์•„๊นŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ด๋‘” DB์˜ ์ด๋ฆ„์ด ์ž˜ ๋‚˜์™€์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!!

โž•
Dockerfile ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋  ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„ 
ARG ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ARG env=dev

WORKDIR

RUN, CMD, ENTRYPONT์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋“ค์ด ์‹คํ–‰๋  ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ
ํ•ด๋‹น ๋ช…๋ น์–ด๋“ค์€ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋กœ์„œ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ ๋ช…๋ น์ด ์‹คํ–‰๋  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•จ!

์‚ฌ์šฉ์˜ˆ์‹œ

WORKDIR /usr/local/apache2/htdocs

์ด์ œ Docker๋ฅผ ์‚ฌ์šฉํ•˜์‹ค ๊ธฐ๋ณธ ์ค€๋น„๊ฐ€ ๋‹ค ๋˜์…จ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ณธ๊ฒฉ์ ์ธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์ตํžˆ์…จ์œผ๋‹ˆ ์–ด๋–ค ํˆด์„ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ์ง€ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค!

profile
๋ฌผ์–ด๋ณด๋ฉด ๋Œ€๋‹ตํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์Ÿ์ด

0๊ฐœ์˜ ๋Œ“๊ธ€