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

라즈베리파이(Raspberry Pi)에서 Ubuntu, Docker, Jenkins CI/CD 환경 구축하기

by 날으는물고기 2025. 3. 22.

라즈베리파이(Raspberry Pi)에서 Ubuntu, Docker, Jenkins CI/CD 환경 구축하기

728x90

라즈베리파이(Raspberry Pi)란?

라즈베리파이(Raspberry Pi)는 영국의 라즈베리파이 재단에서 개발한 소형 싱글보드 컴퓨터(SBC)입니다. 저렴한 가격과 저전력 소비, 다양한 확장성과 높은 활용성 덕분에 교육, IoT, 홈서버, 로봇 등 다양한 용도로 사용됩니다.

Raspberry Pi computers and microcontrollers

1. 라즈베리파이 모델 및 사양

(1) 최신 및 주요 모델

라즈베리파이에는 여러 모델이 있으며, 성능과 용도에 따라 구분됩니다.

모델 CPU RAM 저장장치 네트워크 USB 기타
Raspberry Pi 5 Cortex-A76 2.4GHz (쿼드코어) 4GB/8GB LPDDR4X microSD (PCIe 2.0 지원) 2.5GbE 이더넷, Wi-Fi 6, BT 5.0 USB 3.0 x2, USB 2.0 x2 PCIe Gen2, 40핀 GPIO
Raspberry Pi 4 Cortex-A72 1.5GHz (쿼드코어) 2GB/4GB/8GB LPDDR4 microSD 기가비트 이더넷, Wi-Fi 5, BT 5.0 USB 3.0 x2, USB 2.0 x2 40핀 GPIO, 듀얼 4K 출력
Raspberry Pi 3 B+ Cortex-A53 1.4GHz (쿼드코어) 1GB LPDDR2 microSD 기가비트 이더넷, Wi-Fi 4, BT 4.2 USB 2.0 x4 40핀 GPIO
Raspberry Pi Zero 2 W Cortex-A53 1GHz (쿼드코어) 512MB LPDDR2 microSD Wi-Fi 4, BT 4.2 USB 2.0 (OTG) 초소형 폼팩터, 40핀 GPIO

2. 우분투 설치 가능 여부

라즈베리파이에서는 공식적으로 Ubuntu ServerUbuntu Desktop을 지원합니다.
특히, Raspberry Pi 4 / 5 이상의 모델에서 Ubuntu 22.04 LTS 이상을 원활하게 사용할 수 있습니다.

(1) 설치 가능한 우분투 버전

  • Ubuntu Server 22.04 / 20.04 LTS (CLI 환경, 가벼움)
  • Ubuntu Desktop 22.04 / 23.10 (GUI 포함, 성능 요구됨)
  • Ubuntu Core (IoT 용)

(2) 우분투 설치 방법

① 설치 준비

  • microSD 카드(최소 16GB, 권장 32GB)
  • Raspberry Pi Imager (공식 설치 도구)
  • 라즈베리파이 및 전원 어댑터

② 설치 과정

  1. Raspberry Pi Imager 다운로드 및 실행또는 공식 홈페이지에서 다운로드 가능
    sudo apt update && sudo apt install rpi-imager -y
  2. 운영체제 선택
    • Choose OS > Other general purpose OS > Ubuntu
    • Ubuntu Server 22.04 LTS (64-bit) 선택
  3. 저장 장치 선택
    • Choose Storage > microSD 카드 선택
  4. 설정 및 굽기
    • Write 버튼을 눌러 Ubuntu 설치 이미지를 microSD에 기록
    • 완료 후 SD 카드를 라즈베리파이에 삽입하고 부팅
  5. 초기 설정
    • SSH 접속 가능: ssh ubuntu@<라즈베리파이 IP>
    • 기본 계정: ubuntu
    • 초기 비밀번호: ubuntu (처음 로그인 시 비밀번호 변경 필요)

3. 도커(Docker) 구동 가능 여부

라즈베리파이는 ARM 아키텍처를 사용하므로 ARM용 Docker를 설치해야 합니다.
특히, Raspberry Pi 3, 4, 5에서는 Docker를 원활하게 사용할 수 있습니다.

