Docker 리뷰

영태·2022년 8월 9일
0

[REVIEW]

목록 보기
7/7
post-thumbnail

Docker란?

  • 오픈소스 컨테이너화 플랫폼
  • 애플리케이션을 컨테이너로 패키징할 수 있습니다

컨테이너란?

  • 애플리케이션 소스 코드를 임의의 환경에서 해당 코드의 실행에 필요한 OS 라이브러리 및 종속 항목과 결합하여 실행하는 표준 컴포넌트
  • 기업들이 클라우드 컴퓨팅 환경으로의 이전을 선호하게 되면서 사용이 빈번해지고 있습니다
  • 도커 플랫폼을 이용하면 보다 손쉽고 간편하게 컨테이너를 빌드, 실행, 업데이트를 할 수 있습니다

컨테이너 기술 사용의 장점

  • 효율적인 개발 환경 구축

    • 개발환경 구축 기간을 단축
    • OS 가상화를 통해 개발자 개개인의 개발환경과 상관 없이 격리된 테스트 환경 구축
    • 기존 개상화 대비 작은 시스템 리소스로 개발 환경 구축
  • 배포 편이성

    • 이미지를 통한 배포, 배포 자동화 (CD)
    • 개발자 환경/ 테스트 환경 / 스테이징 환경 / 운영 환경에 대한 일관성을 보장
      • 장애 요인 제거, 장애 원인 파악 시간 단축
  • 민첩한 개발

    • 짧은 주기로 요구사항 정의와 릴리즈를 반복하는 애자일 개발 지원
  • 서비스 무정지 환경 제공과 MSA 구축에 매우 유리합니다

Monolithic Architecture vs Microservice Architecture

  • 모놀리식 아키텍처
    • Monolithic이란 '획일적이고 자유가 없는'이라는 뜻
    • 모든 기능을 하나의 어플리케이션에 비즈니스 로직을 구성해 운영
    • 개발을 하거나 환경설정을 함에 있어서 간단한 장점이 있어 작은 사이즈의 프로젝트에 유리합니다
    • 단점 : 시스템이 점점 확장되거나 큰 프로젝트에서는 단점들이 존재합니다
      • 빌드/ 테스트의 증가 :
        하나를 수정해도 시스템 전체를 빌드해야 합니다. 이는 유지-보수가 힘들다는 뜻이기도 합니다
      • 작은 문제가 시스템 전체에 문제를 일으킵니다 :
        만약 하나의 서비스 부분에 트래픽 문제가 발생하여 서버가 다운되면 모든 서비스의 이용이 불가능합니다
      • 확장성에 불리합니다 :
        서비스마다 이용률이 다를 수 있는데, 하나의 서비스를 확장하기 위해서는 전체 프로젝트를 확장해야합니다
  • 마이크로서비스 아키텍처
    • 여러 모듈을 독립된 형태로 구성하므로 개발언어에 종속되지 않습니다
    • 변화에 빠르게 대응할수 있습니다
    • 하나의 서비스에 문제가 생겨도 다른 서비스에는 영향이 없습니다
    • 서비스 별로 부분적인 확장이 가능합니다
    • 서비스 별로 개발팀이 꾸려지면 다른 팀에 대한 의존없이 팀 내에서 피드백을 빠르게 할 수 있고, 비교적 유연하게 운영이 가능해 커뮤니케이션 비용이 줄어듭니다
    • 단점 :
      • 서비스 별로 호출할때 API로 통신하므로 속도가 느립니다
      • 통신에 맞는 데이터로 맞추는 과정이 필요하기도 합니다
      • DB가 개별적으로 운영되기 때문에 트랜잭션으로 묶기가 힘듭니다
    • 체계적이지 못한 MSA는 오히려 프로젝트의 성능을 떨어트릴수 있습니다

도커와 도커-컴포즈를 이용한 활용,배포 경험

  • 모든 프로젝트에 도커를 적용해왔고 도커 컴포즈를 통해 testing을 하거나 배포파일을 작성했습니다

local 테스트 환경에서의 도커 활용 (nestjs, SNS 프로젝트)

  • 가장 최근에 작성한 도커, 도커-컴포즈 파일은 SNS프로젝트에서 작성했으며 다음과 같습니다
  • Dockerfile
FROM node:14

WORKDIR /wanted-sns/
COPY ./package.json /wanted-sns/
COPY ./yarn.lock /wanted-sns/
RUN yarn install

COPY . /wanted-sns/
CMD yarn start:dev
  1. node 14 버전을 컨테이너 내부에 설정
  2. 디렉토리 설정 후 package.json과 yarn.lock을 복사해 yarn install 명령을 실행합니다
  3. 이후 파일들을 전부 복사한 뒤 (node_module과 dist 등의 폴더는 .dockerignore를 통해 복사되지 않도록 합니다. 이미 yarn install로 생성이 되어 있기 때문입니다)
  4. yarn start:dev를 통해 nest.js 어플리케이션을 실행합니다
    관련 코드에 대한 부가적인 공부내용은 따로 포스팅하겠습니다
  • docker-compose.yaml
