ํ์ฌ์์ ๊ฐ๋ฐํ ํด๋ผ์ด์ธํธ๋ฅผ AWS EC2์์ ๋ฐฐํฌํ๋ค๊ฐ ๋ค๋ฅธ ๋ถ๊ป nginx์ WAS๋ฅผ ์ผ๋๋ ํผ๋๋ฐฑ์ ๋ฐ๊ฒ๋๊ณ ..(์ง์ง ๋ฌด์ํด์ ์ฉ๊ฐํ๋ค..) ํผ๋๋ฐฑ์ ์ ์ฉ์ํค๊ธฐ ์ํด ์ง๋ ์ฃผ์
dockerize, pm2 ๋ฑ์ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ๋ค์ด๋ค.
ํนํ ์ด ํฌ์คํธ๋ Dockerfile, docker-compose.yml์ ๋ง๋๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๐จDocker container๋ฅผ ์คํํ๋ฉด ์ง์์ ์ผ๋ก ์คํ๋์ง ์๊ณ exited๋๋ค.
[Docker] container์ run, start ํ์ ๋, ๋ฐ๋ก ๊บผ์ง๋(Exitted) ์ด์
**๊ฐ๋ฐ์๊ฐ ์ฒ์ Docker ์ ํ ๋ ์ค๋ ๋ฉ๋ถ ๋ช๊ฐ์ง**
โ ๊ทผ๋ฐ ๊ทธ๋ฅ ๋ค ํ์์๊ณ .. CMD [โnodeโ, โcontroller.jsโ]๋ฅผ โโ๋ก ์ ์ด์ ๊ทธ๋ฌ๋ค.. โโ์์ ์ ์ด์ฃผ๋ฉด ์๋จ..
๐ฅ๏ธย ์ฌ์ฉํ Docker ๋ช ๋ น์ด ์ ๋ฆฌ
/*
app/backend/Dockerfile
*/
# backendํด๋ ์์ ๋ค์ด์๋ Dockerfile์ buildํด์ ์ด๋ฏธ์ง๋ก ๋ง๋ฌ
docker build -t backend .
# docker imageํ์ผ์ run(create + start)ํ ๊ฑฐ๋ค my_backcontainer๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ง๋ค๊ฒ์ด๋ฉฐ backend๋ผ๋ image๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค
# -d: detached mode (๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ปจํ
์ด๋๋ฅผ ์คํํ๊ณ ์ปจํ
์ด๋ ID๋ฅผ ์ถ๋ ฅ)
# -it: interactive mode with a pseudo-TTY (ํฐ๋ฏธ๋ ์ ์์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ์ต์
)
# -p: port mapping (ํธ์คํธ์ ์ปจํ
์ด๋ ๊ฐ ํฌํธ ๋งคํ)
docker run -d -it -p 8080:4982 --name my_backcontainer backend
# ๋ง๋ค์ด์ง docker container์์ ์ ์ํด์ ""์์ ํฐ๋ฏธ๋ ๋ช
๋ น์ด๋ฅผ ์คํํ ์ ์๊ฒํ๋ค
docker exec -it my_backcontainer "ls"
/*
app/client/Dockerfile
*/
# clientํด๋ ์์ ๋ค์ด์๋ Dockerfile์ buildํด์ ์ด๋ฏธ์ง๋ก ๋ง๋ฌ
docker build -t client .
# docker imageํ์ผ์ run(create + start)ํ ๊ฑฐ๋ค my_clientcontainer๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ง๋ค๊ฒ์ด๋ฉฐ backend๋ผ๋ image๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค
# react app build๋ง ํ๊ธฐ ๋๋ฌธ์ -p ์ต์
์ ์ฌ์ฉํ์ง ์์
docker run -d -it --name my_clientcontainer client
/*
app/nginx/Dockerfile
*/
# nginxํด๋ ์์ ๋ค์ด์๋ Dockerfile์ buildํด์ ์ด๋ฏธ์ง๋ก ๋ง๋ฌ
docker build -t nginx .
# docker imageํ์ผ์ run(create + start)ํ ๊ฑฐ๋ค my_nginxcontainer๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ง๋ค๊ฒ์ด๋ฉฐ backend๋ผ๋ image๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค
docker run -d -it -p 80:80 --name my_nginxcontainer nginx
/*
Docerk Terminal ๋ช
๋ น์ด
*/
# ์คํ ์ค container ํ์ธ
docker ps
# ์คํ ์ค ๋ชจ๋ container ํ์ธ
docker ps -a
# ์ด๋ฏธ์ง ์ ๊ฑฐ
docker rmi -f backend
or
docker rmi ์ด๋ฏธ์ง๋๋ฒ
# ์ปจํ
์ด๋ ์ ๊ฑฐ
docker rm my_backendcontainer
# ์ด๋ฏธ์ง ์ ๊ฑฐ
docker rmi -f backend
# ์คํ์ค ์ปจํ
์ด๋ ์ค์ง
docker stop my_backendcontainer
# docker-compose.ymlํ์ผ ์คํ
docker compose up -d
# docker-compose.ymlํ์ผ ์ค๋จ
docker compose down
๐์ฌ์ฉํ Dockerfile ์ ๋ฆฌ
/*
app/backend/Dockerfile
*/
# nodejs ์ค์น
FROM node:16.17.0-alpine
# ์ด๋ฏธ์ง ์์ ์ดํ๋ฆฌ์ผ์ด์
์ฝ๋๋ฅผ ๋ฃ๊ธฐ ์ํ ๋๋ ํ ๋ฆฌ ์์ฑํ๊ณ ํด๋น ์์น๋ฅผ ์คํฌ๋ฆฝํธ ์คํํ ์ฅ์๋ก ์ค์ ํ๋ค
WORKDIR /usr/backend
# ์ฑ์์กด์ฑ ์ ์ฅ
COPY package*.json ./
# ํ๋ก๋์
์ ์ํ ์ฝ๋๋ฅผ ๋น๋ํ๋ ๊ฒฝ์ฐ ์คํ๋ ๋ช
๋ น์ด (npm ci์ปค๋งจ๋๋ ์์กด์ฑ ํ์ผ์ ์ค์นํด์ค๋ค, omit์ต์
=dev๋ ์์กด์ฑ ์ค ์ ์ธํ ํ์ผ์ ์ค์ ํ๋ค ๊ฐ๋ฐ ์์กด์ฑ์ ์ ์ธํ๋ค.)
# pm2์ต์ ๋ฒ์ ๋ ๊ฐ์ด ์ค์นํด์ค๋ค
RUN npm install
RUN npm install -g pm2@latest
# ์ด๋ฏธ์ง ์์ ์ฑ์ ์์ค์ฝ๋๋ฅผ ๋ฃ๋๋ค
COPY . .
# nodejs ๋ฐํ์ ์คํ์ ์ํด ์คํํ ๋ช
๋ น์ด๋ฅผ ์ ์ด์ค๋ค(WORKDIR ๋๋ ํ ๋ฆฌ์์ ๋ช
๋ น์ด๊ฐ ์คํ๋๋ค), ์คํ ๋ช
๋ น์ด๋ฅผ ์ ๋ ''๋ก ์ ์ผ๋ฉด ์๋๋ค..
CMD ["node", "controller.js"]
/*
app/client/Dockerfile
*/
# nodejs ์ค์น
FROM node:16.17.0-alpine
# ์ด๋ฏธ์ง ์์ ์ดํ๋ฆฌ์ผ์ด์
์ฝ๋๋ฅผ ๋ฃ๊ธฐ ์ํ ๋๋ ํ ๋ฆฌ ์์ฑํ๊ณ ํด๋น ์์น๋ฅผ ์คํฌ๋ฆฝํธ ์คํํ ์ฅ์๋ก ์ค์ ํ๋ค
WORKDIR /usr/client
# ์ฑ์์กด์ฑ ์ ์ฅ
COPY package*.json ./
# ์ฑ์์กด์ฑ ์ค์น
RUN npm install
RUN npm install react-cookie
RUN npm install react-js-pagination
RUN npm install axios
# ์ด๋ฏธ์ง ์์ ์ฑ์ ์์ค์ฝ๋๋ฅผ ๋ฃ๋๋ค
COPY . .
# build the application
RUN npm run build
/*
app/nginx/Dockerfile
*/
# nginx ์ค์น
FROM nginx:latest
# Dockerfile script๊ฐ ์์
์ ์์ํ ์์น๋ฅผ ์ค์ ํ๋ค
WORKDIR /
# docker-compose๋ก๋ถํฐ ๋์ด์ค๋ client์ react build app volumes๋ฅผ ๋ฐ๊ธฐ ์ํ ํด๋๋ฅผ ์์ฑํ๋ค
RUN mkdir /build
# nginx ์ค์ ํ์ผ ๋ณต์ฌ
COPY nginx.conf /etc/nginx/nginx.conf
# start nginx
CMD ["nginx" ,"-g", "daemon off;"]
/
app/docker-compose.yml
/
version: '3.8'
services:
nginx:
container_name: my_nginxcontainer
# dockerfile์ buildํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค context์๋ ๋น๋ํ๊ณ ์ํ๋ dockerfile์ด ์กด์ฌํ๋ ์๋๊ฒฝ๋ก๋ฅผ ์ ์ด์ค๋ค
build:
context: ./nginx
# ":"๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ host OS์์ ๊ฐ์ ธ์์ container์ ์ฃผ์
์ํฌ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ ๋๋ค
# ":"๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ์ host OS์์ ๊ฐ์ ธ์จ ํ์ผ์ container์ด๋์ ๋ฃ์์ง ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ๋๋ค
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./client/build:/build
- /etc/letsencrypt:/letsencrypt
# depend_on์ ์ ์ด์ฃผ๋ image๋ ๋จผ์ ์คํ๋์ด์ผํ image๊ฐ ๋ฌด์์ด ๋์ด์ผํ ์ง ์ ์ด์ค๋ค(client์ ์ด๋ฏธ์ง๊ฐ ๋จผ์ ์คํ๋๊ณ nginx๋ฅผ ์ ์ด์ค์ผ ํจ)
depends_on:
- client
# ์ปจํ
์ด๋๊ฐ ๊ณต๊ฐํ๋ ports๋ฅผ ์ง์ ํ๋ค. 'ํธ์คํธ ๋จธ์ ์ ํฌํธ ๋ฒํธ : ์ปจํ
์ด๋์ ํฌํธ ๋ฒํธ'
expose:
- "80"
ports:
- "80:80"
# networks๋ ์ปจํ
์ด๋ ๊ฐ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋๋ค
networks:
- backend
restart: always
client:
container_name: my_clientcontainer
build:
context: ./client
depends_on:
- backend
backend:
container_name: my_backendcontainer
build:
context: ./backend
# backend์์ api์์ฒญ์ ๋ฐ๋ฅธ ํ์ผ์ ์ฝ์ ๋ databaseํด๋๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ backend container์์ volumes๋ก ๋ฃ์ด์ค๋ค
volumes:
- ./database:/usr/database
expose:
- "4298"
ports:
- "4298:4298"
networks:
- nginx
networks:
nginx:
backend: