Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[섹션 6] 실습 코드 + 정리 #16

Open
wants to merge 5 commits into
base: jungyoon
Choose a base branch
from

Conversation

JungYoonShin
Copy link
Collaborator

💗 노션 링크 : https://natural-louse-039.notion.site/4-6-14471ceedd028059b22be69a09b07e97

클라우드 네이티브(Cloud Native) 애플리케이션

클라우드 : 스토리지 저장소

  • 클라우드 업체의 서버들에 파일들이 저장된다.
  • 사용자가 서버를 만들때마다, VM을 만들어서 제공 → 가상화 기술 사용
  1. 트래픽이 증가할 때 빠르게 대처할 수 있는가? (확장성)

    • 트래픽이 증가할 때 빠르게 서버를 늘이고, 없을때는 줄일 수도 있어야 한다.
  2. 장애가 발생했을 때, 빠르게 복구할 수 있는가? (복원력)

    • 백업 및 복구가 빠르게 이루어질 수 있다. → 전세계에 많은 데이터센터가 존재
  3. 운영비용을 효율적으로 운영할 수 있는가?

    • 서버를 비효율적으로 사용하여 비용청구가 많이 되는 경우가 많다.
      • 비용 최적화를 지속적으로 수행해야함.

애플리케이션이 클라우드에 적합하지 않으면, 클라우드는 의미가 없어진다.

클라우드 네이티브 애플리케이션
→ 클라우드 환경을 더 잘 활용할 수 있는 애플리케이션 구조

어떤 애플리케이션이 클라우드 네이티브 애플리케이션이 될 수 있을까?

1. MSA

  • 트래픽 증가에 빠르게 대처하기 위해선 애플리케이션이 MSA 구조로 개발되어야 한다.

2. 컨테이너 (Container)

  • 컨테이너를 활용해 실행 환경에 종속되지 않는 동작이 보장되어야 합니다.

3. 상태비저장 (Stateless)

  • 애플리케이션 서버는 상태를 가지지 않아야 합니다.상태를 가지지 않는 애플리케이션은 어디에나 즉시 배포될 수 있습니다.

4. DevOps 및 CI/CD

  • 배포가 자동화되어야 하고 빠르게 릴리즈가 수행되어야 합니다.

컨테이너는 stateless 하다. 컨테이너 삭제되면 읽기/쓰기 레이어도 삭제됨.

MSA

  • 모놀리식 → 모든 기능을 하나의 애플리케이션으로 구성 (하나의 서버)
    • 실행시간, 빌드시간, 배포시간이 오래걸리게 된다.
  • MSA → 도메인이나 기능별로 모듈을 분리해서 서버를 구성
    • 하나의 기능이 먹통이 되도, 다른 기능에 영향을 끼치는 문제 방지
    • 단점) 서버의 개수가 늘어나므로 전반적인 리소스 사용량이 늘어남, 서버들간의 네트워크 통신관리 필요

image

Leafy 애플리케이션 구성

  • 식물 관리 웹 애플리케이션
  • 3개의 서버로 구성(WEB, WAS, DB)
  • 순서) DB먼저 구성 및 실행 → 백엔드 → nginx 서버 순으로 이미지 빌드 → 컨테이너 실행

image

# 1. leafy 애플리케이션이 사용할 네트워크 생성
docker network create leafy-network

# 2. leafy-postgres 컨테이너 실행(데이터베이스 컨테이너임)
docker run -d --name leafy-postgres --network leafy-network devwikirepo/leafy-postgres:1.0.0

# 3. 컨테이너 로그 조회 
# database system is ready to accept connections 떠야 정상 실행
docker logs -f leafy-postgres

# 4. 백엔드 애플리케이션 컨테이너 실행 (위에서 만든 DB컨테이너와 연결해줌)
docker run -d -p 8080:8080 -e DB_URL=leafy-postgres --network leafy-network --name leafy devwikirepo/leafy-backend:1.0.0

# 5. 프론트 컨테이너 실행
docker run -d -p 80:80 --network leafy-network --name leafy-front devwikirepo/leafy-frontend:1.0.0

PostgreSQL 컨테이너 구성

image

  • Dockerfile
#PostgreSQL 13 버전을 베이스 이미지로 사용
FROM postgres:13

#init.sql파일을 /docker-entrypoint-initdb.d/ 로 복사, 
# /docker-entrypoint-initdb.d/에 있는 sql문은 컨테이너가 처음 실행 시 자동실행됨(이렇게 약속되어있는 거임)
COPY ./init/init.sql /docker-entrypoint-initdb.d/

#postgresql.conf파일을 /etc/postgresql/postgresql.conf 로 복사, 
# 기본 설정 파일을 덮어쓰기하여 새로운 설정 적용
COPY ./config/postgresql.conf /etc/postgresql/custom.conf

