
개발 단계의 Docker는 단일 서버 실행이나 Compose 중심으로 충분하다. 그러나 실제 배포에서는 이미지 저장소(ECR), 실행 환경(EC2/ECS), 스토리지(EFS), 트래픽 처리(Load Balancer) 등 연동 구조를 고려해야 한다. 이 글은 최소 구성부터 관리형 배포까지 실무 기준으로 정리한다.
Docker 기반 배포는 크게 두 가지 방식으로 나뉜다.
두 방식 모두 ECR 이미지 저장소를 중심으로 연결된다.
ECR은 AWS의 프라이빗 Docker Registry다.
배포의 모든 시작점은 “이미지를 업로드하는 것”이다.
aws ecr create-repository --repository-name my-app
aws ecr get-login-password | docker login \
--username AWS \
--password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
docker build -t my-app .
docker tag my-app:latest <aws_id>.dkr.ecr.<region>.amazonaws.com/my-app:latest
docker push <aws_id>.dkr.ecr.<region>.amazonaws.com/my-app:latest
배포는 이 이미지를 기준으로 이루어진다.
Amazon Linux 기준:
sudo amazon-linux-extras install docker
sudo service docker start
sudo usermod -aG docker ec2-user
aws ecr get-login-password | docker login --username AWS --password-stdin <repo_url>
docker pull <repo_url>:latest
docker run -d -p 80:80 --name app my-app
현실적인 장점은 예측 가능성과 디버깅 용이성이다.
ECS는 컨테이너 실행을 “태스크(Task)” 단위로 관리한다.
핵심 구성 요소는 다음과 같다.
이 구조는 서버 수가 늘어날 때 압도적으로 효율적이다.
개인·스타트업 관점에서는 Fargate 선호, 비용이 문제가 되면 EC2로 전환.
React SPA 또는 Node API 배포 시 일반적으로 ALB + target group 구조를 사용한다.
핵심 흐름:
중요 포인트:
컨테이너는 Stateless가 원칙이다.
그러나 업로드 파일, 모델 파일, 공유 데이터가 필요할 수도 있다.
EFS 활용 포인트:
예:
volumes:
- name: shared
efsVolumeConfiguration:
fileSystemId: fs-xxxx
노드 API에서 업로드 파일이 필요한 서비스에서 자주 사용된다.
로컬 MongoDB 컨테이너 대신 Atlas를 운영 DB로 사용하는 구조가 일반적이다.
이점:
API 컨테이너 환경변수 예:
MONGO_URL="mongodb+srv://user:pwd@cluster.mongodb.net/mydb"
운영 환경에서는 로컬 DB 컨테이너를 사용하지 않으므로 안정성이 높다.
운영 환경의 이미지는 작고 빠를수록 좋다.
Node.js 기준:
FROM node:18-alpine AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM node:18-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
CMD ["node", "dist/server.js"]
장점:
ECS·EC2 배포 모두에 적용된다.
Docker 기반 운영의 본질은 환경 불일치 제거 + 자동화 기반 운영 최적화다.