Docker(+ec2를 이용한 docker배포)

SunYerim·2024년 6월 15일
3

개발

목록 보기
2/2

ssafy 1학기와 2학기 중간 기간에 예전에 작업해뒀던 프론트엔드 프로젝트에 백엔드 부분을 스스로 작업해보며 심화적으로 공부중인데, 제가 맡은 파트를 간단하게 발표하기로해서 이렇게나마 정리를 한 번 해봅니다 🙂

저희는 이번에 msa구조로 프로젝트를 설계하였으며, 제가 백엔드 개발은 물론 프로젝트 배포 및 ci/cd 파이프라인 구축 등 인프라쪽도 함께 담당하게 되었습니다. docker도 사용해본적이 없었고, 항상 모놀라식 구조로 개발해왔던 터라 공부할 게 정~말 많았던 것 같습니다 ..

용어 정리

  • Docker
    • 단일 컨테이너를 관리하는 것
    • 커맨드 라인에서 명령어를 실행할 수 있다.
  • Docker-compose
    • yml파일 기반으로 여러개의 컨테이너를 정의하고 실행하기 위한 도구이다.
    • yml파일에 명령어를 적어서 컨테이너를 정의하고 관리한다.
    • 여러 컨테이너가 서로 어떻게 상호작용을 하는지, 네트워크와 볼륨 설정은 어떻게 되어야하는지 등을 정의한다.
    • ex. 하나의 was, db서버, 캐시 서버 등을 각각 다른 컨테이너로 실행하고 이들이 함께 동작하도록 Docker compose를 사용하여 구성할 수 있다.
  • Dockerfile
    • 쉽게 설명하자면, Docker 이미지를 생성하기 위한 ‘설계도’와 같은 것이다.
    • 컨테이너가 어떻게 작동해야 하는지에 대한 지시사항이 담겨 있다.
    • 운영체제, 실행할 코드, 필요한 라이브러리 및 환경 변수 설정 등을 포함하여 특정 애플리케이션을 실행하는 데 필요한 모든 것의 정의한다.
  • DockerHub
    • 도커 이미지를 저장, 공유, 배포하는 데 사용되는 플랫폼
    • 도커 이미지를 위한 저장소
    • github는 소스 코드를 위한 저장소라면, dockerhub는 도커 이미지를 위한 저장소

차이점

  • Dockerfile은 단일 이미지를 구축하는 데 집중하는 반면, Docker compose는 여러 컨테이너의 구성과 관리에 초점을 맞춘다.
  • Dockerfile은 한 컨테이너 내부의 설정에 관한 것이며, Docker compose는 여러 컨테이너가 어떻게 함께 동작해야하는지에 대한 외부 설정을 다룬다.
💡 즉, `Dockerfile은 컨테이너를 만드는 방법을 정의, Docker Compose는 여러 컨테이너를 어떻게 함께 운영할지를 정의`

사용방법

우선 msa방식으로 프로젝트를 진행하기 위해 기능별로 깃허브 레포지토리를 생성해두었습니다. 이에 따라 각각의 기능을 도커 컨테이너로 띄우기로 하였습니다.

이미 ec2 인스턴스에 서버를 배포해둔 상태이므로, 이 ec2서버에 도커 컨테이너들을 배포하는 작업을 진행하였습니다.

도커 컨테이너를 ec2 서버에 배포하는 과정은 아래와 같습니다. 로컬에서 이미지를 생성하여 ec2 서버에 배포하는 과정을 단계별로 간략하게만 적어뒀는데 혹시나 틀린 게 있다면 .. 알려주세요!

  • 로컬에서 Docker image를 생성하고, 해당 이미지를 Docker Hub에 푸시
  • ec2 인스턴스 만들기 (컴퓨터를 빌리기)
  • ec2 접속하기 (컴퓨터 접속하기)
  • Docker-compose 설치하기
  • 빌린 컴퓨터에서 깃을 통해 필요한 파일 docker-compose.yml 을 다운로드 받기
    • 이때, ssh로 서버에 접속했을때, 해당 git 레포지토리를 clone해주면 됩니다.
  • Docker-compose로 컨테이너를 실행한다.
  • 네트워크 설정(보안그룹 설정)으로 포트를 열어주어, 외부에서 접속 가능하도록 해준다.

  1. 도커 이미지 생성
  • Dockerfile을 작성하고 이를 바탕으로 도커 이미지를 생성한다.
# Dockerfile
FROM openjdk:17
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
# -t 도커 레지스트리 주소/이미지 이름:태그 .
docker build -t sunyerim/sunjoo:drinktionary .
  1. 도커 이미지 푸시
  • 지정한 도커 레지스트리로 이미지를 푸시한다. Docker Hub를 사용하였다.
docker push sunyerim/sunjoo:drinktionary
  1. ec2 인스턴스에서 깃 클론
  • ec2 인스턴스에 ssh로 접속하여 깃허브 레포지토리를 클론한다.
  1. Docker-compose를 사용하여 이미지를 다운로드 받고, 컨테이너 실행

    • 클론한 레포지토리 내의 docker-compose.yml파일을 사용하여 컨테이너를 실행한다.
    sudo docker-compose up -d
    # docker-compose.yml
    version: '3.8'
    services:
      auth:
        image: sunyerim/sunjoo:auth
        container_name: sunjoo-server-auth
        restart: always
        ports:
          - "8080:8090"
        networks:
          - app-network
    
      redis:
        image: redis:latest
        container_name: redis
        restart: always
        ports:
          - "6379:6379"
        networks:
          - app-network
    
    networks:
      app-network:
    

    여기에 볼륨 마운트와 같은 설정도 추가하면 되는데, 저는 추후에 작업을 더 진행하면서 작성할 것 같습니다.


사실, 개념들과 구조를 공부하는데 시간이 조금 소요됐지 한 번 해보고 나니까 금방금방하더라구요.

그리고 저희는 Github actions를 사용하여 CI/CD 파이프라인을 구축하였는데, CI/CD 파이프라인은 코드 변경 사항이 자동으로 빌드, 테스트, 배포되는 일련의 과정을 의미합니다.

Jenkins와 Github actions 중 무엇을 써야할지 고민도 많이 했었고, 결국 Github Actions를 채택하여 사용했는데, 추후에 정리를 해보도록 하겠습니다 .🙂

profile
내 안에 있는 힘을 믿어라.

2개의 댓글

comment-user-thumbnail
2024년 6월 17일

좋은 글 잘 읽었습니다 ^.^7

답글 달기
comment-user-thumbnail
2024년 6월 17일

도움 많이 됐습니다.

답글 달기