Docker - CI/CD (Continuous Integration and Continuous Deployment)

INHEES·2025년 1월 8일

금일은 Devops 의 docker 가상화 파트에서 docker 컨테이너를 활용한 ci/cd 환경 구성에 대해 알아보겠습니다.

목차

  • ci/cd 환경을 위한 docker 컨테이너 활용
  • 상용 클라우드에서의 애플리케이션 배포와 관리
  • 관리현 컨테이너 서비스 사용

CI/CD 환경에서의 Docker 컨테이너 활용

DevOps vs CI/CD

DevOps : 개발과 운영에 환경을 지속적으로 연결시켜주어 더 나은 환경을 제공해 주는 것

CI/CD : 완성되어저 있는 결과물을 위해 지속적인 통합과 배포를 의미 하는 것

Devops 환경에서의 Docker 의 활용

  • 사용자와 끊임 없이 interaction 하면서 서비스를 개선해 나가는 일련의 과정, 문화

해당 그림에서 DOCKER 가 차지하는 위치는 배포와 운영단계에 위치합니다.

CI/CD 자동화 배포

해당 그림은 AMAZON 에서 제공하는 그림입니다.

CI/CD 의 흐름은 CI 를 통해 배포상태를 완성하고 다양한 서버에 전달하는 CONTINUOUS DELIVERY, 실행할 수 있는 상태로 만드는 CONTINUOUS DEPLOYMENT 가 있다.

STAGING 상태는 TEST 직전상태로 의미하며 UAT 단계 (USER TEST) 라고도 합니다.

PRODUCTION 상태는 말 그대로 운영 상태를 의미합니다.

BUILD 상태는 SOURCE CODE 를 가지고 TEST를 진행하여 실행 가능한 형태로 패키징 단계를 의미합니다.

SOURCE CONTROL 상태는 형상 관리 도구를 이용하여 COMMIT 이 완료된 상태를 의미합니다.

해당 CI/CD 파이프라인에서 도커가 차지하는 부분은 BUILD, DEPLOYMENT, OPERATE 에 위치합니다.

CI/CD 환경과 DOCKER

ANSIBLE과 TERRAFORM 같은경우는 어떠한 형태로 INFRA 로 구성되어있는 부분을 CODE 로 관리하며 서비스의 업그레이드 및 설치를 도와주는 시스템입니다.

해당 부분을 거치지 않고 DOCKER RUNTIME 에 배포하는것도 물론 가능합니다.

CI/CD PIPELINE

Orchestration, SourceCode, CI/CD 작업 도구, Registry(harbor) 가 연결되어 있는 모습을 볼 수 있습니다.

ArgoCD 는 k8s 에 배포하기 위해 서비스로 deploy 작업을 진행합니다. angocd sync command 를 활용하여 프로젝트의 자료를 가져올 수 있습니다.


Cloud 환경에서의 서비스 배포

cloud service 로는 다음 3가지 존재합니다.

  • SaaS
    - software 형태의 서비스 제공
    - Marketplcae, Custom Packagin, cdn & cds
  • PaaS
    - platform 형태의 서비스 제공
    - App Deployment, Auto-Scaling & Clustering, ci/cd automation, container orchestration
  • IaaS
    - infra structure 서비스 제공
    - Containers, Virtual Machines, Network, Storage

Docker 의 형태는 PaaS 형태 입니다.

상용 클라우드를 제공해주는 다양한 벤더로는 aws, azure, google cloud platform, naver cloud platform 등이 있다.


AWS 환경에서의 관리형 컨테이너 서비스

ecr 로 부터 이미지를 전달하게 되면 deploy 를 통해 docker 가상화 기술을 제공하는 ecs 를 활용하여 container cluster를 구성한 후에 container 동작을 의미하는 task 를 등록후ecr 로 부터 해당 이미지를 받아오는 new ecs task 를 실행하게 됩니다.

ecs 는 orchestration tools 로써 컨테이너의 생성과 종료, 자동 배치 및 복제, 로드 밸렁싱, 클러스터링, 장애복구, 스케줄링 다양한 기능을 제공합니다.

그림에서 보이듯이 lb, sm, efs 등 다양한 configuration 설정 파일을 제공하며 여러 형태의 서비스를 제공합니다. 대표적으로 ec2, fargate, outposts 등이 있습니다.


