본문 바로가기
서버구축 (WEB,DB)

Docker 기반 GitLab Runner와 GitHub Actions Runner 구축 CI/CD

by 날으는물고기 2026. 5. 9.

Docker 기반 GitLab Runner와 GitHub Actions Runner 구축 CI/CD

728x90

개발자가 코드를 수정해서 GitLab 또는 GitHub에 올리면, 단순히 저장만 되는 것이 아니라 아래 같은 작업을 자동으로 수행하고 싶어집니다.

- 코드 문법 검사
- 테스트 실행
- Docker 이미지 빌드
- 서버 자동 배포
- Kubernetes 반영
- 보안 스캔
- 취약점 검사
- Slack 알림
- 운영 서버 재시작

이 작업을 자동으로 수행하는 구조가 바로

CI/CD (Continuous Integration / Continuous Deployment)

입니다.

300x250

그리고 실제로 작업을 대신 수행하는 실행기를:

Runner / Agent / Worker

라고 부릅니다.

GitLab CI -> GitLab Runner 가 작업 수행
GitHub Actions -> GitHub Runner 가 작업 수행

예전에는 개발자가 직접 했습니다.

1. 서버 접속
2. git pull
3. docker build
4. docker restart
5. 설정 수정
6. 로그 확인

하지만 문제는

- 사람마다 방식이 다름
- 실수 발생
- 누가 배포했는지 추적 어려움
- 야간 장애 증가
- 보안 점검 누락
- 서버별 버전 차이

같은 문제가 발생합니다.

 

그래서

"코드가 올라오면 자동으로 검증하고 자동으로 배포하자"

라는 개념이 등장했고, 이것이 CI/CD 입니다.

전체 구조 이해

예를 들어 GitLab 기준

개발자
   ↓
Git Push
   ↓
GitLab CI Pipeline 생성
   ↓
GitLab Runner 가 작업 수신
   ↓
Docker Build
   ↓
테스트
   ↓
운영 서버 배포

GitHub도 거의 동일합니다.

GitHub Push
   ↓
GitHub Actions Workflow
   ↓
GitHub Runner
   ↓
빌드 / 테스트 / 배포

GitLab Runner란?

GitLab에서 내려주는 작업을 실제 수행하는 프로그램입니다.

 

예시

build:
  script:
    - docker build -t myapp .

위 작업은 GitLab 서버가 직접 수행하지 않습니다.

 

실제로는

GitLab Runner

가 받아서 실행합니다.

GitHub Actions Runner란?

GitHub Actions의 작업을 실제 수행하는 실행기입니다.

jobs:
  build:
    runs-on: self-hosted

이 작업을 실제 서버에서 수행하는 것이

GitHub Actions Runner

입니다.

Runner를 Docker로 운영하는 이유

원래는 서버에 직접 설치할 수도 있습니다.

 

하지만 Docker를 쓰면

- 설치 간단
- 삭제 쉬움
- 버전 관리 쉬움
- 장애 복구 쉬움
- 여러 Runner 분리 가능
- 운영 표준화 가능

해집니다.

그래서 실무에서는 Docker 기반 운영이 많습니다.

GitLab Runner 특징

GitLab
  ↓
Runner 등록
  ↓
작업 수신

Runner가 GitLab 서버에 등록되어 있어야 합니다.

Docker Build 자동화

script:
  - docker build

Kubernetes 배포

script:
  - kubectl apply -f deploy.yaml

보안 스캔

script:
  - trivy image myapp

서버 자동 배포

script:
  - ansible-playbook deploy.yml

GitHub Actions Runner 특징

GitHub Actions는

Marketplace

생태계가 매우 강력합니다.

 

- uses: actions/checkout@v4
- uses: docker/build-push-action

처럼 다양한 모듈을 쉽게 사용 가능합니다.

둘의 차이

항목 GitLab Runner GitHub Runner
플랫폼 GitLab GitHub
설정파일 .gitlab-ci.yml workflow.yml
생태계 DevOps 중심 오픈소스/Marketplace 강함
Kubernetes 연동 매우 강력 강력
기업 내부 운영 많이 사용 점점 증가
Self-hosted 운영 매우 일반적 일반적
보안 통제 세밀함 상대적으로 단순
Enterprise 기능 강함 강함

