자동화된 Docker 배포 스크립트 구축: 완전 초보자 가이드

발행: (2025년 12월 10일 오전 06:53 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

Introduction

전문 개발자들이 애플리케이션을 서버에 자동으로 배포하는 방법이 궁금하셨나요? 이 포괄적인 가이드에서는 Docker 기반 애플리케이션의 전체 배포 과정을 자동화하는 강력한 Bash 스크립트를 만드는 과정을 단계별로 살펴봅니다. 이 글을 끝까지 읽으면 다음을 수행할 수 있는 스크립트를 얻게 됩니다:

  • Git 저장소 복제
  • 원격 서버 환경 설정
  • Docker 컨테이너 빌드 및 배포
  • Nginx를 리버스 프록시로 구성
  • 배포 검증
  • 정리 및 로그 관리

가장 좋은 점: DevOps 여정을 이제 시작하더라도 모든 단계를 이해하게 됩니다!

What is Automated Deployment and Why Do We Need It?

웹 개발 초기에는 애플리케이션을 배포한다는 것이 파일을 서버에 수동으로 복사하고, 의존성을 설치하며, 모든 설정을 직접 하는 것을 의미했습니다. 이 과정은 다음과 같은 문제점이 있었습니다:

  • 시간 소모형 – 단일 배포에 몇 시간이 걸릴 수 있음
  • 오류 발생 가능성 – 단계 하나를 놓치거나 잘못 설정하기 쉬움
  • 재현 불가 – 같은 방식으로 두 번 배포하기 어려움
  • 확장성 부족 – 10개의 서로 다른 애플리케이션에 대해 이 작업을 한다고 상상해 보세요!

자동화된 배포는 스크립트를 사용해 모든 배포 단계를 일관되고 신뢰성 있게 수행함으로써 이러한 문제를 해결합니다.

Understanding the Deployment Workflow

Deployment Workflow

코드에 들어가기 전에 배포 중에 일어나는 전체 흐름을 한눈에 살펴보겠습니다:

  1. 로컬 머신이 배포 스크립트를 실행합니다.
  2. 스크립트가 Git에서 애플리케이션 코드를 복제합니다.
  3. 스크립트가 SSH를 통해 원격 서버에 연결합니다.
  4. 스크립트가 서버에 Docker와 Nginx를 설치합니다.
  5. 스크립트가 Docker 컨테이너를 빌드하고 실행합니다.
  6. 스크립트가 Nginx를 구성해 트래픽을 애플리케이션으로 라우팅합니다.
  7. 스크립트가 모든 것이 정상적으로 동작하는지 검증합니다.

Prerequisites

Knowledge

  • Linux 명령줄 기본
  • Git 버전 관리
  • Docker에 대한 기본 이해 (필요 시 설명 제공)

Technical Requirements

  • Linux/macOS 머신 (또는 Windows의 WSL)
  • 원격 서버 (AWS EC2, DigitalOcean 등)
  • 서버에 대한 SSH 키 접근 권한
  • 애플리케이션 코드가 들어있는 Git 저장소

Tip: SSH 키가 처음이라면, 텍스트 비밀번호 대신 암호화 키를 사용하는 안전한 비밀번호 대체 수단이라고 생각하면 됩니다.

The 7 Stages of Our Deployment Script

Deployment Stages

우리의 배포 스크립트는 일곱 개의 뚜렷한 단계로 구성됩니다. 아래에서 각 단계별 상세 내용을 확인하세요.

Stage 0.5 – Setup and Housekeeping

What it does: 로깅, 오류 처리, 정리 기능을 설정합니다.

Safety Features

#!/usr/bin/env bash

set -o errexit   # 오류 발생 시 즉시 종료
set -o nounset   # 정의되지 않은 변수 사용 시 종료
set -o pipefail  # 파이프라인 중 하나라도 실패하면 종료
  • errexit: 어떤 명령이 실패해도 스크립트를 즉시 중단합니다.
  • nounset: 변수 이름 오타를 잡아냅니다.
  • pipefail: 파이프라인 내부 오류가 숨겨지지 않도록 합니다.

Logging System

TIMESTAMP="$(date +%Y%m%d_%H%M%S)"
LOGDIR="./logs"
LOGFILE="${LOGDIR}/deploy_${TIMESTAMP}.log"

log() {
  printf "%s [%s] %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$1" "$2" | tee -a "${LOGFILE}"
}

배포마다 타임스탬프가 포함된 로그 파일을 생성해 문제 해결을 용이하게 합니다.

Cleanup Mode

스크립트는 --cleanup 플래그를 제공하며, 이를 사용하면 배포된 모든 컨테이너, 이미지 및 설정을 제거할 수 있어 초기 상태로 되돌리기에 편리합니다.

./deploy.sh --cleanup

Caution: 정리 모드는 서버에 존재하는 모든 Docker 컨테이너와 이미지를 삭제합니다. 중요한 데이터는 반드시 백업해 두세요.

Stage 1 – Collect Parameters and Basic Validation

What it does: 인터랙티브 프롬프트를 통해 배포에 필요한 모든 정보를 수집합니다.

Information Collected

  • Git 저장소 URL (예: https://github.com/yourusername/your-app.git)
  • Personal Access Token (PAT) – 비공개 저장소용 (보안 입력)
  • 브랜치 이름 (기본값: main)
  • SSH 상세 정보 – 사용자명, 호스트/IP, 개인 키 경로
  • 애플리케이션 포트 (예: Node.js는 3000, 기타는 8080 등)

Example Interaction

Git repository URL: https://github.com/john/awesome-app.git
Branch name: main
Remote SSH username: ubuntu
Remote SSH host/IP: 54.123.45.67
Path to local SSH private key: ~/.ssh/deploy-key.pem
Application internal container port: 3000

Input Validation Example

case "${APP_PORT}" in
  ''|*[!0-9]* ) die 12 "Invalid port";;
esac

포트 번호가 숫자인지 확인해 이후 오류를 방지합니다.

Stage 2 – Repository Clone and Validation

What it does: 코드를 다운로드하고 서버와의 연결성을 검증합니다.

Workspace Creation & Clone

WORKDIR="./workspace_${TIMESTAMP}"
mkdir -p "${WORKDIR}"

git clone -b "${BRANCH}" "${GIT_REPO_URL}" "${WORKDIR}/repo"

타임스탬프가 포함된 작업 디렉터리를 만들고 지정된 브랜치를 복제합니다.

Authentication for Private Repos (HTTPS)

# Inject PAT into the URL securely
AUTH_URL="$(echo "${GIT_REPO_URL}" | sed -E "s#https://#https://${GIT_PAT}@#")"
git clone -b "${BRANCH}" "${AUTH_URL}" "${WORKDIR}/repo"

Authentication for SSH Repositories

GIT_SSH_COMMAND="ssh -i ${SSH_KEY_PATH} -o StrictHostKeyChecking=no" \
  git clone -b "${BRANCH}" "${GIT_REPO_URL}" "${WORKDIR}/repo"

Docker Setup Detection

if [ -f "${WORKDIR}/repo/Dockerfile" ]; then
  log "INFO" "Found Dockerfile."
elif [ -f "${WORKDIR}/repo/do
Back to Blog

관련 글

더 보기 »

DevOps란 무엇인가?

소개 온라인에서 “What is DevOps?”를 검색하면 복잡한 정의가 많이 나옵니다. 이 기사에서는 DevOps를 기초부터 설명합니다. DevOps = De...

Dockerfile: CMD와 ENTRYPOINT

Ubuntu 이미지의 기본 CMD 공식 Ubuntu 이미지는 기본 명령을 정의합니다: Dockerfile CMD '/bin/bash' 컨테이너를 실행하고 인수를 제공하면, ...