inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

94

이수현

작성한 질문수 11

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에 보내는 것인지 궁금합니다.

aws docker ci/cd github-actions aws-code-deploy infrastructure aws-ec2

답변 2

0

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 명령어를 실행을 하는거죠 !

 

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

0

이수현

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

0

JSCODE 박재성

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

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

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

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

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

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

0

인프런 AI 인턴

안녕하세요, 인프런 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 명령을 실행해 서비스가 종속성에 맞게 배포되도록 설정하면 수동 작업의 필요성을 줄이고, 자동화된 배포를 관리할 수 있습니다.

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

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

무중단 배포

0

52

2

workflows/deploy.yml 궁금증

0

45

2

.git-credentials 파일이 없이 배포가 성공한 이유가 궁금

0

54

1

(해결 - 정보공유) /home/runner/work/_temp/6be6e~0.sh: line 1: ./gradlew: Permission denied 오류

1

60

2

(확인 완료) git config --global creadential.helper store 후에도 비밀번호 물어보는 현상

1

68

2

질문_ 강의 순서 및 그외

0

67

2

섹션 4 - Docker + 백엔드(Spring Boot)

0

60

2

deploy.yml작성후 원격에 push불가

0

60

2

CodeDeploy 사용시 registration 요구

0

100

3

스프링 종료 명령어

0

66

2

RAM & 스왑메모리 폭증하는 문제

0

100

2

섹션 4, 5와 6, 7은 유사한가요?

0

64

1

code deploy 배포입니다.

0

97

3

사용자 삭제가 안되는 이유

0

83

2

이미지 pull중 no basic auth credentials 문제입니다.

0

112

2

보안그룹 생성 오류

0

82

3

AWS 5월에 탈퇴해서 그러는데....

0

79

1

배포 오류

0

78

2

node.js 설치시 에러

0

146

2

appspec.yml, 스크립트 파일 수정요청

0

81

2

appleboy/ssh-action stop_script 대체

1

178

2

Vue.js 파일 배포

0

59

2

aws를완강하고 ci/cd로 넘어왔습니다.

0

81

1

vue.js 를 cloudfront+s3+Route53를 적용하여 배포

0

107

2