logo
Posts
소개

Docker 소개

Docker 란 무엇일까요?
공식 문서에서는 Docker 를 다음과 같이 정의하고 있습니다.

Docker 는 애플리케이션을 개발, 배포, 실행하기 위한 오픈 플랫폼입니다.

이번 글에서는 Docker 에 대해 간단하게 살펴보겠습니다.

Docker 란?

Docker 는 애플리케이션을 컨테이너라는 독립된 환경에서 실행할 수 있게 해주는 기술입니다.
이를 통해, 개발자는 애플리케이션과 그 의존성을 모두 하나의 컨테이너 안에 패키징하여, 어디서든 동일하게 동작하는 애플리케이션을 배포할 수 있습니다. Docker 는 소프트웨어를 일관성 있게 배포하고, 효율적으로 관리할 수 있도록 돕는 도구로서, 경량화된 가상화 기술로도 불립니다.

컨테이너

Docker 컨테이너는 애플리케이션을 실행하는 환경을 의미합니다.
쉽게 말해, 컨테이너는 애플리케이션, 즉 프로그램이 실행되기 위해 필요한 모든 것을 포함하고 있는 패키지입니다. 이 패키지에는 코드, 라이브러리, 설정 파일, 그리고 실행 환경 등이 모두 포함되어 있어, 애플리케이션이 실행되는 곳이 어디든 동일하게 동작할 수 있습니다.

어플리케이션

우선 어플리케이션이란, 사용자가 원하는 기능을 수행하는 프로그램을 의미합니다. 예를 들어, 웹 서버, 데이터베이스, 또는 간단한 유틸리티 프로그램 등이 애플리케이션에 해당합니다.

실행 환경

그렇다면, 어플리케이션을 실행하는 환경이란 무엇일까요?
애플리케이션이 실행되기 위해서는 그에 맞는 환경이 필요합니다. 예를 들어, Javascript 애플리케이션을 실행하려면 런타임인 Node.js 가 필요합니다. Java 의 경우에는 JVM(Java Virtual Machine)이 필요하며, C++ 애플리케이션의 경우에는 컴파일된 실행 파일이 필요합니다. 또, Python 애플리케이션의 경우에는 Python 해석기와 필요한 라이브러리가 있어야 실행됩니다. Docker 컨테이너는 이 실행 환경을 애플리케이션과 함께 패키지화하여, 개발 환경과 프로덕션 환경의 차이를 해결해 줍니다.

왜 Docker 를 사용할까요?

기존의 서버 환경에서 애플리케이션을 실행할 수 있는데도 불구하고, 왜 Docker 를 사용해야 할까요? 그 이유는 다음과 같습니다.

프로젝트별 패키지의 의존성 이슈

일반적으로 하나의 서버에서 여러 개의 애플리케이션이 실행됩니다.
관리적인 측면에서는 여러 애플리케이션을 동일한 런타임에서 실행할 수 있다면 좋겠지만, 현실적으로 각각의 애플리케이션은 서로 다른 라이브러리, 프레임워크, 런타임을 요구하는 경우가 많습니다.

예를 들어, Node.js의 경우를 생각해봅시다. Node.js의 패키지는 사용하는 Node.js 버전에 따라 호환성 문제가 발생할 수 있습니다. 현재 지원되는 안정화 버전 중 가장 오래된 버전인 Node.js 18을 사용하는 것이 필요할 수 있습니다. 이는 Node.js 16이 이미 EOL(End of Life) 상태이기 때문입니다.

그러나 여전히 일부 애플리케이션은 구버전에서만 제대로 동작할 수 있습니다. 반대로, 특정 라이브러리는 EOL 버전을 고려하지 않기 때문에 최신 버전을 사용해야 할 수도 있습니다.

개발 환경에서는 nvm(Node Version Manager) 을 사용해 쉽게 Node.js 버전을 전환할 수 있지만, 서버 환경에서는 여러 버전의 Node.js를 nvm과 같은 도구로 관리하는 것이 현실적으로 어렵습니다. 특히 서버는 안정성과 일관성이 중요하기 때문에 여러 버전의 런타임을 혼합해 사용하면 관리 복잡도가 크게 증가할 수 있습니다.

Docker 의 해결 방법

이 문제를 해결하는 데 Docker 가 매우 유용합니다. Docker 는 서버 환경에서도 여러 애플리케이션을 격리된 컨테이너에서 실행할 수 있게 해주며, 각 애플리케이션은 독립된 Node.js 버전과 설정을 사용할 수 있습니다. 이를 통해 서버 환경에서도 버전 관리가 단순해지고, 서로 다른 애플리케이션이 각기 다른 버전을 사용할 때도 충돌 없이 안정적으로 동작합니다.

  1. 격리된 실행 환경: Docker는 애플리케이션마다 독립된 컨테이너를 제공해, 각각의 애플리케이션이 독립적인 런타임과 패키지를 사용해도 서로 간에 충돌 없이 실행됩니다. 예를 들어, 한 서버에서 Node.js 18과 Node.js 14가 동시에 실행되더라도 문제가 없습니다.
  2. 일관된 배포: 컨테이너에 애플리케이션과 그 의존성을 모두 포함하므로, 개발 환경과 운영 환경 간의 차이를 최소화할 수 있습니다.
  3. EOL 버전 관리: Docker는 더 이상 지원되지 않는 구버전의 런타임도 컨테이너 내에서 안전하게 실행할 수 있으므로, EOL 버전의 애플리케이션도 안정적으로 관리할 수 있습니다. 이는, 보안 업데이트가 필요한 상황에서도 기존 애플리케이션을 계속 사용할 수 있도록 해줍니다.
  4. 복잡성 감소: 한 서버에서 여러 버전의 런타임을 수동으로 관리하는 대신, 각 컨테이너가 독립된 환경을 제공하므로 서버 설정과 관리를 크게 단순화할 수 있습니다.

결론적으로, Docker는 애플리케이션 간의 의존성 충돌을 방지하고, 서로 다른 런타임을 독립적으로 실행할 수 있는 환경을 제공해 줍니다. 특히, EOL 버전과 같은 더 이상 지원되지 않는 런타임도 안전하게 관리할 수 있다는 점에서 매우 유용합니다.