(1) Docker 설치

  1. 패키지 업데이트
    sudo apt update && sudo apt upgrade -y
  2. 필요 패키지 설치
    sudo apt install -y \ apt-transport-https ca-certificates curl software-properties-common
  3. Docker 공식 GPG 키 추가
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  4. Docker 리포지토리 추가
    echo \
    "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. Docker 패키지 설치
    sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
  6. Docker 서비스 시작 및 활성화
    sudo systemctl enable --now docker
  7. 사용자를 Docker 그룹에 추가 (선택)
    sudo usermod -aG docker $USER newgrp docker
  8. 설치 확인
    docker version docker run hello-world

4. Docker Compose 설치

Docker Compose는 여러 컨테이너를 한꺼번에 관리하는 도구입니다.

  1. Docker Compose 바이너리 다운로드
    sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. 실행 권한 부여
    sudo chmod +x /usr/local/bin/docker-compose
  3. 버전 확인
    docker-compose --version

5. Docker 컨테이너 실행 예제

(1) Nginx 컨테이너 실행

docker run -d --name webserver -p 80:80 nginx
  • -d: 백그라운드 실행
  • --name webserver: 컨테이너 이름 설정
  • -p 80:80: 호스트 포트 80 → 컨테이너 포트 80 매핑

(2) Docker Compose로 여러 서비스 실행

docker-compose.yml 파일 생성

version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

컨테이너 실행

docker-compose up -d
기능 가능 여부
Ubuntu 지원 O (Ubuntu Server 및 Desktop 가능)
Docker 지원 O (ARM64 기반 Docker 지원)
Kubernetes (K3s) O (경량 Kubernetes 배포 가능)
IoT / 서버 활용 O (홈 서버, AI, 네트워크 장비 등 가능)

라즈베리파이는 작은 크기지만 강력한 성능을 제공하며, Ubuntu와 Docker를 통해 다양한 서버 및 클라우드 환경을 구축할 수 있습니다. 특히, 최신 Raspberry Pi 5는 성능이 대폭 향상되어 홈서버나 AI, 클러스터 환경에서도 활용할 수 있습니다.

 

라즈베리파이(Raspberry Pi)에서 CI/CD 환경을 구축하는 방법으로, Docker와 Jenkins를 사용하여 자동 빌드 및 배포 환경을 설정합니다.

1. 사전 준비

필요한 장비 및 환경

  • 라즈베리파이 4 (또는 3) + microSD 카드 (32GB 이상 권장)
  • 라즈비안(Raspberry Pi OS, 64-bit 권장) 또는 Ubuntu 22.04 (ARM64)
  • 인터넷 연결 (유선 또는 Wi-Fi)
  • SSH 접속 활성화 (raspi-config에서 설정 가능)

필요한 패키지 설치

sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl wget

2. Docker 설치 및 설정

Jenkins를 컨테이너에서 실행할 것이므로 Docker를 먼저 설치합니다.

Docker 설치 (ARM64 지원 버전)

curl -fsSL https://get.docker.com | sudo bash

설치가 완료되면, Docker 데몬을 실행 및 활성화합니다.

sudo systemctl enable --now docker

현재 사용자(pi 또는 ubuntu)를 docker 그룹에 추가하여 root 없이 사용할 수 있도록 설정합니다.

sudo usermod -aG docker $USER
newgrp docker

Docker 실행 테스트

docker run hello-world

정상적으로 실행되면 Docker가 정상적으로 설치된 것입니다.

3. Docker Compose 설치

Jenkins와 함께 여러 컨테이너를 실행하기 위해 docker-compose를 설치합니다.

sudo apt install -y python3-pip
sudo pip3 install docker-compose

버전 확인

docker-compose --version

4. Jenkins 설치 및 실행 (Docker 기반)

Jenkins는 ARM 기반의 라즈베리파이에서도 실행할 수 있도록 공식 Docker 이미지를 제공합니다.

Jenkins Docker 컨테이너 실행

docker run -d \
  --name jenkins \
  --restart unless-stopped \
  -p 8080:8080 -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  jenkins/jenkins:lts

이제 Jenkins가 8080 포트에서 실행됩니다.

