PortfoGram에 Docker 도입하기!

Mini_me·2023년 6월 16일
0

공부 [Spring]

목록 보기
20/27
post-thumbnail

PortfoGram 프로젝트에서 배포 편의성을 위해 Docker을 도입하기로했습니다.

도입하면서, Docker에 대해 공부하고, 도입한 과정을 블로그에 기록하고 싶어 작성하게되었습니다!

초보 개발자가 작성한 글이기 때문에, 틀린부분은 댓글로 알려주시면 감하겠습니다!

도커(Docker)란? 🤔

도커는 컨테이너 기반의 애플리케이션 배포 및 관리 플랫폼으로, 개발 환경, 라이브러리 등 모든 의존성을 포함한 애플리케이션을 '도커 이미지'로 패키징하여 효율적으로 배포합니다. 이를 통해 개발자들은 컨테이너(structured method to manage dependencies)를 사용해 애플리케이션을 신속하게 배포하고 관리할 수 있습니다. 📦

도커 컨테이너란?

도커 컨테이너는 도커 이미지를 실행한 특정 인스턴스를 의미합니다. 이미지는 애플리케이션 '템플릿'이라고 생각하시면 된다면, 컨테이너는 그 템플릿을 활용해 실행되는 애플리케이션의 '실행 인스턴스'라는 것을 이해하시면 됩니다.
좀 더 쉽게 말하자면, 도커 이미지가 레시피라면, 컨테이너는 그 레시피를 사용해 만든 요리라고 이해하시면 됩니다.

컨테이너의 장점 📦

  • 이식성: Docker 컨테이너는 세상 어디든 갈 수 있어요! 로컬 환경에서든 컨테이너는 서버, 클라우드, 다른 컴퓨터 등 어디든 데려갈 수 있습니다.
  • 경량화: 컨테이너는 호스트와 커널을 공유하므로 경량화되어도 복잡한 애플리케이션도 잘할 수 있습니다.
  • 독립성: 서로 영향 받지 않고 애플리케이션들이 자기 작업만 마음껏 수행할 수 있습니다.

Docker vs VM

컨테이너와 가상머신 (VM)의 차이?

도커 컨테이너는 가상 머신과 비슷한데, 가볍고 빠르게 애플리케이션을 배포할 수 있습니다 ✨
하지만 둘의 차이 또한 존재합니다.
도커 컨테이너와 가상 머신(VM)의 차이는 이렇게 비유할 수 있어요.

  • 가상 머신이란? 대빵 큰 이사를 돕습니다 - 이사 비용(리소스 소모)이 많죠.
  • Docker 컨테이너란? 이사 비용 절감해요 - 이사 비용이 훨씬 적죠.

가상 머신 (VM)

  • 각 VM은 하이퍼바이저를 통해 독립된 가상 하드웨어를 가집니다.
  • VM 내부에는 게스트 운영체제(Guest OS)와 애플리케이션이 포함되어 있습니다.
  • 시스템 리소스가 가화되어 배정되며, 각 VM이 자체 운영체제를 가집니다.
  • 결론적으로, 가상 머신은 서로 독립적이지만 전체 운영체제와 하드웨어 가상화에 의해 더 많은 리소스를 소모하며 성능 저하가 발생할 수 있습니다.

컨테이너 (Docker)

  • 컨테이너는 호스트 운영체제에서 실행되며, 각 컨테이너가 기본 호스트 환경의 일부 자원을 공유합니다(예: 커널).

  • 각 컨테이너에는 필요한 라이브러리, 바이너리, 애플리케이션 코드 등만 포함되어 있습니다.

  • 상대적으로 낮은 오버헤드와 공유 리소스로 더 효율적으로 실행됩니다.

  • 결론적으로, 컨테이너(도커)는 가볍고 이식성이 뛰어난 애플리케이션 배포 방식이며, 호스트 환경에서 빠르고 효율적으로 실행할 수 있습니다. 이 인해 성능이 향상되고, 리소스를 절약하게 됩니다.

🎨 도커 이미지란?

도커 이미지는 애플리케이션과 그 실행을 위한 모든 파일들을 포함하는 컨테이너로 패키징해주어 이식성이 높은 환경을 만들어준답니다.

- 이미지 : 애플리케이션의 '템플릿'
- 컨테이너 : 이미지로부터 실행된 애플리케이션의 '작동 인스턴스'

