Inflearn brand logo image

인프런 커뮤니티 질문&답변

이수현님의 프로필 이미지
이수현

작성한 질문수

비전공자도 이해할 수 있는 CI/CD 입문·실전

Docker Compose파일을 작성했을때 CI CD와의 연동

작성

·

23

0

현재 강의에서는 간단한 instagram-server 프로젝트를 docker에 이미지화 시켜서 이를 ecr에 연결해 이미지를 업로드하고 ec2에서 이미지를 다운받아 실행하고 배포하는 것을 잘 이해했습니다.

하지만 혹시 간단한 프로젝트가 아닌 MSA의 각 서비스들, Kafka, Redis가 모두 모인 프로젝트 일때에는 각 서비스, kafka, redis 모두 이미지로 만들어야하는 것으로 알고 있습니다. 이때 한번에 docker compose 파일을 만들면 될 것 같지만 이를 CI CD의 deploy.yml에 어떻게 연결짓는 것인지가 궁금합니다. 아니면 혹은 cmopose 파일을 github action에 직접 입력해서 수동으로 관리하는 것인가요?

불편하게 그저 각 서비스, redis, kafka를 deploy.yml에 작성해서 일일이 하면 편하긴 하겠지만 이런 경우는 보통 compose 파일을 만드는 것이 훨씬 장점이 있다고 생각합니다. 이 compose 파일을 어떻게 deploy.yml 혹은 EC2에 보내는 것인지 궁금합니다.

답변 2

0

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 수현님! 질문 너무 잘 해주셨어요!

질문해주신 Docker Compose와 CI/CD 연동 방법에 대해 정리하며 답변드려볼게요~

 

우선 말씀하신 대로 각 서비스를 deploy.yml에 일일이 나열하는 것보다

Compose를 사용하는 게 서비스 간 네트워킹, 의존성 관리 측면에서 훨씬 편리해요 !!

핵심은 프로젝트 루트에 docker-compose.yml 파일을 함께 커밋하는 거예요!

이 파일에 수현님의 애플리케이션 서비스, Kafka, Redis 등 필요한 모든 서비스를 정의해두면,

GitHub Actions에서 코드를 체크아웃할 때 Compose 파일도 함께 가져와서 활용할 수 있어요!

실제 CI/CD 과정은 아래와 같이 이렇게 동작하죠 !

[1] GitHub Actions에서 여러분의 애플리케이션만 빌드해서 ECR에 푸시

[2] SSH로 EC2에 접속한 다음, 기존 컨테이너들 종료

[3] SCP로 EC2에 compose.yml 파일 전송

[4] "개별 docker run 명령어 대신 docker compose up 실행!"

중요한 포인트는 혼합 구성이에요!

- 수현님이 개발한 서비스들: ECR 이미지 사용

- Kafka, Redis: Docker Hub의 공식 이미지 사용

- Compose 파일에서 환경 변수로 ECR 레지스트리 주소나 이미지 태그를 동적으로 주입

 

"github actions에 직접 입력해서 수동으로 관리하는 것인가요?"

-> GitHub Actions에 직접 입력하는 방식은 권장드리지 않아요!

Compose 파일이 길어지면 deploy.yml이 너무 복잡해지거든요 ~

프로젝트에 포함시켜서 버전 관리하는 게 훨씬 깔끔해요!

 

"compose 파일을 어떻게 deploy.yml 혹은 EC2에 보내는 것인지 궁금합니다."

-> GitHub Actions에서 docker-compose.yml 파일을 EC2로 전송하는 방식을 사용해요 !

그 다음, EC2에서 docker compose up 명령어를 실행을 하는거죠 !

 

궁금한 점 더 있으시면 언제든 질문 남겨주세요~~

이수현님의 프로필 이미지
이수현
질문자

감사합니다! 혹시 그럼 compose 파일을 ec2로 scp 방식으로 전송한 다음에는 EC2 인스턴스 실행 창에서는 build를 하고 실행만 시키면 되는것인가요?

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

EC2 인스턴스에서는 빌드 과정 따로 없이

docker compose up 명령어만 실행시키시면 됩니다!

왜냐면 compose.yml 파일에 의해서

이미 빌드된채로 도커 이미지로 업로드 되어 있는 걸

바로 pull 당겨서 실행시키기 때문이에요:)

이 과정 중에 이해 안 되시는 점 있으시면 또 댓글 남겨주세요~~

0

안녕하세요, 인프런 AI 인턴입니다. 이수현님.

MSA 방식의 프로젝트에서 각 서비스, Kafka, Redis 등을 한 번에 Docker Compose 파일로 관리하고 이를 CI/CD 파이프라인에 통합하는 방법에 대한 질문을 주셨군요. Docker Compose와 CI/CD를 통합하여 관리하는 방법은 프로젝트의 복잡도와 배포 환경에 따라 다르게 구성할 수 있습니다.

Docker Compose와 CI/CD의 통합 방법

  1. Docker Compose 파일 작성:

    • 모든 서비스(Kafka, Redis 포함)를 정의하는 docker-compose.yml 파일을 만듭니다. 이 파일은 전체 프로젝트의 컨테이너 설정과 서비스를 정의하므로 프로젝트의 루트 디렉토리에 두는 것이 일반적입니다.
  2. GitHub Actions와 CI/CD 통합:

    • deploy.yml 파일은 GitHub Actions와 같은 CI/CD 도구의 파이프라인을 정의하는 데 사용됩니다.

    • 다음은 docker-compose.yml을 CI/CD 파이프라인에 포함시키는 방법입니다:

      • Docker Compose 실행 단계 추가: deploy.ymldocker-compose 명령어를 포함시켜, 배포 단계에서 해당 명령어를 실행하도록 합니다.
      • 예제:
      jobs:
       build-and-deploy:
         runs-on: ubuntu-latest
         steps:
             - name: Checkout code
           uses: actions/checkout@v2
      
             - name: Login to DockerHub
           run: echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
      
             - name: Pull Docker Images
           run: docker-compose pull
      
             - name: Deploy
           run: docker-compose up -d
      
  3. CI/CD 파이프라인으로 배포:

    • docker-compose.yml 파일이 포함된 리포지토리를 CI/CD 파이프라인에서 읽어 들이도록 설정합니다. 이렇게 하면 GitHub Actions나 다른 CI/CD 도구에서 최신 코드와 함께 docker-compose.yml 파일을 자동으로 참조하고 실행할 수 있습니다.
  4. EC2에서의 실행:

    • AWS EC2 인스턴스에서 도커가 설치되어 있고 적절한 권한이 부여되어 있어야 합니다.
    • 배포 시에는 위의 CI/CD 파이프라인 내의 docker-compose 명령을 실행하여 EC2 인스턴스에서 Docker Compose 파일을 통해 컨테이너를 실행합니다.

요약

기본적으로 docker-compose.yml 파일을 Git의 코드베이스의 일부로 관리하며, CI/CD 파이프라인을 통해 자동으로 EC2 등 운영 서버에 배포하는 방식으로 처리합니다. CI/CD 툴에서 docker-compose 명령을 실행해 서비스가 종속성에 맞게 배포되도록 설정하면 수동 작업의 필요성을 줄이고, 자동화된 배포를 관리할 수 있습니다.

아래 유사한 질문에서 더 많은 정보를 얻을 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이수현님의 프로필 이미지
이수현

작성한 질문수

질문하기