본문 바로가기

Spring & Spring Boot

내 프로젝트에 Docker가 정말 필요했을까?

출처: https://techblog.lotteon.com/docker%EB%A5%BC-%EC%99%9C-%EC%8D%A8%EC%95%BC%EB%90%98%EB%8A%94%EA%B0%80-2310117b4dea

서론

 요즘의 개발 환경에서 Docker는 매우 자연스러운 도구로 자리 잡았다. 몇 가지 명령어만으로 컨테이너가 생성되고, 동일한 환경이 유지되며, 배포 과정도 단순화된다.

 

이러한 편의성으로 인해 Docker의 본질을 잊거나 무시하고 무작정 사용하는 경우가 많다.

그러나 프로젝트 규모와 특성을 고려하지 않고 Docker를 도입하는 것은 불필요한 복잡성을 야기할 수 있다.

 

특히 단일 서버에서 단일 Java 애플리케이션(Spring 등)만 운영하는 경우, Docker의 도입 필요성을 재검토할 필요가 있다.

 

 

 

 

Docker의 장점을 하나하나 반박하고 수용하며 내 프로젝트에 Docker 도입이 적절한지 판단하는 시간을 가져 보자.

 

 

 

 

 

일반적인 소규모 프로젝트를 가정한다.
1. 단일 EC2 (aws를 사용한다고 가정했을 때) 내에서 spring 애플리케이션 실행.
2. CI/CD 는 Github Actions 사용.

 

 

 

본론 1 - Docker 장점과 반박


장점 1 - 종속성 캡슐화

Docker를 사용하면 애플리케이션에 필요한 라이브러리와 런타임을 Docker 이미지 내부에 포함시켜 배포할 수 있다.

 

반박: 하지만, 단일 Java 애플리케이션에서는 서버에 설치된 JDK 관리만으로 충분하며, 추가적인 라이브러리 관리가 복잡하지 않다면 Docker 도입은 불필요한 오버헤드다.

 

 

장점 2 - 다중 서비스 격리

Docker를 사용하면 각 애플리케이션을 독립된 컨테이너로 분리하여 충돌을 방지할 수 있다.

 

반박: 그러나 단일 서버에서 하나의 애플리케이션만 운영하는 환경에서는 포트 충돌, 라이브러리 충돌, 사용자 권한 충돌 등이 발생하지 않기 때문에 이 장점을 누릴 수 없다.

 

 

장점 3 - CD

CD 스크립트와 Docker Hub를 통해 애플리케이션을 간편하게 배포할 수 있다.

 

반박: 그러나, jar 파일 복사 및 애플리케이션 재시작 방식으로도 효과적인 배포 자동화가 가능하며, Docker 이미지 파일 비용(Spring 프로젝트의 경우 약 400MB)을 고려해야 한다. Docker 가 없어도 "가능하다"는 것에 초점을 맞추자.

 

 

장점 4 - 롤백

Docker 이미지 버전 전환을 통해 빠른 롤백이 가능하다.

 

반박: 그러나, 버전별 jar 파일을 관리하고 배포하는 방식으로도 충분히 롤백 시스템을 구축할 수 있다.

 

 

장점 5 - 무중단 배포

Docker에서 제공하는 컨테이너 병렬 실행(8080, 8081..), 헬스 체크 등의 기능은 무중단 배포를 용이하게 해 준다.

 

반박: Docker는 무중단 배포와 직접적인 연관이 없는 기술이다. Docker는 단지 무중단 배포를 구현하기 쉽게 설계된 것일 뿐이며 무중단 배포를 보장하거나 구현하는 것은 아니다. Docker를 사용하지 않고도 충분히 무중단 배포를 구현할 수 있다.

 

Nginx의 리버스 프록시를 사용해 무중단 배포를 달성하는 시나리오를 하나 나열해 보겠다.

  1. 새 jar 파일을 배포하고, 기존과 다른 포트(8081 등)에서 실행
  2. 헬스 체크로 새 애플리케이션이 정상적으로 실행되는지 확인
  3. Nginx 설정을 reload 하여 트래픽을 8081로 넘김
  4. 구버전(8080)은 종료

 

 

장점 6 - 비정상 종료 시 자동 재시작

 Docker는 --restart 정책을 통해 컨테이너가 비정상적으로 종료된 경우 자동으로 재시작할 수 있다. 특히, 일시적인 네트워크 장애나 외부 의존 서비스의 불안정성으로 컨테이너가 죽었을 경우, 재시작을 통해 정상 운영으로 복귀할 수 있다.

 

반박: 이는 systemd에 service를 등록함으로써 해결할 수 있다. 애플리케이션의 종료 코드가 0이 아닌 경우 재시작한다는 식으로 재시작을 구현할 수 있다.

 

 

 

본론 2 - Docker 장점과 수용


장점 7 - 실행 환경 일관성 보장

Docker는 개발, 테스트, 운영 환경을 동일하게 유지할 수 있도록 한다. 이미지를 통해 컨테이너를 실행하기 때문이다.

 

수용: 만약 Docker를 사용하지 않는다면, 개발 PC 환경과 EC2 환경의 불일치가 발생할 가능성이 높다. 그러므로, 실행 환경의 일관성을 보장하는 Docker의 장점은 수용할만하다.

 

 

 

 

 

 

 

결론

단일 서버에서 단일 Java 애플리케이션을 운영하는 환경에서는 Docker가 제공하는 대부분의 기능은 필수가 아니다.

 

 다만, 실행 환경 일관성 보장이라는 목적에서는 Docker 도입이 유의미하다. 운영체제 설정이나 시스템 구성에 따라 미묘한 차이가 실제 장애로 이어질 수 있는 경우라면 Docker는 실행 환경을 캡슐화하는 수단으로 적절하다.

 

 

 

요약하면 다음과 같다

단일 서버에서 실행되는 애플리케이션의 경우, 실행 환경 일관성을 제외하면 Docker를 사용할 뚜렷한 이유는 없다.
물론, 사용하기 편리하다는 건 큰 장점이다.

 

 

 

Docker를 사용하는 것이 잘못된 선택이라고 말하려는 것이 아니다.

편리하다는 이유 하나만으로 도구를 선택한 것이 아닌지, 기술의 필요성과 목적을 충분히 고민했는가에 대한 질문을 던져보고자 했다.

 

기술은 익숙하다는 이유로 선택되어서는 안 된다. 기술은 문제 해결을 위한 수단이지, 목적 그 자체가 아니다.