docker로 3 tier architecture 만들기

김우성·2022년 7월 19일

3 tier architecture란

3계층 아키텍처란?
3계층 아키텍처는 애플리케이션을 3개의 논리적 및 물리적 컴퓨팅 계층으로 구성하는 잘 정립된 소프트웨어 애플리케이션입니다. 프리젠테이션 계층 또는 사용자 인터페이스, 데이터가 처리되는 애플리케이션 계층, 그리고 애플리케이션과 연관된 데이터가 저장 및 관리되는 데이터 계층 등을 들 수 있습니다.

3계층 아키텍처의 주요 장점은 각 계층이 자체 인프라에서 실행되기 때문에 각 계층이 별도의 개발 팀에 의해 동시에 개발될 수 있으며 다른 계층에 영향을 주지 않고 필요에 따라 업데이트되거나 확장될 수 있다는 점입니다.

이번 포스팅에서는 Frontend(React), Backend(Django), Database(MySQL)의 3개의 어플리케이션으로 구축하려고 합니다.

출처: https://www.ibm.com/kr-ko/cloud/learn/three-tier-architecture

최종 목표

docker로 3개의 이미지를 컨테이너로 만들어 아무것도 설치되지 않은 환경에서도 docker만 설치되어 있으면 실행가능하도록 만들려고 합니다.

각각의 App에 dockerfile을 만들어 base로 사용할 이미지와 실행할 명령어들을 정리합니다. 그리고 최상단에서 docker-compose를 사용해서 3개의 docker 이미지를 동시에 만들고 실행합니다.

소스 코드는 아래에서 참고하면 됩니다.
https://github.com/lotus9630/3-tier-architecture

개별로 이미지 만들기

먼저 dockercompose가 아닌 dockerfile을 직접 실행에서 개별로 이미지를 만들어 보겠습니다. /Frontend 의 dockerfile입니다.

FROM node:16.15.1 
# 2022/7/7 현 시점에서 LTS 버전 

WORKDIR /home/node/app

COPY ./ ./

RUN npm install 
# App을 빌드하는 명령어. 여러개가 올 수 있다 



CMD ["npm", "run", "start"]
# 빌드된 App을 실행하는 명령어 하나만 올 수 있다 

# 이미지 생성 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .

# 컨테이너 생성 & 실행 명령어
# docker run --name {컨테이너명} -p 3000:3000 {이미지명}

node의 LTS 버전의 이미지를 사용합니다. 현재 디렉토리에 있는 리액트 파일들을 컨테이너의 workdir에 복사합니다. 그리고 컨터이너 내부에서 npm을 설치하고 개발용 리액트 서버를 실행하는 dockerfile 입니다.

우선 Frontend 폴더에서 Frontend용 이미지로 빌드를 하겠습니다.

# /frontend
docker build -t frontend-img ./
# front-img라는 이름의 이미지를 현재 폴더에 있는 dockerfile을 사용하여 빌드한다 

npm을 설치하기 때문에 이미지를 만드는데 시간이 좀 걸릴 수 있습니다.

이미지가 생성된 것을 확인했으니 이제 컨테이너로 만들어 실행시켜 보도록 하겠습니다.

# /frontend
docker run --name frontend-con -p 3000:3000 frontend-img

frontend-con라는 이름의 컨테이너를 frontend-img를 사용하여 만들었습니다. -p는 포트를 설정하는 옵션인데 왼쪽이 호스트, 오른쪽이 컨테이너의 포트번호입니다.

브라우저를 통해 접속해 보니 컨테이너가 잘 실행되고 있음을 알 수 있습니다. Backend와 Database는 아직 구현하지 않아 연결되지 않았다고 나옵니다. Backend과 Database 이미지를 만드는 것은 위와 같은 방식으로 하므로 생략하겠습니다.

docker compose로 Application 3개를 한번에 만들기

위에서 했던 이미지를 빌드하고 컨테이너화 해서 실행시키는 과정을 docker-compose로 좀 더 쉽게 해보겠습니다. 아래는 docker-compose.yaml 파일의 내용입니다.

version: "3"
services:
  database:
    # Dockerfile이 있는 위치
    build: ./database
    ports:
      - "3002:3306"
  backend:
    build: ./backend
    volumes:
      - ./backend:/usr/src/app
    ports:
      - "3001:8000"
  frontend:
    build: ./frontend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    # volumes:
    #   - ./frontend:/home/node/app
    ports:
      - "3000:3000"

service가 각각의 이미지를 가리킵니다. 여기서는 database, backend, frontend라는 이름의 이미지를 만들겄습니다. build 옵션에 Dockerfile이 있는 위치를 가르켜 해당 파일을 실행시키면서 빌드를 하게끔 명령합니다. 그리고 위에서 포트 번호를 직접 입력했던 것을 ports라는 옵션에 작성합니다.

이제 docker-compose.yaml 파일이 있는 위치에서 "docker compose up" 명령어를 치면 완료됩니다.

3개의 이미지가 생성되었고 이미지의 이름은 "폴더명" + "_" + "서비스의 이름" 으로 구성되었습니다.

컨테이너도 이미지와 같은 이름으로 생성되었습니다.

브라우저에 접속해보면 3개의 App이 정상적으로 작동하는 것을 확인할 수 있습니다.

profile
초보 개발자입니다

0개의 댓글