#계정정보 설정
ENV POSTGRES_USER=myuser
ENV POSTGRES_PASSWORD=mypassword
ENV POSTGRES_DB=mydb

EXPOSE 5432

# 이미지 안의 기본 설정파일이 아닌, 빌드를 통해 주입한 설정파일 사용
CMD ["postgres", "-c", "config_file=/etc/postgresql/custom.conf"]

  • Leafy PostgreSQL 빌드 및 실행, 테스트

    1. network 가 제대로 생성되어 있는지 확인
    • docker network ls
    • docker network create leafy-network
    1. 이미지 빌드 및 푸시 (easydocker/leafy/leafy-postgresql 경로에서 실행)
    • docker build -t (개인레지스트리명)/leafy-postgres:1.0.0 . --no-cache
      • . 의 의미
        • 이미지를 빌드할 Dockerfile 및 파일이 위치한 빌드 컨텍스트를 나타냅니다.
        • .현재 디렉터리를 의미합니다. 즉, 현재 디렉터리에 있는 Dockerfile과 필요한 파일들을 사용하여 이미지를 빌드합니다.
      • -no-cache 의 의미
        • 캐시를 사용하지 않고 새롭게 이미지를 빌드합니다.
        • Docker는 기본적으로 이전 빌드 과정에서 생성된 캐시를 활용해 빌드 속도를 높이지만, -no-cache 옵션을 사용하면 모든 단계를 캐시 없이 새로 실행합니다.
    • docker push (개인레지스트리명)/leafy-postgres:1.0.0
    1. 컨테이너 실행 및 로그 확인
    • docker run -d --name leafy-postgres --network leafy-network (개인레지스트리명)/leafy-postgres:1.0.0
    • docker logs leafy-postgres
    1. 컨테이너 접근 및 DB 명령어 실행
    • docker run -d --name leafy-postgres --network leafy-network (개인레지스트리명)/leafy-postgres:1.0.0
    1. 초기 데이터 조회 (Ctrl+C 로 종료)
    mydb=# SELECT * FROM users;
    mydb=# SELECT * FROM plants;
    mydb=# SELECT * FROM user_plants;
    exit

SpringBoot 백엔드 컨테이너 구성

  • OS에 java runtime이 설치되어있어야 jar, war 실행 가능
  • 소스코드 → 애플리케이션으로 빌드하려면 maven이나 gradle 필요

image

  • 멀티 스테이징 빌드
    • 빌드와 실행 스테이지 구분
    • 빌드 → gradle 이미지
    • 실행 → 빌드 스테이지에서 만들어진 jar 파일을 Open JDK 이미지로 복사
# 빌드 이미지로 OpenJDK 11 & Gradle을 지정
FROM gradle:7.6.1-jdk11 AS build

# 소스코드를 복사할 작업 디렉토리를 생성
WORKDIR /app

# 호스트 머신의 소스코드를 작업 디렉토리로 복사
COPY . /app

# Gradle 빌드를 실행하여 JAR 파일 생성
RUN gradle clean build --no-daemon

# 런타임 이미지로 OpenJDK 11 JRE-slim 지정
FROM openjdk:11-jre-slim

# 애플리케이션을 실행할 작업 디렉토리를 생성
WORKDIR /app

# 빌드 이미지에서 생성된 JAR 파일을 런타임 이미지로 복사
COPY --from=build /app/build/libs/*.jar /app/leafy.jar

EXPOSE 8080 
ENTRYPOINT ["java"] 
CMD ["-jar", "leafy.jar"]

  • 백엔드 컨테이너 빌드 및 실행

    1. 이미지 빌드 및 푸시 (easydocker/leafy/leafy-backend 경로에서 실행)
    • docker build -t (개인레지스트리명)/leafy-backend:1.0.0 .
    • docker push (개인레지스트리명)/leafy-backend:1.0.0
    1. 컨테이너 실행 및 로그 확인
    • docker run -d -p 8080:8080 -e DB_URL=leafy-postgres --name leafy --network leafy-network (개인레지스트리명)/leafy-backend:1.0.0
    • docker logs leafy-backend
    1. API 테스트
    curl http://localhost:8080/api/v1/users
    curl http://localhost:8080/api/v1/plant-logs/1
    
    

Vue.js 프론트엔드 컨테이너 구성

image

  • 프론트 컨테이너 빌드 및 실행
    1. 이미지 빌드 및 푸시 (easydocker/part5/leafy 경로에서 실행)
    • docker build -t (개인레지스트리명)/leafy-frontend:1.0.0 . docker push (개인레지스트리명)/leafy-frontend:1.0.0
    1. 컨테이너 실행 및 로그 확인, localhost 접속 테스트
    • docker run -d -p 80:80 --name leafy-front --network leafy-network (개인레지스트리명)/leafy-frontend:1.0.0 docker logs -f leafy-front

@JungYoonShin JungYoonShin self-assigned this Nov 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant