안녕하세요 펭귄 교수입니다.
CI/CD(Continuous Integration/Continuous Deployment, 지속적 통합/지속적 배포)는 현대 소프트웨어 개발에서 매우 중요한 프로세스입니다.
개발자들이 코드를 지속적으로 통합하고, 테스트를 통해 안정성을 확보한 후 자동으로 배포하는 방식이죠.
도커(Docker)는 이 CI/CD 파이프라인에서 매우 유용한 도구로, 애플리케이션을 격리된 컨테이너 환경에서 쉽게 관리하고 배포할 수 있게 해줍니다.
이번 포스팅에서는 도커와 CI/CD의 개념, 도커를 활용한 파이프라인의 구축, 그리고 Jenkins와 GitLab CI 같은 도구를 활용한 CI/CD 파이프라인 구성 방법을 소개하겠습니다.
1. CI/CD란?
CI(Continuous Integration): 개발자들이 코드를 자주 통합하고, 이를 자동으로 빌드하고 테스트하는 과정입니다. 작은 코드 변경 사항이라도 통합 후 발생할 수 있는 오류를 신속하게 파악할 수 있습니다.
CD(Continuous Deployment/Delivery): CI를 통해 안정성을 확인한 코드를 자동으로 배포하는 프로세스입니다. Continuous Delivery는 수동으로 배포 과정을 거칠 수 있지만, Continuous Deployment는 테스트를 통과한 코드를 자동으로 배포까지 완료하는 단계입니다.
이러한 프로세스는 수작업을 줄이고, 신속하고 안정적인 소프트웨어 배포를 가능하게 합니다.
2. 도커가 CI/CD에 중요한 이유
도커는 애플리케이션을 격리된 환경에서 실행할 수 있게 해줍니다. CI/CD 파이프라인에서 도커를 사용하면, 모든 개발자와 배포 환경에서 동일한 컨테이너 이미지를 사용하여 일관된 실행 환경을 보장할 수 있습니다.
도커의 주요 이점:
- 환경 일관성: 개발, 테스트, 배포 환경이 동일한 컨테이너에서 실행되므로, 환경 문제로 인한 버그 발생 가능성이 줄어듭니다.
- 빠른 배포: 도커 이미지 기반으로 애플리케이션을 배포하면 기존 서버에서 빠르게 업데이트할 수 있습니다.
- 확장성: CI/CD 파이프라인에서 도커를 사용하여 여러 환경에 동일한 이미지를 배포할 수 있습니다.
3. CI/CD 파이프라인 구축 단계
CI/CD 파이프라인을 구축하는 데 있어 중요한 단계는 코드 빌드 → 테스트 → 배포입니다. 여기에 도커를 추가하면 컨테이너 환경에서 이 모든 단계가 수행됩니다.
3-1. 코드 빌드 및 테스트
개발자는 도커 이미지를 기반으로 애플리케이션을 빌드하고, 컨테이너에서 테스트를 실행할 수 있습니다. 이는 개발 환경과 동일한 환경에서 이루어지므로 일관된 결과를 보장합니다.
# 간단한 GitLab CI 예시 (.gitlab-ci.yml)
stages:
- build
- test
- deploy
build:
stage: build
script:
- docker build -t my-app .
test:
stage: test
script:
- docker run my-app pytest
deploy:
stage: deploy
script:
- docker push my-app
위 예시는 GitLab CI에서 도커를 사용하여 애플리케이션을 빌드, 테스트하고 이미지로 배포하는 기본적인 설정입니다.
3-2. 이미지 배포
애플리케이션이 정상적으로 빌드되고 테스트를 통과하면, **도커 레지스트리(Docker Registry)**에 이미지를 푸시(push)합니다. 이를 통해 배포 환경에서 이미지를 풀(pull)하여 쉽게 배포할 수 있습니다.
docker push my-app:latest
배포 환경에서는 docker pull 명령어로 이미지를 가져온 후 컨테이너를 실행하여 애플리케이션을 배포할 수 있습니다.
4. Jenkins를 사용한 도커 기반 CI/CD
Jenkins는 가장 인기 있는 CI/CD 도구 중 하나로, 도커와 결합하여 자동화된 파이프라인을 쉽게 구성할 수 있습니다. Jenkins를 사용해 도커를 기반으로 CI/CD 파이프라인을 구축하는 방법을 살펴보겠습니다.
4-1. Jenkins 설치 및 설정
먼저, Jenkins와 도커가 설치된 환경을 준비해야 합니다. Jenkins는 기본적으로 파이프라인을 구성하는 플러그인을 제공하며, 이를 통해 도커를 통합할 수 있습니다.
Jenkins 설치 명령어 (도커 컨테이너로 실행):
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts
4-2. Jenkins 파이프라인 설정
Jenkins의 파이프라인 설정은 매우 유연합니다. Jenkinsfile을 사용하여 파이프라인을 정의하고, 이를 통해 도커 이미지를 빌드하고 배포할 수 있습니다.
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
docker.build('my-app')
}
}
}
stage('Test') {
steps {
script {
docker.image('my-app').inside {
sh 'pytest'
}
}
}
}
stage('Deploy') {
steps {
script {
docker.image('my-app').push()
}
}
}
}
}
이 Jenkinsfile은 Jenkins에서 도커 이미지를 빌드하고, 테스트하며, 마지막으로 도커 레지스트리에 이미지를 푸시하는 과정을 자동화합니다.
4-3. Jenkins에서 도커 실행 권한 설정
Jenkins가 도커 명령어를 실행하려면 Jenkins 서버에 도커가 설치되어 있어야 하며, Jenkins 사용자에게 도커 실행 권한이 필요합니다.
sudo usermod -aG docker jenkins
이 명령어로 Jenkins 사용자를 도커 그룹에 추가하면, Jenkins에서 도커 명령어를 사용할 수 있습니다.
5. GitLab CI/CD와 도커
GitLab CI/CD는 GitLab에서 제공하는 CI/CD 시스템으로, GitLab 레포지토리와 통합하여 코드를 자동으로 빌드, 테스트, 배포할 수 있습니다. GitLab CI는 GitLab 레포지토리에 gitlab-ci.yml 파일을 추가하여 쉽게 설정할 수 있습니다.
5-1. GitLab CI 설정 예시
GitLab CI에서도 도커를 사용하여 빌드 및 배포 과정을 자동화할 수 있습니다. gitlab-ci.yml 파일에 도커 명령어를 사용하여 이미지를 빌드하고 배포하는 파이프라인을 설정할 수 있습니다.
stages:
- build
- test
- deploy
build:
stage: build
script:
- docker build -t my-app .
test:
stage: test
script:
- docker run my-app pytest
deploy:
stage: deploy
script:
- docker push my-app
GitLab CI의 파이프라인 설정은 Jenkins와 유사하며, 도커 이미지를 빌드하고 테스트하는 과정이 간단합니다.
6. Docker Compose와 CI/CD
Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 관리하는 도구입니다. Docker Compose 파일(docker-compose.yml)을 사용하여 애플리케이션을 정의하면, 이를 기반으로 CI/CD 파이프라인에서 쉽게 여러 컨테이너를 구성할 수 있습니다.
6-1. Docker Compose 예시
CI/CD 파이프라인에서 Docker Compose를 사용하면 여러 컨테이너를 쉽게 관리할 수 있습니다.
version: '3'
services:
web:
image: my-app
ports:
- "5000:5000"
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
이 Docker Compose 설정 파일을 CI/CD 파이프라인에서 실행하면 웹 애플리케이션과 데이터베이스를 동시에 실행할 수 있습니다.
7. 도커를 활용한 CI/CD 파이프라인의 장점
- 자동화: 코드가 푸시되면 자동으로 빌드, 테스트, 배포 과정을 진행하여 개발 주기를 빠르게 만듭니다.
- 일관성: 모든 단계에서 동일한 도커 이미지를 사용하여 환경 문제를 최소화할 수 있습니다.
- 유연성: Jenkins, GitLab CI 등 다양한 도구와의 통합을 통해 유연한 파이프라인을 구성할 수 있습니다.
- 확장성: 여러 서버나 클라우드 환경에서도 동일한 도커 이미지를 사용하여 손쉽게 배포할 수 있습니다.
8. 마무리
도커와 CI/CD 파이프라인을 결합하면, 개발자들은 더 빠르고 안정적인 배포 과정을 구축할 수 있습니다.
이번 글에서 설명한 Jenkins, GitLab CI, Docker Compose 등을 활용하여 자동화된 배포 파이프라인을 구성해 보세요.
다른 글 더보기
'Docker > Docker 강의' 카테고리의 다른 글
[Docker 강의 19편] 도커와 쿠버네티스 기본 개념 (1) | 2024.10.05 |
---|---|
[Docker 강의 18편] 도커 컨테이너 내에서 애플리케이션 디버깅 (1) | 2024.10.04 |
[Docker 강의 16편] 도커 로그 관리 (0) | 2024.10.01 |
[Docker 강의 15편] 도커 컨테이너 모니터링 (0) | 2024.09.30 |
[Docker 강의 14편] 도커 컨테이너 자동화 (0) | 2024.09.30 |