๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/DevOps

Docker์™€ Nginx๋ฅผ ํ™œ์šฉํ•ด react ํ”„๋กœ์ ํŠธ ec2์— ๋ฐฐํฌ ๋ฐ jenkins๋ฅผ ํ™œ์šฉํ•œ CI/CD ๊ตฌ์ถ• + docker compose ํ™œ์šฉ - 2(docker ๋ฐ nginx ์„ค์ •)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 3. 17.

docker ๋ฐ nginx ์ž‘์—… ๊ณผ์ • ๋ฐ ์„ค๋ช…

docker, docker-compose, nginx, jenkins, react, ec2 ๋ฐฐํฌ

1. ๋ฐฐํฌ ํ๋ฆ„ ์š”์•ฝ ๋ฐ q&a
2. ๋ฐฐํฌ ํ”„๋กœ์ ํŠธ docker ๋ฐ nginx ํŒŒ์ผ ์„ค์ •
3. ์  ํ‚จ์Šค์™€ ๊นƒ๋žฉ ์—ฐ๊ฒฐ ๋ฐ ci/cd ์„ค์ •

1. ๋„์ปค ํŒŒ์ผ ์ž‘์„ฑ

ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ ๋””๋ ‰ํ† ๋ฆฌ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด Dockerfile์„ ์ž‘์„ฑํ•ด์ฃผ์ž

# Dockerfile

# ์Šคํ…Œ์ด์ง€ 1
# ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€: ๋…ธ๋“œ (alpine: ๊ฒฝ๋Ÿ‰ ๋ฒ„์ „, builder: stage)
FROM node:18.12.1-alpine as builder

# ์ž‘์—… ๊ฒฝ๋กœ ์„ค์ •
WORKDIR "/app"

# ์˜์กด์„ฑ ์„ค์น˜
COPY package.json yarn.lock ./
RUN yarn install --production=false
# ํ”„๋กœ์ ํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
COPY . .

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
ENV PATH /front-end/node_modules/.bin:$PATH

# ๋นŒ๋“œ
RUN yarn build

# ์Šคํ…Œ์ด์ง€2
# ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€: ์—”์ง„์—‘์Šค(์›น์„œ๋ฒ„)
FROM nginx

# ์ž‘์—…๊ฒฝ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •
RUN mkdir /app
WORKDIR /app

# ๊ธฐ์กด ์—”์ง„์—‘์Šค ์„ค์ •ํŒŒ์ผ ์ง€์šฐ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์„ค์ •ํŒŒ์ผ๋กœ ๋Œ€์ฒด
RUN rm /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/conf.d

# builder ์Šคํ…Œ์ด์ง€ (๋ฐ”๋กœ ์œ„)์˜ ๋นŒ๋“œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜จ๋‹ค(๊ฒฝ๋Ÿ‰ํ™”) 
COPY --from=builder /app/build /app/build

# 3000๋ฒˆ ํฌํŠธ ์—ด์–ด๋‘๊ธฐ
EXPOSE 3000

# nginx๋ฅผ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰
CMD ["nginx", "-g", "daemon off;"]

๋นŒ๋“œ(๋…ธ๋“œ) - ์„œ๋ฒ„ ์—ฐ๊ฒฐ(nginx)์˜ ๋‘ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง• ๋„์ปคํŒŒ์ผ์ด๋‹ค.

๋นŒ๋“œ ๋‹จ๊ณ„

โœ” ๋…ธ๋“œ ๋ฒ„์ „(ํ”„๋กœ์ ํŠธ ๋ฒ„์ „์— ๋งž๋Š” ๋ฒ„์ „)์„ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋กœ ์„ค์ •ํ•œ๋‹ค.

  • -apline์€ ๋ฆฌ๋ˆ…์Šค์—์„œ ์“ฐ๋Š” ๊ฒฝ๋Ÿ‰๋ฒ„์ „
  • as builder๋Š” ํ•ด๋‹น ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€์˜ ์ด๋ฆ„ (์ดํ›„ nginx ์Šคํ…Œ์ด์ง€์— ์ด๋ฆ„์„ ์ ‘๊ทผํ•œ๋‹ค)

โœ” ์—ฐ๊ฒฐ๋œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์™€ ๋นŒ๋“œ๋ฅผ ํ•ด์ค€๋‹ค (๋ณธ ํ”„๋กœ์ ํŠธ๋Š” yarn์„ ์‚ฌ์šฉํ–ˆ๋‹ค. npm์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉด npm ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.)

