Devops

Docker 로 편리하게 배포하기

2025년 12월 31일

한 줄 요약

Docker는 “내 컴퓨터에서 되던 걸 서버에서도 100% 똑같이 되게 만드는 도구”다.


Docker가 나오기 전의 배포 지옥

전통적인 배포 방식

1. EC2 접속
2. Node 설치
3. npm 설치
4. 환경변수 설정
5. 빌드
6. 실행

그리고 꼭 나오는 말:

“로컬에서는 되는데요… 서버에서는 안 돼요”


왜 이런 일이 생길까?

  • Node 버전 다름
  • OS 차이
  • 라이브러리 의존성 꼬임
  • 서버마다 설정이 미묘하게 다름

📌 환경 불일치(Environment Drift) 문제


Docker의 핵심 아이디어

애플리케이션 + 실행 환경을 통째로 하나의 상자로 묶자

[ App ]
[ Node 18 ]
[ npm 패키지 ]
[ OS 설정 ]
──────────────
= Docker Image

이 이미지를 어디서 실행하든 동일한 결과


Docker를 쓰는 이유 1️⃣ 환경 일관성

로컬 → 서버 → 운영

개발자 A
개발자 B
CI 서버
운영 서버

모두 동일한 Docker Image 사용

👉 “환경 문제”가 거의 사라짐


Docker를 쓰는 이유 2️⃣ 배포가 미친 듯이 단순해짐

Docker 없이

ssh → 설치 → 설정 → 빌드 → 실행

Docker 사용

docker pull image
docker run

끝.


Docker를 쓰는 이유 3️⃣ 서버를 “소모품”처럼 다룰 수 있음

📌 이게 진짜 핵심 마인드셋 변화

과거 서버

  • 한 번 세팅하면 절대 건들면 안 됨
  • 망가지면 밤샘 복구

Docker 서버

  • 서버 = 컨테이너 실행기
  • 망가지면?
    • 새 서버
    • 이미지 다시 실행

👉 서버 불변성 (Immutable Infrastructure)


Docker를 쓰는 이유 4️⃣ CI/CD랑 찰떡궁합

배포 파이프라인 예시

GitHub Push
 → GitHub Actions
 → Docker build
 → Docker image push
 → EC2에서 pull & run

📌 코드 → 이미지 → 실행

📌 중간에 “사람 손”이 거의 없음


Docker를 쓰는 이유 5️⃣ 롤백이 쉬움

v1.0 이미지 ❌

docker run v0.9 이미지

끝.

  • 코드 롤백 ❌
  • 서버 재설정 ❌

👉 이미지 태그만 바꾸면 됨


Docker를 쓰는 이유 6️⃣ 서비스 분리가 쉬움

Next.js
Nginx
Redis
DB

각각을:

  • 다른 컨테이너
  • 다른 버전
  • 다른 설정

👉 서로 영향 최소화