실제 운영 목적

1. 자동 배포

가장 대표적입니다.

코드 수정
→ Push
→ 자동 빌드
→ 자동 배포

2. 보안 점검 자동화

보안 관점에서는 매우 중요합니다.

 

- 취약한 라이브러리 탐지
- SAST
- Secret 탐지
- Docker 이미지 스캔
- IaC 스캔

3. 표준화

개발자마다 다른 방식 제거.

"항상 동일한 절차"

로 배포 가능.

4. 감사 및 추적

누가
언제
무엇을
배포했는가

추적 가능.

보안 관점에서 중요한 이유

보안에서는 Runner를:

"자동화된 privileged 작업 서버"

로 봐야 합니다.

 

왜냐하면

- 운영 서버 접근
- Kubernetes 접근
- Docker 제어
- Secret 접근

권한을 가지기 때문입니다.

docker.sock 마운트

많이 사용하는 방식

- /var/run/docker.sock:/var/run/docker.sock

하지만 이것은 사실상

호스트 Docker root 권한 제공

과 유사합니다.

 

악성 Pipeline이 실행되면

- 호스트 파일 접근
- 컨테이너 탈출
- 내부망 접근

가능할 수 있습니다.

보안 권장사항

1. Public 저장소와 분리

절대

외부 PR 처리 Runner

운영 배포 Runner

를 같이 쓰면 안 됩니다.

2. Runner 분리

- build-runner
- deploy-runner
- security-scan-runner

3. 최소 권한

- Kubernetes RBAC 제한
- Docker 권한 최소화
- Secret 최소 제공

4. 네트워크 분리

운영 배포 Runner는

- 내부망 전용
- VPN 내부
- 접근 제한

권장.

실제 실무 구조 예시

개발

Git Push
→ 테스트 Runner

스테이징

테스트 성공
→ Staging 자동 배포

운영

승인 후
→ Production Runner 배포

Docker 기반 GitLab Runner 방식

Docker Compose
   ↓
gitlab-runner 컨테이너 실행
   ↓
GitLab 등록
   ↓
Pipeline 작업 수행

Docker 기반 GitHub Runner 방식

Docker Compose
   ↓
github-runner 컨테이너
   ↓
GitHub 등록
   ↓
Actions 작업 수행

장점

엄청난 자동화

수작업 제거

빠른 배포

몇 초~몇 분 내 반영

재현성

항상 동일 환경

운영 안정성

휴먼 에러 감소

단점

잘못 구성 시 대형 사고 가능

자동 운영 배포 실수

Runner 해킹 위험

특히 self-hosted runner.

Secret 관리 어려움

AWS KEY
SSH KEY
K8S TOKEN

노출 위험.

보안 추천 운영 모델

실무적으로 추천되는 방식

[외부용]
- 테스트 전용 Runner

[내부용]
- 운영 배포 Runner

[보안]
- Security Scan Runner

분리 운영.

보안 자동화 예시

Docker 이미지 스캔

script:
  - trivy image myapp

Secret 탐지

script:
  - gitleaks detect

IaC 스캔

script:
  - checkov -d .

어떤 걸 선택해야 하나?

GitLab Runner 추천

- 내부 기업 환경
- 자체 DevOps
- Kubernetes 중심
- 세밀한 통제 필요

GitHub Actions 추천

- 오픈소스
- 빠른 시작
- Marketplace 활용
- 외부 SaaS 연동

결론

Runner는 단순 자동화 도구가 아니라

"개발 + 운영 + 보안 자동화를 수행하는 핵심 실행 인프라"

입니다.

 

특히 보안 관점에서는

- 권한
- Secret
- 네트워크
- 배포 승인
- 감사 로그

관점까지 포함해 관리해야 합니다.

 

그리고 Docker 기반 Runner는 매우 편하지만

docker.sock
privileged
self-hosted 권한

등으로 인해 사실상

"강력한 자동화 서버"

처럼 취급하고 보호해야 합니다.

728x90
그리드형(광고전용)

댓글