컨테이너 없는 배포, 가능할까
Docker 없이 프로덕션 배포를 해본 경험과 서버리스의 현실적인 한계
Dockerfile 작성이 싫어서 시작된 실험
새 사이드 프로젝트를 시작했다. Node.js API 서버 하나, Next.js 프론트 하나. 예전 같으면 Docker Compose 파일부터 만들었을 텐데, 이번엔 "컨테이너 없이 가보자"는 생각이 들었다. Dockerfile 작성하고, 이미지 빌드하고, 레지스트리 푸시하고, 오케스트레이션 설정하고... 사이드 프로젝트치고는 오버헤드가 너무 크다고 느꼈다. (솔직히 Docker 멀티스테이지 빌드 설정이 매번 검색 없이 안 되는 것도 이유다.)
프론트엔드는 Vercel로 3분 만에 끝났다
Next.js를 Vercel에 올리는 건 진짜 쉽다. GitHub 레포 연결하고 "Deploy" 누르면 끝. 빌드 설정도 자동 감지. 배포까지 2분 47초. 커스텀 도메인 연결도 DNS 레코드 하나 추가하면 되고.
이건 진짜 감탄할 수밖에 없다. 3년 전에 Nginx 설정하고 SSL 인증서 수동으로 갱신하던 게 거짓말 같다.
백엔드가 문제였다
API 서버를 어디에 올릴 건지. 선택지를 세 개로 좁혔다.
- AWS Lambda + API Gateway (서버리스)
- Railway (PaaS)
- Fly.io (컨테이너 없이 가능하다고 광고하는 곳)
Lambda부터 시도했다. 기존 Express 앱을 Lambda용으로 변환하는 데 하루 반이 걸렸다. serverless-http라는 래퍼를 썼는데 대부분은 잘 됐다. 근데 WebSocket이 안 됐다. 실시간 알림 기능이 있었는데, Lambda에서는 WebSocket을 위해 별도의 API Gateway WebSocket API를 구성해야 했다. 이 시점에서 "이게 정말 더 간단한 건가?" 의문이 들었다.
콜드 스타트, 그 악명 높은 녀석
Lambda 콜드 스타트가 1.3초에서 3.8초 사이였다. Node.js 런타임인데도 이 정도. 첫 요청이 느린 건 사용자 경험에 직접 영향을 준다. 프로비저닝된 동시성을 설정하면 해결되는데, 그러면 월 비용이 확 올라간다. 무료 티어의 매력이 사라지는 순간이다.
결국 Railway로 갔다. Git 푸시하면 자동 배포. 빌드팩이 알아서 Node.js를 감지하고 배포한다. 내부적으로는 컨테이너를 쓰는 거지만 내가 Dockerfile을 쓸 필요가 없다. 배포까지 1분 12초. (Vercel보다 빨랐다.)
비용 계산을 해봤더니
Railway 무료 티어는 월 실행 시간 500시간, 메모리 512MB. 사이드 프로젝트 수준이면 충분하다. 유료로 넘어가면 월 $5부터. Lambda는 월 100만 요청까지 무료인데 실제로 API Gateway 비용, CloudWatch 로그 비용 같은 게 붙어서 "무료"가 아니었다. 첫 달에 $4.37이 나왔다. (0원을 기대했는데.)
Vercel + Railway 조합으로 사이드 프로젝트를 운영하면 월 $0~$10 선. Docker를 쓰든 안 쓰든 비용은 비슷한데, 관리 부담이 확연히 줄었다.
그래서 컨테이너 없이 되는 건가
결론부터 말하면, 된다. 근데 조건이 있다. 단순한 API 서버, 표준적인 프론트엔드, 트래픽이 예측 가능한 수준. 이 세 가지가 맞으면 컨테이너 없이도 충분하다.
근데 회사 프로젝트에서는 아직 컨테이너가 필요하다. 로컬 환경과 프로덕션 환경의 일관성, 복잡한 의존성 관리, 마이크로서비스 간 네트워킹. 이런 건 서버리스나 PaaS만으로는 해결이 안 되는 영역이 있다.
사이드 프로젝트에서는 컨테이너를 버리고, 회사에서는 컨테이너를 쓴다. 이 이중 생활이 당분간은 계속될 것 같다.