실습에 앞서

aws ecr 사용

  1. IAM 생성

    • AmazonEC2ContainerREgistryFullAccess
  2. ecr 생성

    • private Repository
  3. Docker Image 빌드
    3.1. docker client 인증(host 에 aws cli command 설치)

    $ aws ecr get-login-password –region<REGION> | \
    docker login --username <USER> --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com

    해당 명령어는 host pc 에서 aws ecr 에 로그인 하며 로그인의 결과를 docker 에도 사용 가능하게 한다는 의미로

    간단하게 말해서 host pc 에서 private repository 를 사용가능하게 인증 권한을 가져오겠다는 의미입니다.

    3.2 docker 이미지 빌드

    docker build -t <Image_name> .
  4. Docker Iamge Push
    4.1 tag 명 설정

    docker tag <image_name>:<tag> <new_image_name>:<new_tag>

    4.2 docker Image push

    docker push <image_name> . <tag>
  5. docker image pull

    • docker image pull

aws 실습 (ecr)

aws cli 설치

보안 자격 증명

  • aws 오른쪽 상단의 보안 자격 증명에서 엑세스 키를 발급 받는다.
  • access key 값은 확인 가능하지만 secrets key 값은 발급 당시에만 확인 가능하니 다른곳에 저장하기 바랍니다.

aws cli 접속

  • 아래의 명령어 입력을 통해서 aws cli 를 사용할 수 있게 됩니다.

ecr repository 생성

  • repository 가 생성하면 푸시 명령 보기를 통해서 운영체제별 푸시 명령어를 확인할 수 있습니다.


ecs 실습

실습 순서

  • ecs cluster 정의
  • ecs 작업 정의
  • ecs 작업 생성
  • ecs 서비스 생성

실습으로는 aws fargate(serverless) 클러스터를 생성하며 network 는 awsvpc 를 선택하며 추가로 ec2 는 사용한 리소스 만큼 요금을 내며 자체 관리형을 구축하고자 할때 선택하면 된다.

ecs 작업 정의로는 ecsTaskExecutationRole 역할 생성 후 bridge, awsvpc 를 선택 한 후 작업에 할당 될 메모리와 cpu 총량을 선택한 뒤 컨테이너를 포트 매핑을 통해 추가시켜준다.

그 다음에는 ecs 작성 생성으로 용량 공급자는 fargate, 애플리케이션 유형은 task, 패밀리는 전 단계에서 생성한 작업을 선택합니다.

마지막으로는 ecs 서비스 생성으로 용량공급자는 fargate, 애플리케이션 유형은 service, 패밀리는 전 단계에서 생성한 작업을 선택합니다.

그럼 지금부터 위의 순서에 맞게 이미지를 통해 실습 내용을 알아보겠습니다.

  • cluster 생성

  • task 생성
    - 이미지 url 같은 경우는 ecr repository 의 url 을 가져오면 됩니다.

  • service 생성

    • 앱 어플리케이션의 경우 서비스, 배치 형태의 작업은 태스크를 선택합니다. 저희는 서비스를 선택하겠습니다.

    • 배포 구성에 있어서 패밀리는 전에 생성한 task 를 선택합니다.

    • lb 를 테스트 하기위해 우너하는 테스크는 그림과 다르게 2를 선택합니다.

    • 네트워킹의 옵션으로는 가용 가능한 vpc 와 3개정도의 subnet 을 선택합니다.

    • 2개의 컨테이너를 생성하기 때문에 즉 tomcat 서버가 2개가 기동되기 때문에 각각의 주소가 동적으로 변경되기 때문에 사용자는 해당 서버를 알수 없기 때문에 lb 가 필요하게 된다.

    • 대상그룹의 경우 default 값인 현재 task service 들을 선택합니다.

    • 설정은 여기까지 후 서비스를 생성해준다.

  • 다음과 같이 생성한 서비스의 태스크에서 2개의 tomcat 서버를 볼 수 있습니다.
  • 각각의 태스크로 부터 8080 포트로 접근가능한 url 이 확인 가능하며 alb 로 부터 80 포트로 적용된 dns 로 접속 가능한 두가지의 url 을 확인 가능합니다.


profile
이유를 찾아보자

0개의 댓글