자동화된 Docker 배포 스크립트 구축: 완전 초보자 가이드
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

코드에 들어가기 전에 배포 중에 일어나는 전체 흐름을 한눈에 살펴보겠습니다:
- 로컬 머신이 배포 스크립트를 실행합니다.
- 스크립트가 Git에서 애플리케이션 코드를 복제합니다.
- 스크립트가 SSH를 통해 원격 서버에 연결합니다.
- 스크립트가 서버에 Docker와 Nginx를 설치합니다.
- 스크립트가 Docker 컨테이너를 빌드하고 실행합니다.
- 스크립트가 Nginx를 구성해 트래픽을 애플리케이션으로 라우팅합니다.
- 스크립트가 모든 것이 정상적으로 동작하는지 검증합니다.
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

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