์„œ๋ฒ„ ๋ฐฐํฌ ๋‹จ๊ณ„

โœ” nginx๋ฅผ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋กœ ์„ค์ •ํ•œ๋‹ค.

โœ” nginx์˜ default ์„ค์ • ํŒŒ์ผ์„ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ nginx ์„ค์ •ํŒŒ์ผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

โœ” builer ์Šคํ…Œ์ด์ง€์— ์ƒ์„ฑํ•œ ๋นŒ๋“œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜จ๋‹ค

โœ” 3000๋ฒˆ ํฌํŠธ๋ฅผ ์—ด์–ด๋‘๊ณ  nginx๋ฅผ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•œ๋‹ค

2. nginx.conf ํŒŒ์ผ ์ž‘์„ฑ

๋„์ปคํŒŒ์ผ ์ค‘๊ฐ„์— ๋ณด๋ฉด nginx ์„ค์ •์„ ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ํ•ด๋‹น ์„ค์ •ํŒŒ์ผ์„ ๊ฐ™์€ ์œ„์น˜ (./nginx.conf)์— ์ž‘์„ฑํ•ด์ฃผ์ž

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

โœ” nginx๋ฅผ ์œ„์—์„œ ์„ค์ •ํ•œ 3000๋ฒˆ ํฌํŠธ์— ๋Œ€ํ•ด์„œ ์—ด์–ด๋‘๊ณ  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๋‚ด์šฉ์˜ ๊ฐ„๋‹จํ•œ ์„ค์ •ํŒŒ์ผ์ด๋‹ค

โœ” ํ•ด๋‹น ํŒŒ์ผ์„ /etc/nginx/conf.d ๊ฒฝ๋กœ์— ๋„ฃ์–ด์ฃผ๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๋ฉ”์ธ ์„ค์ •ํŒŒ์ผ์ธ /etc/nginx/nginx.conf ํŒŒ์ผ์—์„œ ํ•ด๋‹น ๊ฒฝ๋กœ์— ์žˆ๋Š” ๊ฐ ์„œ๋ฒ„์˜ ๊ฐœ๋ณ„ ์„ค์ • ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์ด๋Š” ๋ฐฉ์‹(include)์ด๋‹ค.

โœ” ์ฐธ๊ณ ๋กœ ํ•ด๋‹น nginx๋Š” ์ดํ›„ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๋ฐ ssl์„ ์ ์šฉํ•  ec2 ์„œ๋ฒ„ ์ž์ฒด์˜ nginx๊ฐ€ ์•„๋‹ˆ๋ผ frontend ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ nginx๊ธฐ ๋•Œ๋ฌธ์— ํ—ท๊ฐˆ๋ฆฌ๋ฉด ์•ˆ๋œ๋‹ค!

3. docker-compose.yml ์ž‘์„ฑ (์„ ํƒ)

๊ฐ™์€ ์œ„์น˜์— docker-compose.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์ฃผ์ž

์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์€ ์œ„์—๋„ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์„ ํƒ์‚ฌํ•ญ์ด๋ผ ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ๊ตณ์ด ๋ฉ€ํ‹ฐ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.

version: "3.7"

services:
  frontend:
    container_name: frontend
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - "3000:3000"
    restart: always

โœ” ์‹ฑ๊ธ€ ์ปจํ…Œ์ด๋„ˆ๋ผ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„๊ณผ ๋„์ปคํŒŒ์ผ ์œ„์น˜, ํฌํŠธ ๋ฒˆํ˜ธ๋งŒ ์ ์€ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ์ด๋‹ค

โœ” ์ด๋ ‡๊ฒŒ ์ ์€ docker-compose.yml ํŒŒ์ผ์ด ๋„์ปค์— ๋Œ€ํ•œ ์‹คํ–‰ํŒŒ์ผ ์—ญํ• ์„ ํ•˜๊ฒŒ ๋ผ ์ดํ›„ jenkins์˜ ์‰˜์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งค์šฐ ๋‹จ์ˆœํ•ด์ง„๋‹ค.


์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์—์„œ ๋„์ปค ๋ฐ nginx ์„ค์ • ํŒŒ์ผ์„ ์ ๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ด์ œ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๊ฐ€ ์—…๋กœ๋“œ๋œ gitlab ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ jenkins์™€ ์—ฐ๊ฒฐํ•ด CI/CD๋ฅผ ๊ตฌ์ถ•ํ•ด๋ณด๊ฒ ๋‹ค.

๋Œ“๊ธ€