Jenkins 초기 설정

  1. 웹 브라우저에서 http://<라즈베리파이 IP>:8080 접속
  2. 초기 관리자 비밀번호 확인
    docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
  3. 플러그인 설치 후 관리자 계정 생성

5. CI/CD 파이프라인 구성

Git & Docker 연동

라즈베리파이에서 코드 빌드 및 배포를 자동화하기 위해 Git과 Docker를 연동합니다.

  1. Jenkins에서 Git 플러그인 설치
    • Manage JenkinsManage PluginsAvailable에서 Git Plugin 설치
  2. Git 저장소 클론
    git clone https://github.com/your-repo/project.git
  3. Jenkins Pipeline 예제 (Jenkinsfile)
    Jenkinsfile을 프로젝트 루트에 추가
    pipeline {
        agent any
    
        stages {
    
            stage('Clone Repository') {
                steps {
                    git url: 'https://github.com/your-repo/project.git'
                }
            }
    
            stage('Build Docker Image') {
                steps {
                    sh '''
                        docker build \
                            --tag my-app:latest \
                            .
                    '''
                }
            }
    
            stage('Deploy Docker Container') {
                steps {
                    sh '''
                        docker run -d \
                            --name my-app \
                            --publish 80:80 \
                            my-app:latest
                    '''
                }
            }
    
        }
    }
  4. Jenkins에서 Pipeline Job 생성
    • New ItemPipeline 선택
    • Pipeline script from SCMGit → 저장소 URL 입력

6. CI/CD 테스트

  1. Jenkins에서 Build Now 실행
  2. docker ps 명령어로 컨테이너 확인
  3. 웹 브라우저에서 http://<라즈베리파이 IP> 접속하여 배포된 애플리케이션 확인

7. 자동화 개선 (Webhook & GitHub Actions 연동)

GitHub이나 GitLab에서 코드 변경 시 자동으로 Jenkins 빌드가 실행되도록 Webhook을 설정할 수 있습니다.

  • GitHub: SettingsWebhooksPayload URLhttp://<Jenkins IP>:8080/github-webhook/
  • GitLab: Integrations에서 Jenkins CI 활성화

8. 보안 및 최적화

  • Jenkins 보안 강화: 기본 관리자 비밀번호 변경, SSH 키 인증 설정
  • 리소스 절약: 컨테이너 리소스 제한 (--memory 512m 등)
  • 자동 정리: docker system prune -af 로 불필요한 이미지/컨테이너 정리

 

이제 라즈베리파이에서 Docker와 Jenkins를 활용한 CI/CD 환경을 구축했습니다. 라즈베리파이를 활용하여 CI/CD 환경을 구축할 때 점검하고 관리해야 할 보안관점의 가이드 및 점검포인트입니다.

라즈베리파이 기반 CI/CD 환경의 보안 가이드 및 점검포인트

1. 기본적인 보안 설정 점검

  • 기본 계정과 비밀번호 변경 필수
    • 설치 직후 기본 계정(ubuntu 또는 pi)의 비밀번호를 강력한 비밀번호로 즉시 변경할 것
    • SSH 접속 시 root 직접 로그인 금지(PermitRootLogin no 설정)
    passwd ubuntu
    sudo nano /etc/ssh/sshd_config
    # PermitRootLogin no 설정 추가
    sudo systemctl restart sshd
  • 불필요한 서비스 비활성화
    • 불필요한 서비스, 포트 열리지 않도록 정기적으로 점검 및 관리
      netstat -tunlp
      systemctl list-unit-files --type=service

2. OS 및 패키지 보안 업데이트

  • 보안 업데이트 자동화 설정 권장
    • 특히 CVE를 기준으로 취약점 점검 및 패치 진행
      sudo apt install -y unattended-upgrades
      sudo dpkg-reconfigure unattended-upgrades

3. Docker 보안 관리

  • Docker 데몬 접근 제한 및 관리
    • Docker 데몬을 외부에 노출시키지 말고 로컬 Unix 소켓 사용
    • TCP로 Docker Remote API를 사용하는 경우 반드시 TLS 인증 구성
  • Docker 컨테이너 최소 권한 부여
    • 컨테이너 실행 시 --privileged 옵션 사용 금지 (필요한 경우만 최소화)
    • 컨테이너 리소스 제한 설정 필수 (DoS 공격 방지)
      docker run -d --memory=512m --cpus="1.0" --restart unless-stopped jenkins/jenkins:lts
  • Docker 이미지 보안 점검
    • 신뢰할 수 있는 공식 이미지 또는 인증된 이미지만 사용할 것
    • 이미지 스캔 도구(예: Clair, Trivy)를 이용한 취약점 점검 권장
      trivy image jenkins/jenkins:lts

