Jenkins를 활용한 ASP.NET Core 애플리케이션의 Docker 자동 배포 구축

환경 구성 개요

본 문서에서는 Jenkins, Docker 및 Git을 기반으로 간단한 CI/CD 파이프라인을 구성하는 방법을 설명합니다.

역할 환경 기능
개발 환경 Win10, Docker(Linux) 코드 작성 및 디버깅
빌드 서버 Win10, Docker(Linux), Jenkins 자동화 빌드 및 배포
테스트 서버 Ubuntu, Docker 스테이징 환경 테스트

Jenkins 설치

Jenkins는 운영 체제에 직접 설치하거나 Docker 컨테이너로 실행할 수 있습니다. 본 예제에서는 Windows 호스트 시스템에 직접 설치하는 방식을 사용합니다.

Docker에서의 설치 시도 (권장되지 않음)

docker run -u root -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v /e/DockerData:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

위 명령어는 Windows에서 Docker 볼륨 마운트를 위해 E 드라이브가 Shared Drive로 설정되어 있어야 합니다.

컨테이너 내부에서 Docker CLI를 사용하기 위해서는 추가적으로 docker-compose 설치가 필요합니다:

# 컨테이너 접속 후
curl -L --fail https://github.com/docker/compose/releases/download/1.23.2/run.sh -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Jenkins 초기 설정

  1. 브라우저에서 http://localhost:8080 접속
  2. 초기 관리자 비밀번호 확인 (/var/jenkins_home/secrets/initialAdminPassword)
  3. "Install suggested plugins" 선택
  4. 관리자 계정 생성 및 로그인

빌드 작업 생성

새로운 Item 생성

Jenkins 대시보드에서 "New Item"을 클릭하고 Freestyle project로 생성합니다.

소스 코드 관리

Git 저장소 정보 입력 및 인증 정보(Credentials) 설정이 필요합니다.

빌드 트리거 설정

수동 빌드만 수행하므로 별도의 트리거는 설정하지 않습니다.

PowerShell 빌드 스크립트 추가

Windows 환경에서는 PowerShell 스크립트를 사용하는 것이 권장됩니다. 먼저 "PowerShell Plugin"을 설치해야 합니다.

$imageName = 'latest'
$registryUser = 'your_registry_username'
$registryPass = 'your_registry_password'
$registryHost = 'ccr.ccs.tencentyun.com'
$namespace = 'your_namespace'

$projectPath = "D:\Program Files (x86)\Jenkins\workspace\helloworld"
$composeFile = "$projectPath\docker-compose.yml"

Write-Output "------------------------------ 이미지 빌드 중 ------------------------------"
docker-compose -f $composeFile build

Write-Output "------------------------------ 레지스트리 로그인 ------------------------------"
docker login --username=$registryUser --password=$registryPass $registryHost

Write-Output "------------------------------ 이미지 태그 지정 ------------------------------"
docker tag helloworld:$imageName "$registryHost/$namespace/helloworld:$imageName"
docker tag mynginx:$imageName "$registryHost/$namespace/mynginx:$imageName"

Write-Output "------------------------------ 이미지 푸시 중 ------------------------------"
docker push "$registryHost/$namespace/helloworld:$imageName"
docker push "$registryHost/$namespace/mynginx:$imageName"

Write-Output "------------------------------ 불필요 이미지 정리 ------------------------------"
docker rmi $(docker images -f "dangling=true" -q)

원격 서버 배포 설정

"Publish Over SSH" 플러그인을 설치하고 원격 서버 정보를 설정합니다.

  • Name: Staging_Server
  • Hostname: 원격 서버 IP
  • Username: SSH 사용자명
  • Passphrase/Private Key: 접근 키 설정

배포용 docker-compose 파일 준비

Git 저장소에 docker-compose.staging.yml 파일을 추가합니다:

version: '3.4'
services:
  webapp:
    image: ccr.ccs.tencentyun.com/namespace/helloworld:latest
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "81:80"
    container_name: netcore_app
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks:
      - app_network
      
  nginx_proxy:
    image: ccr.ccs.tencentyun.com/namespace/mynginx:latest
    ports:
      - "80:80"
      - "801:801"
    container_name: nginx_container
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
    networks:
      - app_network

networks:
  app_network:

SSH를 통한 원격 명령 실행

Jenkins 빌드 단계에서 다음 설정을 추가합니다:

  • Source files: docker-compose.staging.yml
  • Remove prefix: 없음
  • Remote directory: /deploy
  • Exec command:
#!/bin/bash
REGISTRY_USER='your_username'
REGISTRY_PWD='your_password'
REGISTRY_URL='ccr.ccs.tencentyun.com'
COMPOSE_FILE='/deploy/docker-compose.staging.yml'

echo "------------------------------ 레지스트리 로그인 ------------------------------"
docker login --username=$REGISTRY_USER --password=$REGISTRY_PWD $REGISTRY_URL

echo "------------------------------ 기존 서비스 종료 ------------------------------"
docker-compose -f $COMPOSE_FILE down

echo "------------------------------ 최신 이미지 가져오기 ------------------------------"
docker-compose -f $COMPOSE_FILE pull

echo "------------------------------ 서비스 시작 ------------------------------"
docker-compose -f $COMPOSE_FILE up -d

echo "------------------------------ 잔여 이미지 제거 ------------------------------"
docker rmi $(docker images -f "dangling=true" -q)

빌드 결과 확인

빌드 완료 후 Jenkins 콘솔 출력을 통해 오류 여부를 확인할 수 있습니다.

빌드 서버 이미지 목록

docker images
REPOSITORY                                    TAG       IMAGE ID       CREATED         SIZE
ccr.ccs.tencentyun.com/namespace/helloworld   latest    4024cdbb87dc   About an hour ago   265MB
helloworld                                    latest    4024cdbb87dc   About an hour ago   265MB
ccr.ccs.tencentyun.com/namespace/mynginx      latest    daca457eb2a9   7 hours ago         109MB

원격 서버 상태 확인

docker images
REPOSITORY                                    TAG       IMAGE ID       CREATED         SIZE
ccr.ccs.tencentyun.com/namespace/helloworld   latest    4024cdbb87dc   About an hour ago   265MB
ccr.ccs.tencentyun.com/namespace/mynginx      latest    daca457eb2a9   7 hours ago         109MB

docker ps -a
CONTAINER ID   IMAGE                                             COMMAND                  CREATED          STATUS          PORTS                                   NAMES
e1dc94a1886b   ccr.ccs.tencentyun.com/namespace/mynginx:latest   "nginx -g 'daemon of…"   8 minutes ago    Up 7 minutes    0.0.0.0:80->80/tcp, 0.0.0.0:801->801/tcp   nginx_container
3ad3db4fbd94   ccr.ccs.tencentyun.com/namespace/helloworld:latest "dotnet HelloWorld.d…"   8 minutes ago    Up 8 minutes    0.0.0.0:81->80/tcp                         netcore_app

웹 브라우저에서 http://서버IP:801으로 접속하여 서비스 동작을 확인할 수 있습니다.

태그: Jenkins docker asp.net-core ci-cd automation-deployment

6월 10일 21:13에 게시됨