[๐ŸณDocker] ๋„์ปคํ™˜๊ฒฝ์—์„œ ๋ฆฌ์•กํŠธ ๋ฐฐํฌํ•ด๋ณด๊ธฐ

Kimseongeunยท2022๋…„ 5์›” 31์ผ

docker

๋ชฉ๋ก ๋ณด๊ธฐ
2/5
post-thumbnail

๊ฐ„๋‹จํ•œ ์–ดํ”Œ์„ ์‹ค์ œ๋กœ ๋ฐฐํฌํ•ด๋ณด๊ธฐ (๊ฐœ๋ฐœ๋ถ€๋ถ„)

  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๋ฐฐํฌ ๊ณผ์ •

  • ๋ฆฌ์•กํŠธ ์„ค์น˜ ๋ฐฉ๋ฒ•
    • npx create-react-app <๋ฆฌ์•กํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ ์ž ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„>
  • ๋ฆฌ์•กํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ๋•Œ์—๋Š” ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
    • ๊ฐœ๋ฐœ ๋‹จ๊ณ„ : npm run start
    • ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„ : npm run test
    • ๋นŒ๋“œ ๋‹จ๊ณ„ : npm run build

โ†’ ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํ•˜๋ฉด ๋ฐฐํฌ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” build ํด๋”์™€ ๊ทธ ์•ˆ์— ๋งŽ์€ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋œ๋‹ค.

๋„์ปค๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ๋‹จ๊ณ„์—์„œ ๋ฆฌ์•กํŠธ ์‹คํ–‰ํ•˜๊ธฐ

  • ๋„์ปค๋กœ ์–ดํ”Œ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ

Dockerfile.dev

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ๋„์ปค ํŒŒ์ผ ์ž‘์„ฑ์€ ํ˜„์žฌ๊นŒ์ง€ ๋„์ปค ํŒŒ์ผ ์ž‘์„ฑํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์ด ํ•ด์ฃผ๋ฉด ๋œ๋‹ค

  • dockerfile.dev๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.
    FROM node:alpine
    
    WORKDIR /usr/src/app
    
    COPY package.json ./
    
    RUN npm install --
    
    COPY ./ ./
    
    CMD ["npm", "run", " start"]

์ด๋ ‡๊ฒŒ ์ž‘์„ฑ ํ›„์— ๋นŒ๋“œ๋ฅผ ์‹œ์ผœ๋ณด๋ฉด ๋œ๋‹ค.

๋นŒ๋“œ๋ฅผ ํ•ด๋ณด๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋งŒ ์ •ํ•ด์ฃผ๋ฉด dockerfile์„ ์ž๋™์œผ๋กœ ์ฐพ์•„์„œ ๋นŒ๋“œํ•˜๋Š”๋ฐ ํ˜„์žฌ๋Š” dockerfile์ด ์—†๊ณ  dockerfile.dev๋ฐ–์— ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋™์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋„์ปค ํŒŒ์ผ์„ ์ฐพ์ง€ ๋ชปํ•ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•ด๊ฒฐ์ฑ…

์ž„์˜๋กœ build ํ•  ๋•Œ ์–ด๋–ค ํŒŒ์ผ์„ ์ฐธ์กฐํ•  ๊ฒƒ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์กฐ๊ฑด์„์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