version: '3.7'

services:
  backend-server:
    build:
    # 빌드할 도커파일의 경로를 지정해줍니다
      context: .
      dockerfile: Dockerfile
    volumes:
    # 코드들이 들어있는 src 폴더와 env 파일폴더를 함께 옮겨 바인드해줍니다
      - ./env/.env:/wanted-sns/env/.env
      - ./src:/wanted-sns/src
    environment:
    # 환경변수를 통해 타임존을 서울시간으로 변경해줍니다
      - TZ=Asia/Seoul
    ports:
    # 주로 3000번을 사용했지만 프로젝트가 많아져 번호를 하나씩 올려 바꿔갔습니다
      - 3003:3003

  database-server:
    # platform: linux/x86_64 # 윈도우 환경에 설치된 도커를 쓰신다면 이부분을 제외해주세요!
    image: mysql:latest # 빌드할 이미지를 명시해줍니다
    environment:
    # 데이터베이스이름과 패스워드, 타임존을 설정해줍니다
      MYSQL_DATABASE: 'sns'
      MYSQL_ROOT_PASSWORD: 1178
      TZ: 'Asia/Seoul'
    ports:
      - 3306:3306
  • nest.js를 올리기 위한 기본적인 도커-컴포즈 파일입니다
  • 이런식으로 yaml을 설정해

배포용 도커 활용(nestjs, tempClothes 프로젝트)

  • 도커파일은 사실상 비슷합니다
  • docker-compose.prod.yaml
version: '3.7'
services:
  t-backend:
    image: asia.gcr.io/civic-visitor-357217/t-backend:0.1.3
    platform: linux/x86_64
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - TZ=Asia/Seoul
    ports:
      - 3000:3000
  • 배포용 도커컴포즈파일에는 DB와 Redis에 관한 내용이 빠져있습니다
  • GCP SQL과 memory-store을 이용해 배포한 후 이를 app.module.ts를 통해 연결시켰기 때문입니다

nginx 로드밸런싱용 도커 활용(nestjs-nginx, deployAPP 프로젝트)

  • 아래와 같이 default.conf 파일을 만들어준 후
server {
    listen 80;

    # index
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # hello-service
    location /api {
        proxy_pass http://hello-service:3000;
    }

    # error page
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  • 아래와 같이 도커 컴포즈로 띄웁니다
version: "3.8"

services:
  api-gateway:
    image: nginx:latest
    volumes:
      - ./api-gateway/default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 80:80

  hello-service:
    build:
      context: ./app
      dockerfile: Dockerfile
    volumes:
      - ./app/src:/hello-service/src
    ports:
      - 3000:3000

정리

도커란?

  • 오픈소스 컨테이너화 플랫폼
  • 컨테이너란?
    • 애플리케이션 소스 코드를 임의의 환경에서 해당 코드의 실행에 필요한 OS 라이브러리 및 종속 항목과 결합하여 실행하는 표준 컴포넌트

도커의 장점

  • OS 가상화를 통해 개발자 개개인의 개발환경과 관계없이 격리된 테스트 환경을 구축할 수 있습니다
  • 작은 시스템 리소스를 가지고 있어 빠르고 효율적인 개발 환경 구축이 가능합니다
  • 배포에 있어서 편리합니다
    • 이미지를 통한 배포와 배포 자동화를 할 수 있습니다
    • 개발환경에 대한 일관성을 보장하기 때문에 장애 요인 제거와 장애 원인 파악에 대한 시간이 단축됩니다
  • 짧은 주기로 요구사항 정의와 릴리즈를 반복하는 애자일 개발에 적합합니다

모놀리식 vs 마이크로서비스 아키텍처

  • 모놀리식
    • 모든 기능을 하나의 어플리케이션의 비즈니스 로직에 구성하는 구조
    • 하나를 수정해도 전체를 빌드해야 해서 유지보수가 힘듭니다
    • 하나의 문제가 전체를 다운시킬수 있습니다
    • 서비스마다 이용률이 달라도 특정한 서비스를 확장하고자 한다면 전체 서비스를 확장해야 합니다
  • MSA
    • 개발언어에 종속되지 않습니다
    • 하나에 문제가 생겨도 다른 서비스에 영향이 없습니다
    • 부분적인 확장이 가능합니다
    • 서비스당 한 팀으로 개발팀을 꾸려 개발하면 유연하게 개발할 수 있어 커뮤니케이션 비용이 줄어듭니다
  • 다만 체계적이지 못한 MSA는 오히려 통신 속도를 느려지게 만들고 관리하기 힘들기 때문에 정확한 설계가 필요합니다
profile
개발 공부중

0개의 댓글