배포 시작! 🌠

이제 본격적으로 EC2 서버에서 도커를 사용하여 스프링 프로젝트를 배포하는 과정입니다.

1. Git 설정을 통한 소스코드 다운로드 📃

$ git clone https://{git_access_token}@github.com/your_username/your_spring_project_repo.git

2. 프로젝트 빌드 ⚒️

$ cd your_spring_project_repo
$ ./gradlew clean build -x test

3. 📚 도커 이미지 만들기

도커 이미지를 만들기 위해서는 Dockerfile 이라는 특별한 파일을 작성해야 합니다. Dockerfile은 도커 이미지를 꾸미기 위한 규칙과 과정이 담겨있는 스크립트와 같은 것입니다. 여기에는 베이스 이미지, 실행 파일 복사 방법, 포트 설정 등이 포함됩니다.
✍️ Dockerfile 예시:

EXPOSE 8080
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","app.jar"]

Dockerfile을 사용해 도커 이미지를 빌드

도커 이미지 빌드:

$ docker build -t {your_docker_hub_username}/your_spring_project_name:latest .

4. 도커 로그인🚪

$ docker login --username={your_docker_hub_username} --password={your_docker_hub_password}

5. 도커 이미지 푸시 🚀

이제 빌드한 도커 이미지를 도커 허브에 푸시해볼까요?

$ docker push {your_docker_hub_username}/your_spring_project_name:latest

6. EC2에서 도커 컨테이너 배포 및 실행 🚢

docker-compose.yml 파일을 작성합니다.

version: "3.3"
services:
  # MySQL 데이터베이스 서비스 설정
  database:
    # MySQL 이미지 버전 선택
    image: mysql:8.0.30
    # 컨테이너를 항상 재시작하도록 설정
    restart: always
    # 컨테이너 이름 설정
    container_name: database
    # 환경 변수 설정
    environment:
      # 데이터베이스 이름 설정
      MYSQL_DATABASE: your_database_name # 사용자 데이터베이스 이름으로 변경
      # MySQL 루트 비밀번호 설정
      MYSQL_ROOT_PASSWORD: your_mysql_password # 사용자 MySQL 비밀번호로 변경
    # 볼륨 설정
    volumes:
      # 호스트의 ./db 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리를 연결
      - ./db:/var/lib/mysql
    # 포트 맵핑 설정
    ports:
      # 호스트의 3306 포트와 컨테이너의 3306 포트 연결
      - "3306:3306"
    # 네트워크 설정
    networks:
      - springboot-mysql-net

  # 스프링 부트 애플리케이션 서비스 설정
  app:
    # 빌드 설정
    build:
      # 빌드 컨텍스트 (Dockerfile이 위치한 경로)
      context: .
      # 빌드에 사용할 Dockerfile 명시
      dockerfile: Dockerfile
    # 컨테이너를 항상 재시작하도록 설정
    restart: always
    # 포트 맵핑 설정
    ports:
      # 호스트의 8080 포트와 컨테이너의 8080 포트 연결
      - "8080:8080"
    # app 서비스가 database 서비스에 종속되어 있음을 명시
    depends_on:
      - database
    # 컨테이너 이름 설정
    container_name: YourAppName # 사용자 앱 이름으로 변경
    # 환경 변수 설정
    environment:
      # 스프링 데이터 소스 URL 설정
      SPRING_DATASOURCE_URL: jdbc:mysql://your_ec2_public_ip:3306/your_database_name?characterEncoding=UTF-8&serverTimezone=Asia/Seoul # 사용자 정보로 수정
      # 데이터베이스 사용자 이름 설정
      SPRING_DATASOURCE_USERNAME: your_database_username # 사용자 데이터베이스 사용자 이름으로 변경
      # 데이터베이스 비밀번호 설정
      SPRING_DATASOURCE_PASSWORD: your_database_password # 사용자 데이터베이스 비밀번호로 변경
    # 네트워크 설정
    networks:
      - springboot-mysql-net

# 도커 컴포즈 네트워크 설정
networks:
  springboot-mysql-net:
    # 브리지 드라이버 사용
    driver: bridge
docker-compose.yml 파일의 경로로 이동한 후, docker-compose up -d 명령어를 실행하여 배포를 시작하면 됩니당!
$ docker-compose up -d

배포 완료!

0개의 댓글