๋ช…๋ น์–ด๋กœ docker build -f[Dockerfile.dev](http://Dockerfile.dev)./ ์ด๋ ‡๊ฒŒ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด๋œ๋‹ค.

์ฆ‰, ์ด๋Ÿฐ์‹์œผ๋กœ -f ์˜ต์…˜์„ ์ด์šฉํ•ด์„œ ํ•ด๋ณด๋ฉด ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋ฆฌ์•กํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด ์ค„ ์ด๋ฏธ์ง€ ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ’ก ํ˜„์žฌ ๋กœ์ปฌ ๋จธ์‹ ์— node_modules ํด๋”๊ฐ€ ์žˆ์„ํ…๋ฐ ์ด๊ณณ์—๋Š” ๋ฆฌ์•กํŠธ ์•ฑ์„ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋“ค์ด ๋“ค์–ด์žˆ์ง€๋งŒ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ด๋ฏธ npm install๋กœ ๋ชจ๋“  ๋ชจ๋“ˆ๋“ค์„ ๋„์ปค ์ด๋ฏธ์ง€์— ๋‹ค์šด ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ๋กœ์ปฌ์—์„œ node_modules๋ฅผ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š” ๊ฐ•์ ์ด ์กด์žฌ ๋”ฐ๋ผ์„œ ๋„์ปค ํ™˜๊ฒฝ์—์„œ๋Š” node_modules๋ฅผ ์ง€์›Œ์ค˜๋„ ๋จ!!!

์ƒ์„ฑ๋œ ๋„์ปค ์ด๋ฏธ์ง€๋กœ ๋ฆฌ์•กํŠธ ์‹คํ–‰ํ•˜๊ธฐ

docker run [์ด๋ฏธ์ง€ ์ด๋ฆ„] ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด localhost:3000์—์„œ ์ฐฝ์ด ๋œจ์ง€ ์•Š๋Š”๋‹ค. ์ด์œ ๋Š” ์˜ˆ์ „์— ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด ํฌํŠธ ๋งคํ•‘์„ ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ์•ˆ ํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธ!

๋”ฐ๋ผ์„œ, **docker run -it -p 3000:3000 [์ด๋ฏธ์ง€ ์ด๋ฆ„]**

COPY์™€ VOLUME์˜ ์ฐจ์ด

  • COPY
  • Volume

Volume ์‚ฌ์šฉํ•ด์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ํ•˜๊ธฐ

**docker run -p 3000:3000 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app [์ด๋ฏธ์ง€ ์•„์ด๋””]**

  • ์ž‘๋™๊ณผ์ •
  • ์ด๋ ‡๊ฒŒ ๋ณผ๋ฅจ๊นŒ์ง€ ์„ค์ •ํ–ˆ์œผ๋ฉด ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ๋ฐ”๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ๋ฐ˜์˜์ด ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ํ™•์ธํ•ด๋ด„ใ„ด ๋ธŒ๋ผ์šฐ์ €์— ์ž˜ ๋œจ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์„ ๋•Œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜์ด ๋˜๋Š” ๊ฒƒ๋„ ํ™•์ธํ•˜์˜€๋‹ค.

๋„์ปค ์ปดํฌ์ฆˆ๋กœ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์•ฑ ์‹คํ–‰

์•ž์„œ ์ผ๋˜ ๋ช…๋ น์–ด๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ docker compose๋ฅผ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐํ•œ๋‹ค.

์ผ๋‹จ docker-compose.yml ํŒŒ์ผ๋ถ€ํ„ฐ ์ƒ์„ฑ์‹œํ‚จ๋‹ค.

version: "3"
server:
  react:
    build:
      context: .
      dockerfile : Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - /usr/src/app/node_modules
      - ./:/usr/src/app
    stdin_open: true

์ด๋ ‡๊ฒŒ yaml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€ ํ›„์— **docker-compose up** ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋ฆฌ์•กํŠธ ์•ฑ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

  • ๋ณดํ†ต ๋ฆฌ์•กํŠธ ์•ฑ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ ค npm run test ๋ฅผ ์‚ฌ์šฉํ•˜๊ธดํ•˜๋Š”๋ฐ
  • ๋„์ปค ํ™˜๊ฒฝ์—์„œ๋Š”โ€ฆ.
    • yaml ํŒŒ์ผ์—์„œ ์ถ”๊ฐ€ ์ฝ”๋“œ ์ƒ์„ฑ

      tests:
      	build:
      		context: .
      		dockerfile: Dockerfile.dev
      	volumes:
      	- /usr/src/app/node_modules
      	- ./:/usr/src/app
      	command: ["npm","run","test"]
    • test : ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„

      ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด๋†“๊ณ  ๋ณด๋ฉด ๊ธฐ์กด์— ์žˆ๋˜ ์ปจํ…Œ์ด๋„ˆ์™€ ํ…Œ์ŠคํŠธ๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‘ ๊ฐœ๊ฐ€ ๋‹ค ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

      docker-compose up โ€”build ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์šด์˜ํ™˜๊ฒฝ์„ ์œ„ํ•œ Nginx

  • ํ•„์š”ํ•œ ์ด์œ 
    • ์šฐ์„  ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ ๋ฆฌ์•กํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์„ ๋ณด๋ฉด ์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ ์žˆ๋‹ค.
    • ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š”?
  • ์šด์˜ํ™˜๊ฒฝ๊ณผ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๋”ฐ๋กœ ์จ์•ผํ•˜๋Š” ์ด์œ 
    • ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„๋Š” ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ „์ฒด ์•ฑ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•ด์„œ ๋ณ€๊ฒฝ ์†Œ์Šค๋ฅผ ๋ฐ˜์˜ํ•ด์ฃผ๋Š” ๊ฒƒ๊ฐ™์ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ํŠนํ™”๋œ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋‹ค.
    • ์šด์˜ํ™˜๊ฒฝ์—์„œ๋Š” ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋‹ค์‹œ ๋ฐ˜์˜ํ•ด ์ค„ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ์— ๋” ๊น”๋”ํ•˜๊ณ  ๋น ๋ฅธ Nginx๋ฅผ ์›น์„œ๋ฒ„๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

์šด์˜ํ™˜๊ฒฝ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•œ Dockerfile ์ž‘์„ฑํ•˜๊ธฐ

Nginx๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฆฌ์•กํŠธ ์šด์˜ํ™˜๊ฒฝ ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•ด๋ณด๊ธฐ

๊ทธ ์ „์— ๊ฐœ๋ฐœํ™˜๊ฒฝ๊ณผ ์šด์˜ํ™˜๊ฒฝ์˜ ๋„์ปค ๊ตฌ์กฐ ๋ณด๊ธฐ

  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” build๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š”๋ฐ ์šด์˜ํ™˜๊ฒฝ์—์„œ๋Š” build๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๋ฏ€๋กœ cmd ์— npm run build๋กœ ๋นŒ๋“œ ํŒŒ์ผ๋“ค์„ ์ƒ์„ฑํ•ด์ฃผ๋ฉฐ ๊ทธ ์ดํ›„์— Nginx๋ฅผ ์‹œ์ž‘ํ•ด์ค˜์•ผํ•จ.

Dockerfile

FROM node:alpine as builder
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY ./ ./
RUN npm run build

FROM nginx
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
  • builder๋ฅผ nginx๊ฐ€ ์ œ๊ณตํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ์— ๋ณต์‚ฌ

  • docker ์ด๋ฏธ์ง€ ์ƒ์„ฑ

docker build -t ์ด๋ฏธ์ง€์ด๋ฆ„ .

  • ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด ์•ฑ ์‹คํ–‰

docker run -p 8080:80 ์ด๋ฏธ์ง€ ์ด๋ฆ„ (nginx์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉํฌ๋“œ๊ฐ€ 80)

profile
๊น€์„ฑ์€์ž…๋‹ˆ๋‹ค.

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