베가스의 밤은 불이 꺼지지 않았다... 정말 번쩍번쩍한 호텔들이 많았고 길거리 어딜 가든지 카지노가 즐비했으며 대마초 냄새가 진동을 했다...

 

호텔앞에서는 정해진 시간마다 분수쇼가 5분 넘게 진행되었다

 

 

 

 

 

- TIL -

 

구현 목표)

프로젝트를 배포할 미니pc 한대를 구매하게 되었다.

미니 피씨에 Docker Compose 를 활용하여 Spring, React, MySQL, Nginx 컨테이너를 각각 생성할 것이며

Nginx 의 리버스 프록시 기능을 사용하여 접속 도메인 별로 React 프로젝트와 Spring 프로젝트로 분류하여 응답할 것이다.

 

 

 

프로젝트 디렉토리 구조)

randomchat/
├── nginx/
│   ├── nginx.conf
│   └── Dockerfile
├── spring/
│   └── Dockerfile
├── react/
│   └── Dockerfile
├── docker-compose.yml

 

 

 

구현 과정)

1. 도커 컨테이너를 구현하기 위해 Docker 설치와 생성된 컨테이너들을 하나로 묶어서 관리할 수 있게 해주는 Docker Compose 를 설치해준다.

더보기

1) 아래 명령어를 사용하여 Docker 와 Docker Compose 를 설치

sudo apt update
sudo apt install docker.io docker-compose -y

 

 

 

2) 각 컨테이너를 관리할 디렉토리를 생성

( 홈 디렉토리 위치는 root 계정의 홈이 아닌 사용자 계정의 홈 디렉토리로 생성한다 )

mkdir -p ~/randomchat/{spring,mysql,react,nginx}
cd ~/randomchat

 

 

 

2. Spring Dockerfile 작성

더보기

1) Spring 컨테이너로 이동하여 빌드된 스프링 파일을 위치시킨다.

( scp 를 사용하여 빌드 파일을 미니 피씨로 전송하였다 )

-P 뒤에는 사용하는 SSH 포트 번호를 기재, youngho3358 은 사용자 계정이며 @ 뒤에는 아이피 주소가 들어간다.

 

정상적으로 빌드 파일이 spring 디렉토리 하위에 생성되었다.

 

위 작업 이후에  jar 파일 이름을 app.jar 로 mv 명령어를 사용해 변경해주었다.

 

 

 

 2) Dockerfile 작성

( /randomchat/spring 경로에 작성 )

FROM openjdk:21-jdk-slim
WORKDIR /app # 컨테이너 내부의 작업 경로
COPY app.jar app.jar
# 로컬의 빌드파일인 app.jar 파일을 도커 컨테이너 내부 경로에 동일한 이름인 app.jar 로 복사하여 사용
# 여기서 앞의 app.jar 이 로컬의 위치인데 docker-compose.yml 에 context 항목을
# 현재 위치인 . 으로 표기했기 때문에 현재 위치인 spring 디렉토리부터의 경로를 기재해주면 된다.
ENTRYPOINT ["java", "-jar", "app.jar"]

 

 

 

3) 디렉토리 내부 상태

app.jar 와 Dockerfile 존재

 

 

 

3. React Dockerfile 작성

더보기

1) React 컨테이너로 이동하여 빌드된 리액트 파일을 위치시킨다.

( scp 를 사용하여 빌드 파일을 미니 피씨로 전송하였다 )

리액트 빌드 파일을 scp 를 사용해서 가져온 뒤 압축을 풀어 react 디렉토리에 위치시켜준다.

 ( 주의할 점 : build.zip 을 압축해제 하면 build/build/{빌드파일} 형태로 디렉토리로 하나 더 감싸져 있는 경우가 있기 때문에 주의해야 한다. )

 

 

 

 2) Dockerfile 작성

( /randomchat/react 경로에 작성 )

FROM nginx:latest
WORKDIR /user/share/nginx/html
COPY build/ .
CMD ["nginx", "-g", "daemon off;"]

 ( COPY 를 통해 react 디렉토리 내부에 build 파일 하위의 파일을 복사하여 도커 컨테이너 내부에 복사하여 사용한다 )

 

 

 

 3) 디렉토리 내부 상태

디렉토리 내부 상태

 

 

 

To-Do List)

1. MySQL 컨테이너 정의하기

2. 가비아에서 도메인 구매하여 아이피랑 연결하기

3. Nginx 를 설치하여 저렴한 도메인을 구매한 뒤 도메인과 연결하여 경로를 처리하기

4. Jenkins 를 사용하여 깃허브에 코드가 커밋될때마다 자동으로 배포하게 설정하기

728x90

+ Recent posts