Docker는 애플리케이션을 개발하고 배포하며 실행하기 위한 오픈 플랫폼입니다. 애플리케이션 코드와 실행에 필요한 런타임, 라이브러리, 설정 등을 이미지로 패키징하고, 이를 격리된 프로세스인 컨테이너로 실행합니다.
Docker 컨테이너는 호스트 운영체제의 커널을 공유하면서 namespace를 통해 프로세스, 네트워크, 파일 시스템 등을 격리하고, cgroup을 통해 CPU와 메모리 같은 자원 사용량을 제어합니다. 따라서 애플리케이션마다 전체 운영체제를 설치하지 않고도 서로 분리된 실행 환경을 만들 수 있습니다.
Docker를 사용할 때의 주요 장점은 다음과 같습니다.
- 일관된 실행 환경: 개발, 테스트, 운영 환경에서 같은 이미지를 사용하므로 환경 차이로 인한 문제를 줄일 수 있습니다.
- 이식성과 재현성: 이미지에 애플리케이션 실행 환경이 함께 정의되므로 Docker를 실행할 수 있는 환경이라면 같은 방식으로 배포하기 쉽습니다.
- 빠른 실행과 높은 자원 효율: 별도의 게스트 운영체제를 실행하는 가상머신보다 일반적으로 크기가 작고 시작이 빠르며, 하나의 호스트에서 더 많은 애플리케이션을 실행할 수 있습니다.
- 배포와 확장의 편의성: 이미지를 배포 단위로 사용하므로 동일한 컨테이너를 추가하거나 제거하는 방식으로 애플리케이션을 확장하기 쉽습니다.
- CI/CD와의 결합: 동일한 이미지를 빌드, 테스트, 배포 단계에서 사용할 수 있어 배포 과정을 표준화하고 자동화하기 좋습니다.
결국 Docker의 핵심 장점은 애플리케이션과 실행 환경을 하나의 단위로 묶어, 어디서 실행하더라도 일관된 결과를 얻도록 돕는다는 점입니다. 다만 컨테이너의 영속 데이터, 네트워크, 보안, 이미지 크기 등은 별도로 적절하게 설계해야 합니다.
Docker는 컨테이너를 어떻게 격리하고 자원을 제한하나요?
Linux의
namespace로 프로세스 ID, 네트워크, 마운트 같은 실행 환경을 분리하고,cgroup으로 CPU와 메모리 등의 사용량을 제한하고 측정합니다. 다만 컨테이너끼리 호스트 커널을 공유하므로 가상머신과 격리 경계가 동일한 것은 아닙니다.
Docker 컨테이너는 운영체제와 관계없이 항상 실행할 수 있나요?
이미지의 애플리케이션과 사용자 공간은 이식할 수 있지만 컨테이너는 호스트 커널을 공유하므로 커널과 CPU 아키텍처가 호환되어야 합니다. Windows나 macOS의 Docker Desktop에서 Linux 컨테이너를 실행할 때는 내부적으로 Linux 가상머신을 사용합니다.
컨테이너를 삭제해도 데이터를 유지하려면 어떻게 해야 하나요?
컨테이너의 쓰기 가능 레이어가 아니라 Docker Volume이나 Bind Mount 같은 외부 저장소에 데이터를 저장해야 합니다. 이렇게 하면 컨테이너를 교체하거나 삭제해도 데이터의 생명주기를 컨테이너와 분리할 수 있습니다.