요약
"Docker(도커)"는 오픈소스 커뮤니티 프로젝트, 오픈소스 프로젝트 툴, 해당 프로젝트를 주로 지원하는 기업인 Docker Inc. 및 해당 기업이 공식 지원하는 툴을 포함해 여러 의미를 뜻합니다. 기술과 기업의 명칭이 같아서 혼란스러울 수도 있습니다.
간단하게 그 개념을 설명하면 다음과 같습니다.
- IT 소프트웨어 "Docker"는 Linux® 컨테이너를 만들고 사용할 수 있도록 하는 컨테이너화 기술입니다.
- 오픈소스 Docker 커뮤니티는 모든 사용자가 혜택을 누릴 수 있도록 이러한 기술을 개선하기 위해 노력합니다.
- Docker Inc.라는 기업은 Docker 커뮤니티의 작업을 기반으로 하여 보안을 강화하고 이러한 개선 사항을 더 큰 커뮤니티에 공유합니다. 그런 다음 엔터프라이즈 고객을 위해 개선되고 강화된 기술을 지원합니다.
Docker를 사용하면 컨테이너를 매우 가벼운 모듈식 가상 머신처럼 다룰 수 있습니다. 또한 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있어, 애플리케이션을 클라우드에 최적화하도록 지원합니다.
도커 컨테이너(Docker Container) 실행 방식
Docker 기술은 Linux 커널과 Cgroups 및 네임스페이스 등 커널의 기능을 사용하여 프로세스를 분리함으로써 독립적으로 실행할 수 있도록 합니다. 이러한 독립성은 컨테이너의 본래 목적입니다. 다시 말해서, 여러 프로세스와 애플리케이션을 서로 개별적으로 실행하여 인프라를 더 효과적으로 활용하고 개별 시스템을 사용할 때와 동일한 보안을 유지할 수 있습니다.
Docker를 포함한 컨테이너 툴은 이미지 기반 배포 모델을 제공합니다. 따라서 여러 환경 전반에서 애플리케이션 또는 서비스를 모든 종속 항목과 손쉽게 공유할 수 있습니다. 또한 Docker는 이 컨테이너 환경 내에서 애플리케이션(또는 애플리케이션을 구성하는 결합된 프로세스) 배포를 자동화합니다.
이러한 툴은 Linux 컨테이너를 기반으로 구축되어 Docker를 사용자 친화적이고 고유하게 만들어 주므로 사용자는 그 어느 때보다 쉽게 애플리케이션에 액세스하고, 신속하게 배포하고, 버전 및 버전 배포를 제어할 수 있습니다.
도커와 리눅스 컨테이너 차이점
헷갈릴 수도 있지만 Docker는 전통적인 Linux 컨테이너와는 다릅니다. Docker 기술은 처음에는 LXC 기술을 기반으로 개발되었지만 이후에는 이러한 종속 관계를 벗어났습니다. 하지만 대부분의 사람들은 "전통적인" Linux 컨테이너와 연결지어 생각합니다. LXC는 경량의 가상화 방법으로 유용했지만, 뛰어난 개발자 또는 사용자 환경을 제공하지는 못했습니다. Docker 기술은 컨테이너를 구동하는 기능 이상의 것을 제공합니다. 컨테이너 생성 및 구축, 이미지 전송, 이미지 버전 관리 등의 프로세스를 용이하게 해줍니다.
전통적인 Linux 컨테이너는 멀티플 프로세스를 관리할 수 있는 init 시스템을 사용합니다. 즉, 전체 애플리케이션을 하나로 실행할 수 있습니다. Docker 기술은 애플리케이션을 개별 프로세스로 세분화하도록 권장하고 이를 위한 툴을 제공합니다. 이러한 세분화된 접근 방식에는 장점이 있습니다.
도커 컨테이너의 장점
모듈성
컨테이너화에 대한 Docker 접근 방식은 전체 애플리케이션을 분해하지 않고도 업데이트 또는 복구를 위해 애플리케이션의 일부를 분해하는 기능에 중점을 둡니다. 이러한 마이크로서비스 기반 접근 방식 외에도 서비스 지향 아키텍처(SOA)와 거의 같은 방식으로 멀티플 애플리케이션 간에 프로세스를 공유할 수 있습니다.
계층 및 이미지 버전 제어
각 Docker 이미지 파일은 일련의 계층으로 구성되며 이러한 계층들은 단일 이미지로 결합됩니다. 계층은 이미지가 변경될 때 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성됩니다.
Docker는 이러한 계층을 재사용하여 새 컨테이너를 구축하는데, 이때 구축 프로세스 속도가 빨라집니다. 중간 변경 사항은 이미지 간에 공유되므로 속도와 크기, 효율성이 더욱 향상됩니다. 또한 계층화에는 버전 제어가 내재되어 있습니다. 새로운 변경 사항이 있을 때마다 변경 로그가 기본 제공되므로 컨테이너 이미지를 완벽하게 제어할 수 있습니다.
롤백
계층화의 가장 큰 장점은 아마 롤백 기능일 것입니다. 모든 이미지에는 계층이 있습니다. 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백하면 됩니다. 이 기능은 애자일 개발 접근 방식을 지원하며 툴 관점에서 실제로 지속적 통합 및 배포(CI/CD)를 수행하는 데 도움을 줍니다.
신속한 배포
이전에는 새로운 하드웨어를 확보, 실행, 프로비저닝, 제공하는 데 며칠이 걸렸으며, 이를 위한 작업 및 오버헤드 부담도 상당했습니다. Docker 기반 컨테이너는 배포 시간을 몇 초로 줄일 수 있습니다. 각 프로세스에 대한 컨테이너를 생성하면 해당 프로세스를 새 애플리케이션과 빠르게 공유할 수 있습니다. 또한 컨테이너를 추가하거나 이동하기 위해 운영 체제를 부팅할 필요가 없으므로 배포 시간이 상당히 단축됩니다. 배포 시간이 단축되면 컨테이너에서 생성한 데이터를 쉽고 비용 효율적으로 생성하고 제거할 수 있습니다.
따라서 Docker 기술은 효율성을 더욱 중요시하며 더욱 세분화되고 제어 가능한 마이크로서비스 기반 접근 방식입니다.
도커 사용법
Docker는 자체적으로 단일 컨테이너를 관리할 수 있습니다. 수백 개로 세분화된 컨테이너와 컨테이너화된 애플리케이션을 점점 더 많이 사용하게 되면 관리 및 오케스트레이션이 어려워질 수 있습니다. 결국 모든 컨테이너 전반에서 네트워킹, 보안, 텔레메트리 등의 서비스를 제공하려면 한 걸음 물러서서 컨테이너를 그룹화해야 합니다. 바로 여기에 쿠버네티스가 사용됩니다.
Docker를 사용하면 전통적인 Linux 컨테이너에서 제공되는 것과 동일한 UNIX와 같은 기능을 사용할 수 없습니다. 여기에는 컨테이너 내에서 애플리케이션과 함께 cron 또는 syslog와 같은 프로세스 사용 기능이 포함됩니다. 하위 프로세스를 종료한 후 손자 프로세스를 정리하는 작업(기존 Linux 컨테이너에서 기본적으로 처리하는 작업) 등에도 제한이 있습니다. 이러한 문제는 처음부터 바로 드러나지는 않지만 초기에 구성 파일을 수정하고 이러한 기능을 설정하면 완화할 수 있습니다.
이 외에도 네임스페이스가 지정되지 않은 다른 Linux 하위 시스템 및 기기가 있습니다. 여기에는 SELinux, Cgroups, /dev/sd* 기기 등이 있습니다. 그렇기 때문에 공격자가 이러한 하위 시스템에 대한 제어 권한을 얻을 경우 호스트가 손상됩니다. 경량을 유지하기 위해 호스트 커널을 컨테이너와 공유할 경우 이러한 보안 취약점이 발생할 수 있습니다. 호스트 커널은 호스트 시스템에서 훨씬 더 확실히 분리된 가상 머신과 다릅니다.
Docker 데몬에도 보안 우려 사항이 있을 수 있습니다. Docker 컨테이너를 사용하고 실행하기 위해 가장 많이 사용하는 것이 컨테이너의 퍼시스턴트 런타임인 Docker 데몬입니다. Docker 데몬에는 루트 권한이 필요하므로 이 프로세스에 액세스할 수 있는 사람과 프로세스 상주 위치에 각별히 주의를 기울여야 합니다. 예를 들어, 로컬 데몬의 공격 표면은 비교적 더 공개된 위치에 상주하는 데몬(예: 웹 서버)보다 작습니다.