4. Jenkins 보안 관리

  • 관리자 계정 보안
    • 초기 관리자 비밀번호 즉시 변경
    • Jenkins 관리 페이지 접근 IP 제한(방화벽 활용)
    sudo ufw allow from <보안팀 IP대역> to any port 8080
    sudo ufw deny 8080
  • Jenkins 플러그인 및 관리 페이지 접근 통제
    • 플러그인 설치는 필수 플러그인만으로 최소화하여 관리
    • 관리 페이지의 URL이 외부에 노출되지 않도록 주기적으로 접근로그 점검
  • 빌드 환경 격리 및 인증 관리
    • 빌드 시 사용하는 인증정보는 Jenkins Credential로 보호
    • Git 저장소 접근 시 개인토큰이나 SSH 키 방식으로 접근 제한(비밀번호 방식 지양)

5. Git 및 CI/CD 파이프라인 보안

  • Git 저장소 접근통제
    • 저장소 접근권한을 최소화하고, 팀 내부에서만 접근 가능하도록 설정
    • 브랜치 보호(Protected Branch) 설정, 코드 병합은 승인된 인원만 수행
  • 파이프라인 코드 보안
    • Jenkinsfile은 반드시 권한 있는 사용자만 수정하도록 권한 관리
    • 파이프라인 스크립트 내 민감한 정보 포함 금지(환경변수 또는 Jenkins Credential 활용)

6. 네트워크 보안 관리

  • 방화벽 및 네트워크 접근 제한
    • Docker 컨테이너 외부 접근 포트 최소화(필요한 서비스 포트만 허용)
    • Jenkins 관리 콘솔, Docker Remote API 등 관리 인터페이스는 사내망에서만 접근 허용
    sudo ufw default deny incoming
    sudo ufw allow ssh
    sudo ufw allow from 192.168.10.0/24 to any port 8080
    sudo ufw enable

7. 로깅 및 모니터링

  • 로그 수집 및 분석 체계 구성
    • Jenkins와 Docker 컨테이너 로그를 별도 중앙 로그 서버 또는 SIEM으로 수집
    • 이상행위 탐지를 위한 모니터링 구성(Zabbix, Prometheus 등 활용 권장)
  • 정기적 감사 로그 점검
    • SSH 접근 기록, Docker 컨테이너 실행 이력, Jenkins Job 실행 기록 등 주기적 점검

8. 주기적 보안 점검 및 침해사고 대응 훈련

  • 정기 보안 진단 수행
    • 자체 점검 도구(OSQuery, Wazuh, Lynis 등)를 활용하여 정기적 취약점 진단 수행
      lynis audit system
  • 침해사고 대응 절차 준비
    • Docker 컨테이너 해킹, Jenkins 계정 탈취 등 침해 시나리오 설정 및 대응절차 마련
    • 정기적으로 침해대응 훈련 수행

요약 점검표 (Check List)

항목 주요 점검 포인트
기본 보안 설정 기본 계정 비밀번호 변경, SSH 루트 접근 금지
OS 및 패키지 관리 자동 보안 업데이트 활성화
Docker 보안 컨테이너 최소 권한, 이미지 보안 스캔 수행
Jenkins 관리 관리자 계정 보호, 플러그인 최소화 및 접근통제
Git 및 CI/CD 브랜치 보호, 파이프라인 보안 관리
네트워크 보안 방화벽 설정, 접근 제한
로깅 및 모니터링 중앙 로그 수집 및 이상행위 모니터링
보안 진단 및 침해대응 정기 보안점검, 침해대응 절차 마련 및 훈련

위 가이드를 바탕으로 라즈베리파이를 활용한 CI/CD 환경에서 철저한 보안 관리 및 대응 체계를 갖추시기 바랍니다.

728x90

댓글