๊ฐ๋จํ 3-Tier ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ๊ณ multi-container๋ก ๊ตฌ์ถํด๋ณด์!
- ๋ชฉํ: docker ๋์ ์๋ฆฌ ์ดํดํ๊ธฐ, container ๊ฐ์ ํต์ ์ดํดํ๊ธฐ
- ์ฃผ์ : ๋กค๋ง ํ์ดํผ ์น ์ดํ๋ฆฌ์ผ์ด์
- ๊ธฐ๋ฅ: ๋กค๋ง ํ์ดํผ ์์ฑยท์กฐํยท์ญ์ ๊ฐ๋ฅ
- ๊ฐ๋ฐ ํ๊ฒฝ:
- ํ๋ก ํธ์๋:
- node.js
17-slim
- axios
0.19.0
- node.js
- ๋ฐฑ์๋:
- Springboot version
2.7.3
- Java version
openjdk version "11.0.11"
- Springboot version
- DB:
- MySQL
5.7
- MySQL
- ํ๋ก ํธ์๋:
- network๋ฅผ
rollging-fe-be
์rolling-be-db
๋ก ๋ถ๋ฆฌํ์ฌ ํ๋ก ํธ์๋์์ frontend์ db๊ฐ์ ํต์ ์ ๋ง๊ณ ํด๋ผ์ด์ธํธ์ ์ ๊ทผ์ frontend์๋ง ๊ฐ๋ฅํ๊ฒ ์ค๊ณํ์ต๋๋ค. - ํ๋ก ํธ์๋ ์ปจํ ์ด๋๋ ๋ฐฑ์๋ ์ปจํ ์ด๋์ ์ด๋ฆ์ ํตํด ํต์ ํฉ๋๋ค.
- ๋ฐฑ์๋ ์ปจํ
์ด๋๋ DB ์ปจํ
์ด๋์ ์ด๋ฆ์ ํตํด ํต์ ํฉ๋๋ค.
- ์ด๋ฏธ์ง ์์ฑํ๊ธฐ
- ํ๋ก ํธ์๋ ์ด๋ฏธ์ง ์์ฑ
# git clone cd /LABs git clone https://github.com/RamSSi/docker-project-front.git # ์์คํ์ผ ํ์ธ cd docker-project-front/ ls app.js package.json package-lock.json public # Dockerfile ์์ฑ vi Dockerfile # Dockerfile ๋ด์ฉ FROM node:17-slim WORKDIR /home/node COPY ./ ./ RUN npm -y install EXPOSE 3000 CMD ["npm","run","start"] # Dockerfile์ ํตํ image build ๋ฐ ์ปจํ ์ด๋ ์์ฑ docker build --tag node-front:1.0 . # ์ด๋ฏธ์ง ํ์ธ docker images REPOSITORY TAG IMAGE ID CREATED SIZE node-front 1.0 21b1d57d9e0d 20 minutes ago 252MB
- ๋ฐฑ์๋ ์ด๋ฏธ์ง ์์ฑ
## MySQL ## # MySQL 5.7๋ฒ์ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ docker pull mysql:5.7 ## Springboot ## # git clone git clone https://github.com/krr3804/RollingPaper.git cd RollingPaper/ # Dockerfile ์์ฑ vi Dockerfile FROM openjdk:11-jdk AS builder COPY ./rollingpaper/gradlew . COPY ./rollingpaper/gradle gradle COPY ./rollingpaper/build.gradle . COPY ./rollingpaper/settings.gradle . COPY ./rollingpaper/src src RUN chmod +x ./gradlew RUN ./gradlew bootJar FROM openjdk:11-jdk COPY --from=builder build/libs/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"] # ์์ฑํ Dockerfile์ ์ด๋ฏธ์ง๋ก ๋น๋ docker build -t springboot-mysql:1.0 . # ํ์ํ ์ด๋ฏธ์ง๊ฐ ์ค๋น๋์๋์ง ํ์ธ docker images | grep mysql springboot-mysql 1.0 d37a0d6bd0a6 About a minute ago 694MB mysql 5.7 daff57b7d2d1 4 weeks ago 430MB
- ๋คํธ์ํฌ ์์ฑ
# ๋คํธ์ํฌ ์์ฑ
docker network create rolling-fe-be
docker network create rolling-be-db
- ์ปจํ
์ด๋ ์์ฑ
- ๋ฐฑ์๋ & DB ์ปจํ ์ด๋ ์์ฑ
# MySQL ์ปจํ ์ด๋ ๋์ฐ๊ธฐ docker run -d --rm --name rolling-db \ -p 13306:3306 \ --network rolling-be-db \ -e MYSQL_ROOT_PASSWORD=9999 \ -e MYSQL_DATABASE=paperdb \ -e MYSQL_USER=user \ -e MYSQL_PASSWORD=user \ mysql:5.7 \ --character-set-server=utf8 \ --collation-server=utf8_general_ci # MySQL ์ปจํ ์ด๋๊ฐ ์คํ ์ค์ธ์ง ํ์ธ docker ps 3cb87d609671 mysql:5.7 "docker-entrypoint.sโฆ" 2 minutes ago Up 2 minutes 33060/tcp, 0.0.0.0:13306->3306/tcp, :::13306->3306/tcp rolling-db ## 2. Springboot ์ปจํ ์ด๋ ์คํํ๊ธฐ # ์์ฑํ ์ด๋ฏธ์ง๋ฅผ ์ปจํ ์ด๋๋ก ์คํ docker run -d --rm --name rolling-server \ -p 8080:8080 \ --network rolling-be-db \ springboot-mysql:1.0 # fe๊ณผ be bridge์ ์ฐ๊ฒฐ docker network connect rolling-fe-be rolling-server # ์ปจํ ์ด๋ ์ํ ํ์ธ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 76b78f06be34 springboot-mysql:1.0 "java -jar /app.jar" 4 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp rolling-server f616b0ac8345 mysql:5.7 "docker-entrypoint.sโฆ" 9 seconds ago Up 7 seconds 33060/tcp, 0.0.0.0:13306->3306/tcp, :::13306->3306/tcp rolling-db
- ํ๋ก ํธ์๋ ์ปจํ ์ด๋ ์์ฑ
# frontend ์ปจํ ์ด๋ ๋์ฐ๊ธฐ docker run -d --name rolling-front -p 3000:3000 --network rolling-fe-be node-front:1.0 # ์ปจํ ์ด๋ ์ํ ํ์ธ docker ps
Docker Compose๋ ๋ค์ค ์ปจํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ๊ณต์ ํ ์ ์๋๋ก ๊ฐ๋ฐ๋ ๋๊ตฌ๋ก ๋จ์ผ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์คํ ๋๋ ์ข ๋ฃํ ์ ์๋๋ก ๊ฐ๋ฐ๋ ๋๊ตฌ -NHN cloud-
์ฌ๋ฌ๋ฒ์ docker ๋ช ๋ น์ด๋ฅผ ์ํํ ํ์ ์์ด docker-compose.yaml ํ์ผ์ ํตํด ํ๋ฒ์ n๊ฐ์ container๋ค์ ์คํํ ์ ์์ต๋๋ค. yaml ํ์ผ ํ์์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ container ์คํ ์ต์ ์ ๊ฐ๋ ์ฑ ๋ฐ์ด๋๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
- docker-compose.yaml ์์ฑ
version: '3.8'
services:
mysql:
image: mysql:5.7-debian
container_name: rolling-db
environment:
MYSQL_ROOT_PASSWORD: pass123
MYSQL_DATABASE: paperdb
MYSQL_ROOT_HOST: '%' # to allow root connecting from any address.
MYSQL_USER: user
MYSQL_PASSWORD: user
ports:
- '13306:3306'
networks:
- rolling-be-db
restart: always
command:
- --character-set-server=utf8
- --collation-server=utf8_general_ci
springboot:
image: springboot-mysql:1.0
container_name: rolling-server
restart: always
depends_on:
- mysql
ports:
- '8080:8080'
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://rolling-db:3306/paperdb?serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME: user
SPRING_DATASOURCE_PASSWORD: user
networks:
- rolling-be-db
- rolling-fe-be
front:
image: node-front:1.0
container_name: rolling-front
restart: always
depends_on:
- springboot
ports:
- '3000:3000'
networks:
- rolling-fe-be
networks:
rolling-be-db: {}
rolling-fe-be: {}
- docker-compose.yaml ํ์ผ ์คํ
docker-compose up
- docker-compose.yaml ํ์ผ ์์ฑ
version: '3.8'
services:
mysql:
image: mysql:5.7-debian
container_name: rolling-db
environment:
MYSQL_ROOT_PASSWORD: pass123
MYSQL_DATABASE: paperdb
MYSQL_ROOT_HOST: '%'
MYSQL_USER: user
MYSQL_PASSWORD: user
ports:
- '13306:3306'
networks:
- rolling-be-db
restart: always
command:
- --character-set-server=utf8
- --collation-server=utf8_general_ci
springboot:
image: springboot-mysql:1.0
scale: 3
depends_on:
- mysql
ports:
- '8081-8083:8080'
restart: always
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://rolling-db:3306/paperdb?serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME: user
SPRING_DATASOURCE_PASSWORD: user
networks:
- rolling-be-db
nginx:
image: nginx:1.21.5-alpine
container_name: rolling-server
restart: always
depends_on:
- springboot
ports:
- '8080:80'
volumes:
- ./proxy/nginx.conf:/etc/nginx/nginx.conf
networks:
- rolling-be-db
- rolling-fe-be
front:
image: node-front:1.0
container_name: rolling-front
depends_on:
- nginx
ports:
- '3000:3000'
restart: always
networks:
- rolling-fe-be
networks:
rolling-be-db: {}
rolling-fe-be: {}
- nginx.conf ํ์ผ ์ค์
# proxy ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir proxy
# proxy ๋๋ ํ ๋ฆฌ ๋ด์ nginx.conf ํ์ผ ์์ฑ
cd proxy
vi nginx.conf
# nginx.conf ๋ด์ฉ
events { worker_connections 1024; }
http{
upstream rolling-server { # upstream์ ์ด๋ฆ์ rolling-server๋ก ์ค์
# ์ง์ ํ๊ณ ์ถ์ ๋ก๋๋ฐธ๋ฐ์ค ํ์
(=๋ถํ๋ถ์ฐํ์
,์๊ณ ๋ฆฌ์ฆ)์ ์ ์ด์ค๋ค. (๊ธฐ๋ณธ: ๋ผ์ด๋ ๋ก๋น)
# ํด๋ผ์ด์ธํธ๊ฐ Nginx๋ก ์์ฒญ ์ ์ฐํ์์ผ ์ค ์๋ฒ ์ ๋ณด(172.17.0.1์ docker0์ IP)
server 172.17.0.1:8081;
server 172.17.0.1:8082;
server 172.17.0.1:8083;
}
server {
listen *:8080 default_server; # ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ ํฌํธ ๋ฒํธ
location / {
proxy_pass http://rolling-server; # ์ค์ ํ upstream์ผ๋ก ์์ฒญ ๋ณด๋ด๊ธฐ
}
}
}
- docker-compose.yaml ํ์ผ ์คํ
cd ..
docker-compose up
- ํ์ ๋ชจ๋๊ฐ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ๊ฒฝํ์ด ์ ์ด์ ํ๋ก ํธ์๋ ์ค๊ณ์ ๊ตฌํ์ ๋ง์ ์๊ฐ์ด ํ ์ ๋์์ต๋๋ค. ๋ค์์ผ๋ก ์ธ๊ธํ ๋คํธ์ํฌ์ ๊ดํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด node.js์์ ejs๋ฅผ ํตํด ํ๋ก ํธ๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค.
- html, css, javascript๋ก ๊ตฌ์ฑํ frontend์์ container ๋ช ์ ํตํด backend container์ ํต์ ํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋น์ frontend์์ ํต์ ์ ์ฃผ์ฒด๋ client side์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ๋ฌธ์ ์์ต๋๋ค. ๊ฒฐ๊ตญ frontend์ ๊ตฌ์ฑ์ node.js์ express ๋ฏธ๋ค์จ์ด๋ก ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ก ํธ์๋ ์ปจํ ์ด๋์ ๋ฐฑ์๋ ์ปจํ ์ด๋ ๊ฐ์ ํต์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
- ํ์ฌ DB -> SpringBoot -> nginx -> frontend ์์ผ๋ก ์์กด์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์์ ์ปจํ ์ด๋๋ค์ด ์ฐ์ ์คํ๋์ด์ผ ํ์ ์ปจํ ์ด๋์์ ์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. depends_on ์ค์ ์ ํตํด ์ปจํ ์ด๋ ๊ฐ์ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ์์ผ๋ ์ค์ ์ปจํ ์ด๋์ application์ด ์์ ํ ์คํ๋๊ธฐ ๊น์ง 10~15์ด ์ ๋์ ์๊ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ depends on ์ค์ ์๋ ๋ถ๊ตฌํ๊ณ ์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. shell script๋ฅผ ํตํด Backend Container์ ์์ฑ์ ์ง์ฐ์ ์ฃผ๊ฑฐ๋, Backend Container์๊ฒ restart=always option์ ๋ถ์ฌํ์ฌ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค๊ณ ํ์ฌ, ์ ํฌ๋ ํ์์ ๋ฐฉ๋ฒ์ ์ฑํํ์ฌ ์งํํ์์ต๋๋ค.
- ๊ฐ๋จํ ๊ตฌ์ฑ์ ๋ก๋๋ฐธ๋ฐ์๋ถํฐ ์์ํ์ฌ ๊ณ ์ฑ๋ฅ์ ๋ก๋๋ฐธ๋ฐ์ ๊ตฌ์ถ์ ๋ชฉํ๋ก ์ก์์ผ๋, ๊ฐ๋จํ ๊ตฌ์ฑ์ ๋ก๋๋ฐธ๋ฐ์๋ถํฐ ์ด๋ ค์์ ๋ง์ด ๊ฒช์ด ์ํ๋ ์ฑ๋ฅ์ ๋ถํ ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถ์ ํ์ง ๋ชปํ์ฌ ์ด ์ ์ด ์์ฝ์ต๋๋ค.
์ด๋ฆ | ์ญํ |
---|---|
๊ฐ์๋ | frontend OPS |
๊น์์ฃผ | backend OPS |
๊น์์ง | loadbalancer OPS |
๋ฐ๊ฒฝ์ | frontend OPS |
์ง์ ๋ฆฌ | backend OPS |