๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- linux, aws, docker, k8s

[Docker] Dockerfile ์€ ๋ฌด์—‡์ผ๊นŒ? (2) - Dockering ์‹ค์Šต (๋ฆฌ์•กํŠธ์™€ nginx๋ฅผ ๋„์ปค๋ผ์ด์ง• ํ•˜๊ธฐ)

by Wonit 2020. 12. 1.
ํ•ด๋‹น ๊ธ€์€ 2๋ถ€์ž‘์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ๋…์ด ์žˆ์œผ๋ฏ€๋กœ ํ•œ ๋ฒˆ ๊ฐ€๋ณ๊ฒŒ ์ฝ์–ด๋ณด์‹œ๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)


์ง€๋‚œ ์‹œ๊ฐ„์— ์šฐ๋ฆฌ๋Š” ๋„์ปค ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๊ณ , ์–ด๋–ค ๋ช…๋ น์–ด๋“ค์ด ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค.

 

์ž ์‹œ ๋น ๋ฅด๊ฒŒ ์ง€๋‚œ ์‹œ๊ฐ„์˜ ๋‚ด์šฉ์„ ๋ณต์Šตํ•ด๋ณด์ž.

Recap

Dockerfile

๋„์ปคํŒŒ์ผ์ด๋ž€? ํ•˜๋‚˜์˜ ์™„์„ฑ๋œ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์žˆ์–ด์•ผํ•  ํŒจํ‚ค์ง€, ์†Œ์Šค์ฝ”๋“œ, ์Šคํฌ๋ฆฝํŠธ๋“ค์„ ํ•˜๋‚˜์˜ FILE๋กœ ๊ธฐ๋กํ•˜์—ฌ ๋„์ปค๊ฐ€ ์ฝ๊ณ  ์ด๋ฅผ ์‹คํ–‰ํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ๋ช…๋ นํŒŒ์ผ.

 

์ด๋ผ๊ณ  ํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ด ๊ณผ์ •์„ BUILD ๊ณผ์ •์ด๋ผ๊ณ  ํ•˜๊ณ  ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ ๋ฐ”๋กœ ๋นŒ๋“œ ๋ช…๋ น์–ด์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์ด ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ๋„์ปค ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ ๋ฐฐ์› ๋‹ค.

  • FROM
  • MAINTAINER
  • RUN
  • ADD
  • WORKDIR
  • EXPOSE
  • CMD

๊ทธ๋ฆฌ๊ณ  ์ด ๋ช…๋ น์–ด๋“ค์„ ์งง๊ฒŒ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด

 

FROM

Base Image๋ฅผ ์ง€์ •ํ•จ

 

MAINTAINER

์ž‘์„ฑ์ž ํ˜น์€ ๊ฐœ๋ฐœ์ž๋ฅผ ๋„ฃ๋Š” ๋ถ€๋ถ„, ์ƒ๋žตํ•ด๋„ ๋ฌด๋ฐฉ

 

RUN

์ด๋ฏธ์ง€ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด

 

ADD

Host PC ์—์„œ File์ด๋‚˜ Directory์„ Docker Image๋กœ Copyํ•  ๋•Œ ์‚ฌ์šฉ

 

WORKDIR

์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ

 

EXPOSE

ํฌํŠธ ๊ฐœ๋ฐฉ, ํฌํŠธ ํฌ์›Œ๋”ฉ

 

CMD

๋„์ปค ์ปจ์—ํ‹ฐ๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ

 


 

Dockerizing

๋„์ปค๋ผ์ด์ง•์€ ์˜ค๋Š˜ ์‹ค์Šต์˜ ํ•ต์‹ฌ์ด๋‹ค.


์ง€๋‚œ ์‹œ๊ฐ„์— ๋„์ปค๋ผ์ด์ง•์— ๋Œ€ํ•ด์„œ ๋„์ปคํ™” ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ์˜ค๋Š˜์€ ์‹ค์Šต์„ ํ†ตํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

๋„์ปค๋ผ์ด์ง•

๋„์ปค๋ผ์ด์ง•์€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค Application์„ ๋„์ปค ์ด๋ฏธ์ง€ํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Application์˜ ์†Œ์Šค์ฝ”๋“œ, ์Šคํฌ๋ฆฝํŠธ, ํŒจํ‚ค์ง€๋“ค์„ ์ค€๋น„ํ•˜๊ณ  ๋„์ปค ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น  ๊ฒƒ์ด๋‹ค.

 

์ด ๊ณผ์ •์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™˜๊ฒฝ์„ ํ†ตํ•ด ๊ตฌ์„ฑํ•  ๊ฒƒ์ด๋‹ค.

  • Application : Create-React-App ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
  • Package : npm module
  • Web Server : Nginx

์‹ค์Šต์— ๋Œ€ํ•ด

์šฐ์„  ์‹ค์Šต์„ ์ „๋ฐ˜์ ์œผ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

์ค€๋น„๋ฌผ

  • Creact-React-App ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฆฌ์•กํŠธ ์•ฑ
  • Dockerfile
  • nginx.conf

Creact-React-App ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฆฌ์•กํŠธ

์ผ๋‹จ Create-React-App์œผ๋กœ ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ค€๋น„ํ•œ๋‹ค.


๋งŒ์•ฝ CRA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด Create-React-App์œผ๋กœ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด๋ณด์ž.๊ธ€์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ์ถ”์ฒœํ•œ๋‹ค.

Dockerfile

์ด๋ฒˆ ์‹ค์Šต์˜ ๊ฝƒ์ธ ๋„์ปคํŒŒ์ผ์ด๋‹ค.


ํ•ด๋‹น ํŒŒ์ผ์—์„œ ๋„์ปค ์—”์ง„์—๊ฒŒ ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ ํ•ด์„์‹œํ‚ค๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ™˜๊ฒฝ์œผ๋กœ ์„ธํŒ…ํ•ด๋‹ฌ๋ผ๊ณ  ๋ช…๋ นํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์ด๋‹ค.

nginx.conf

Dockerfile์—์„œ Base Image๋ฅผ Nginx๋กœ ์ง€์ •ํ•˜๋Š”๋ฐ, Default์˜ Nginx ์„ค์ • ํŒŒ์ผ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ nginx.conf ํŒŒ์ผ๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•  ํƒ€๊ฒŸ ํŒŒ์ผ์„ ๋ฏธ๋ฆฌ ํ˜ธ์ŠคํŠธ์—์„œ ๊ตฌ์ถ•ํ•ด๋†“๋Š”๋‹ค.

๊ณผ์ •

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

 

  1. CRA์•ฑ์˜ ๋ฃจํŠธ ํด๋”์—์„œ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  2. nginx.conf ํŒŒ์ผ์„ ์ •์˜ํ•œ๋‹ค.
  3. Dockerfile ์— ๋นŒ๋“œ ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  4. docker image๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.
  5. docker image๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

CRA ์˜ ๋นŒ๋“œ

์šฐ์„  ์•„๋ฌด CRA๋ฅผ ์ค€๋น„ํ•œ๋‹ค.


ํ•„์ž๋Š” ๋งˆ์นจ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค ์„œ๋น„์Šค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

ํ•ด๋‹น CRA ๋””๋ ‰ํ† ๋ฆฌ์˜ src์™€ ๊ฐ™์€ level์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

 

Dockerfile

nginx.conf

๊ทธ๋ฆฌ๊ณ  npm์„ ์ด์šฉํ•ด์„œ ๋นŒ๋“œ๋ฅผ ํ•œ๋‹ค.

 

$ npm run build

๊ทธ๋Ÿผ build ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค Nginx ๋„์ปค์— ๋ณต์‚ฌํ•  ์˜ˆ์ •์ด๋‹ค.

 

nginx.conf ํŒŒ์ผ ์ •์˜

์œ„์—์„œ ์ƒ์„ฑํ•œ nginx.conf ํŒŒ์ผ์—์„œ nginx์˜ ๊ธฐ๋ณธ ๋ผ์šฐํŒ…์„ ์„ค์ •ํ•ด์ฃผ์ž.


