docker compose Spring&MySQL&NGINX(React)

이진욱·2025년 1월 10일
0

Docker 공부

목록 보기
21/22

node.js : 자바스크립트를 실행해주는 runtime 환경

아래 사진은 node.js 사용 예제이다.

node 자바스크립트파일명.js

예제

ex09를 생성한 후 db 서버의 Dockerfile 작성

product 서버의 Dockerfile 작성
(product 폴더는 메타코딩 님의 github에서 다운로드 받았다)

db 서버의 init.sql 작성

  • 컨테이너가 실행될 때 자동으로 작동

  • Entity의 테이블 명이 product_tb이므로
    그에 맞춰서 작성

  • 데이터는 banana,apple,melon을 기입

product의 Dockerfile을 보면 ENTRYPOINT 가 있다.

java -jar -Dspring.profiles.active=prod app.jar

applicaion.yml에도 yml 활성화 선택이 있다.

Spring Boot는 application-{profile}.yml 또는 application-{profile}.properties 파일을 자동으로 인식하여 해당 프로파일에 맞는 설정을 로드한다.

※ appication.yml (ex : application-profile명.yml을 활성화)
spring:
  profiles:
    active:
       - profile명

명령줄 인수로 표현하려면 다음과 같다
-Dspring.profiles.active=profile명

만약 아래처럼 각각 활성화 yml명이 다를 경우, 다음과 같은 우선순위를 같게 된다.

※ yml 적용 우선 순위
1. 명령줄 인수
2. 환경 변수
3. application.yml 파일

즉, 명령줄 인수가 prod, application.yml이 dev를 활성화하였다면 prod를 따르게 된다.

docker-compose.yml 작성

  • 여기서 product는 server라는 서비스로 정의 할 것이다.

  • db는 db 서비스로 정의

  • docker-compose는 db, server를 하나로 묶어 연동시킬 것이다.

  • server에서 db로 연동시킬 떄는 호스트 포트 (3307)가 아닌 내부 포트(3306)를 지정해야한다

server 의 port도 내부 포트 (8081이 아닌 8080)을 설정해 주어야 한다.

ProductApplication.java
@Profile("dev")application-dev.yml에 대해서만 실행하는 Bean이다

설정을 완료하였으면 docker-compose를 빌드 및 실행한다.

서버 실행 상태이 확인된 후, metadb에 product_tb 테이블이 생성됨을 확인하였다.

product의 ProductController를 보면 /products에 대한 핸들러 메서드가 작성되어 있는 것을 확인할 수 있다.

localhost:8081/products로 이동하면 db 결과를 잘 가져옴을 확인할 수 있다

MySQL workbench에서도 해당 db를 확인할 수 있으며, 추가 데이터를 기입했을 때 상태를 테스트하려고 한다.

이번엔 Dockerfile의 명령줄 인수 중 ENTRYPOINT의 yml 활성화를 prod가 아닌 dev로 설정할 것이다.
설정 시 우측의 @Profile("dev") Bean이 활성화 될 것이다

재빌드 시 ddl-auto=create이므로 기존 데이터가 사라지고 바나나, 딸기, 참외가 새로 출력이 되었다.
@Profile("dev")가 활성화된 것을 확인하였다.

데이터를 추가로 기입을 해보았을 때, 데이터가 잘 기입된 것을 확인

여기서 yml의 활성화 대상을 다시 dev->prod로 바꾸었을 때, 그대로 인 것인 것을 확인할 수 있는데
prod의 ddl-auto=none 이기 때문이다.

  • Dockerfile은 이미지를 빌드할 때만 실행이 되며, MySQL이 이미 초기화가 된 경우에는 init.sql이 실행되지 않는다.

  • 만약 기존의 banana,apple,melon INSERT문을 자동으로 로드하고 싶다면 컨테이너를 prod로 새로 시작해야 한다

nginx TEST
  • webapp/index.html/usr/share/nginx/html/에 복사할 것이다

nginx로 옮길 index.html 작성

nginx-app라는 이름으로 빌드 및 실행

nginx-app이 잘 구동된 것을 확인

nginx 추가

nginx 테스트가 끝났으니, 프론트서버를 띄울 nginx 서버 추가

  • 자바스크립트는 React를 사용할 것이다.
  • npx 설치 및 실행
    npx create-react-app my-app
  • 리액트 디렉토리 내 강제 설치
    npm install --legacy-peer-deps
  • React 서버 (my-app) 폴더 내에 Dockerfile을 생성한다. nginx 관련 내용을 추가한다.

설정이 끝났다면 react를 html으로 빌드해야한다.

npm run build

빌드가 끝나면 리액트 (my-app) 하위 폴더에 build 폴더가 생성될 것이다

react 파일들을 docker로 build 한다.

docker build -t 빌드할이름 .

빌드 후 서버 동작 확인

react의 build 폴더가 nginx 내부에 잘 옮겨졌는지 확인 한다.

다른 형식으로 빌드해보기

기존 react의 Dockerfile를 수정하여, 빌드 및 복사 관련 내용을 추가한다.

  • npm run build 내용이 기입되어 있으므로 docker build만 하면 된다

    재빌드 한다.

    빌드, 컨테이너 실행 후 서버가 잘 작동됨을 확인

profile
열심히 하는 신입 개발자

0개의 댓글