Docker란?
Docker는 전통적인 가상화 기술이나 가상머신(VM)과는 다른 접근 방식을 사용하는 컨테이너 기반의 가상화 기술에 속한다. Docker는 운영 체제 수준의 가상화를 제공하여, 하나의 호스트 운영 체제 위에서 여러 독립적인 컨테이너를 실행할 수 있게 한다. 각 컨테이너는 별도의 소프트웨어, 라이브러리, 실행 환경을 포함하지만, 가상머신과 달리 하이퍼바이저를 통해 하드웨어를 에뮬레이션하지 않으며, 호스트 OS의 커널을 공유한다. 이로 인해 Docker 컨테이너는 가상머신에 비해 훨씬 가벼우며, 시작 시간이 짧고 성능 오버헤드가 적다는 장점이 있다.
Docker를 왜 쓸까?
- 경량성과 빠른 시작: 컨테이너는 VM보다 훨씬 가볍고, 필요한 리소스가 적으며, 거의 즉시 시작할 수 있다.
- 효율적인 리소스 사용: 컨테이너는 호스트 OS의 커널을 공유하고, 별도의 OS를 각각 실행하지 않기 때문에 리소스 사용이 효율적이다.
- 이식성: 컨테이너는 애플리케이션과 그 종속성을 포함하여, 어떤 환경에서든 동일하게 실행될 수 있도록 한다.
- 개발 및 운영 환경의 일관성: 개발, 테스트, 프로덕션 환경 간의 차이를 최소화하여, CI/CD 파이프라인을 통한 빠른 배포와 롤백을 가능하게 한다.
- 마이크로서비스 아키텍처 지원: 독립적으로 배포 및 확장할 수 있는 작은 서비스 단위로 애플리케이션을 구성하는 것을 용이하게 한다.
컨테이너 간섭 방지
- 네임스페이스: Docker는 리눅스 커널의 네임스페이스 기능을 사용하여, 프로세스, 네트워크 인터페이스, 마운트 포인트 등을 격리한다. 이를 통해 한 컨테이너가 다른 컨테이너의 리소스에 접근하거나 간섭하는 것을 방지한다.
- 컨트롤 그룹(cgroups): 리소스 사용량(메모리, CPU 등)을 제한하여, 한 컨테이너가 호스트 시스템의 모든 리소스를 독점하는 것을 방지한다.
보안 정책과 스캔 도구: Docker 이미지의 취약점을 스캔하고, 보안 베스트 프랙티스를 따르며, 적절한 사용자 권한을 설정하는 등의 보안 조치를 취한다.
Docker 위에 Docker 실행
Docker 위에 Docker를 실행하는 것은 기술적으로 가능하다. 이를 "Docker-in-Docker"라고 하며, 주로 CI/CD 파이프라인에서 빌드 또는 테스트 환경을 동적으로 생성할 때 사용된다. 하지만, 이 방식은 복잡성과 보안 문제를 유발할 수 있어, 대안으로 컨테이너 내에서 Docker CLI를 호스트의 Docker 데몬에 연결하여 사용하는 방법이 권장된다. 이를 위해서는 컨테이너에 Docker 클라이언트를 설치하고, 호스트의 Docker 소켓을 컨테이너에 마운트하는 방식을 사용할 수 있다.