Post

Drone CI와 Portainer를 이용한 CI/CD 구축하기

Drone CI로 이미지를 빌드하고 Portainer로 자동 배포하는 GitOps 기반 CI/CD 파이프라인을 구축하는 방법을 알아봅니다.

Drone CI와 Portainer를 이용한 CI/CD 구축하기

Drone CI 글과 연결되니 한번 읽어보시는 것을 추천합니다.


Portainer란?

Portainer는 Kubernetes, Docker, Swarm 등을 쉽게 배포하고 관리할 수 있는 경량화된 관리 도구예요. 웹 UI를 제공하며, 실행 중인 컨테이너, 이미지, 볼륨 등을 직관적으로 확인하고 관리할 수 있습니다.

Portainer는 Server와 Agent 두 가지 요소로 구성됩니다. 클러스터 내의 각 노드에 Agent를 설치하고, Server는 여러 Agent의 연결을 수용하여 하나의 중앙화된 인터페이스에서 여러 클러스터를 관리할 수 있습니다.

2023-11-24-image1 Portainer 아키텍처 구조


Portainer 설치

Docker Compose로 Server와 Agent를 컨테이너로 띄워요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: '3.2'

services:
  agent:
    image: portainer/agent:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes

  portainer:
    image: portainer/portainer-ce:latest
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - '0.0.0.0:9443:9443'
      - '0.0.0.0:9000:9000'
    volumes:
      - portainer_data:/data

volumes:
  portainer_data:

컨테이너를 시작한 후 브라우저로 접속하면 현재 Portainer Server와 연동된 클러스터들을 볼 수 있어요.

2023-11-24-image2 Portainer 환경 목록

2023-11-24-image3 Docker 환경 대시보드


Stack 생성 및 GitOps 설정

Stack이란 다중 컨테이너 애플리케이션의 묶음입니다. docker-compose로 컨테이너를 여러 개 띄웠을 시 그 여러 개를 합쳐서 하나의 Stack이라고 부릅니다.

Add Stack 버튼을 클릭하고 Stack 정보를 입력해요.

2023-11-24-image5 Stack 생성 화면

주요 설정

  • Build Method: Web editor, Upload, Git Repository 중 선택 (GitOps를 위해 Git Repository 권장)
  • Repository URL: 변경된 사항이 있는지 감지할 저장소 주소
  • username, personal access token: 저장소 인증 정보

Web editor와 upload는 자동배포가 불가능합니다. GitOps를 위해서는 Git Repository 방식을 사용해야 합니다.

Portainer는 Polling 방식(일정 시간마다 저장소 체크)과 Webhook 방식(요청을 받으면 즉시 배포)을 지원합니다. Polling은 유료 기능이므로 Webhook 방식을 사용했습니다.

2023-11-24-image6 자동 배포 설정


CI/CD 파이프라인 동작

Drone CI에서 Docker 빌드가 완료된 후 Portainer Server의 Webhook으로 요청을 보냅니다.

2023-11-24-image7 Drone CI 파이프라인 실행

요청을 받은 Portainer Server는 해당 Stack에서 변경된 이미지가 있는 컨테이너를 확인하여 컨테이너를 새로 띄웁니다.

2023-11-24-image8 Portainer 자동 배포 실행


전체 워크플로우

  1. 코드 Push (Git)
  2. Drone CI 파이프라인 실행
  3. Docker 이미지 빌드
  4. 이미지 레지스트리에 Push
  5. Portainer Webhook 호출
  6. Portainer가 새 이미지로 컨테이너 재배포

Webhook 호출 예시

1
2
3
4
5
6
7
- name: deploy
  image: curlimages/curl
  commands:
    - curl -X POST https://portainer.example.com/api/webhooks/xxxx
  when:
    branch:
      - main

정리

Portainer의 장점은 직관적인 웹 UI, GitOps 기반 자동 배포 지원, 무료 Webhook 배포, 여러 클러스터 중앙 관리입니다. 단점은 Polling 자동 배포가 유료 기능이고, 복잡한 배포 전략(Blue-Green, Canary)은 제한적입니다.

경험상 Jenkins보다 Drone CI가 파이프라인 파일을 명확하게 작성할 수 있어서 좋았습니다. 더 고급 기능이 필요하다면 ArgoCD, Flux, Rancher 등을 고려해볼 수 있습니다.

This post is licensed under CC BY 4.0 by the author.