์—ฌ๊ธฐ์„œ ์„ค์ •ํ•  ๋‚ด์šฉ์€ ์ž‘์—… ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์™€ index html ํŒŒ์ผ์ด๋‹ค.

server {
    listen 80;
    location / {
        root    /app/build;
        index   index.html;
        try_files $uri $uri/ /index.html;
    }
}

Dockerfile ์ •์˜

์ด์ œ ๋„์ปค ํŒŒ์ผ์„ ์ •์˜ํ•  ์ฐจ๋ก€์ด๋‹ค.

FROM nginx

# root ์— app ํด๋”๋ฅผ ์ƒ์„ฑ
RUN mkdir /app

# work dir ๊ณ ์ •
WORKDIR /app

# work dir ์— build ํด๋” ์ƒ์„ฑ /app/build
RUN mkdir ./build

# host pc์˜ ํ˜„์žฌ๊ฒฝ๋กœ์˜ build ํด๋”๋ฅผ workdir ์˜ build ํด๋”๋กœ ๋ณต์‚ฌ
ADD ./build ./build

# host pc ์˜ nginx.conf ๋ฅผ ์•„๋ž˜ ๊ฒฝ๋กœ์— ๋ณต์‚ฌ
COPY ./nginx.conf /etc/nginx/conf.d

# 80 ํฌํŠธ ์˜คํ”ˆ
EXPOSE 80

# container ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•  command. nginx ์‹œ์ž‘ํ•จ
CMD ["nginx", "-g", "daemon off;"]

์ฐจ๋ก€๋Œ€๋กœ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด.

  • FROM
    • ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€๋กœ Nginx ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด๋ผ.
  • RUN mkdir /app
    • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด app์ด๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ผ.
  • WORKDIR /app
    • cd /app
  • RUN mkdir ./build
    • ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ (/app) ์—์„œ build ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด mkdir ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ผ
  • ADD ./build ./build
    • ํ˜ธ์ŠคํŠธ PC์— ์žˆ๋Š” /build ํด๋”๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ /build ํด๋”๋กœ ๋ณต์‚ฌํ•ด๋ผ
  • COPY ./nginx.conf /etc/nginx/conf.d
    • ํ˜ธ์ŠคํŠธ์— ์žˆ๋Š” nginx.conf ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ /etc/nginx/conf.d ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌํ•ด๋ผ.
  • EXPOSE 80
    • ์ปจํ…Œ์ด๋„ˆ์˜ 80 ํฌํŠธ๋ฅผ ์—ด์–ด๋ผ
  • CMD ["nginx", "-g", "daemon off;"]
    • ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•  nginx์˜ ์ปค๋งจ๋“œ.

์˜ ๊ณผ์ •์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

 

docker Image ๋นŒ๋“œ

๊ทธ๋Ÿผ ์ด์ œ ์ค€๋น„๊ฐ€ ๋‹ค ๋˜์—ˆ์œผ๋‹ˆ build ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž

.

docker build -t my-react-app

docker image ์‹คํ–‰

๊ทธ๋ฆฌ๊ณ  ๋„์ปค๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋!

 

docker run -d -p 8300:80 my-react-app

๊ทธ๋Ÿผ ํ•ด์‹œ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ , ๋„์ปค ํ”„๋กœ์„ธ์Šค ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•ด๋ณด๋ฉด,

 

์ •์ƒ์ ์œผ๋กœ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

(ํ•„์ž๋Š” ๋„์ปคํ—ˆ๋ธŒ๋กœ EC2 ์ธ์Šคํ„ด์Šค์— ๋ฐฐํฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด ๋‹ค๋ฅด๋‹ค.)


์˜ค๋Š˜์€ ์ด๋ ‡๊ฒŒ Dockerfile์„ ์‹ค์ œ๋กœ ์ž‘์„ฑํ•ด๋ณด๊ณ  ์–ด๋–ค์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์•˜๋‹ค.

 

๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” ๋„์ปค์˜ ๋นŒ๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

๋Œ“๊ธ€