컨테이너

Docker란 무엇일까요?

"Docker"는 여러 가지 요소를 나타냅니다. 여기에는 오픈소스 커뮤니티 프로젝트, 오픈소스 프로젝트의 툴, Docker, 프로젝트의 주요 지지자인 회사, 이전에 회사에서 지원했던 툴이 포함됩니다. 기술의 이름과 회사의 이름이 같다는 것이 다소 혼란스러우실 수도 있을 겁니다.

간단히 설명하자면 이렇습니다.

  • IT 소프트웨어인 "Docker”는 Linux® 컨테이너를 만들고 사용할 수 있도록 하는 컨테이너화 기술입니다.
  • 오픈소스 Docker 커뮤니티는 모든 사용자가 무료로 이점을 얻을 수 있도록 이러한 기술을 개선하기 위해 노력하고 있습니다.
  • Docker Inc.는 Docker 커뮤니티의 활동에 기반을 두고 있으며 Docker 커뮤니티의 보안을 강화하고 개선 사항을 공유하여 커뮤니티를 발전시킵니다. 그리고 엔터프라이즈 고객을 위한 향상되고 강화된 기술을 지원합니다.

Docker를 사용하면 컨테이너를 매우 가벼운 모듈식 가상 머신처럼 다룰 수 있습니다. 또한 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있습니다.


Docker는 어떻게 작동하나요?

Docker기술은 Linux 커널과 함께 Cgroups네임스페이스와 같은 커널의 기능을 사용하여 프로세스를 분리함으로써 독립적으로 실행될 수 있도록 합니다. 이러한 독립성은 컨테이너의 본래 목적입니다. 다시 말해서, 여러 프로세스와 앱을 서로 개별적으로 실행하여 인프라를 더 효과적으로 활용하고 개별 시스템을 사용할 때와 동일한 보안을 유지할 수 있습니다.

Docker를 포함한 컨테이너 툴은 이미지 기반 배포 모델을 제공하므로 여러 환경 전반에서 애플리케이션 또는 서비스를 모든 종속 항목과 손쉽게 공유할 수 있습니다. 또한 Docker는 이 컨테이너 환경 내에서 애플리케이션(또는 앱을 구성하는 결합된 프로세스) 배포를 자동화합니다.

이러한 툴은 Linux 컨테이너를 기반으로 구축되어 Docker를 사용자 친화적이고 고유하게 만들어 주므로 사용자는 그 어느 때보다도 쉽게 앱에 액세스해 빠르게 배포하고 버전 및 버전 배포를 관리할 수 있습니다.


Docker 기술이 기존의 Linux 컨테이너와 동일한가요?

그렇지 않습니다. Docker 기술은 처음에 LXC 기술을 기반으로 구축되긴 했으나, 그 이후로는 종속 관계를 벗어났습니다. 하지만 대부분의 사용자는 "기존의" Linux 컨테이너와 연결지어 생각하고 있습니다. LXC는 경량의 가상화 방법으로 유용하게 사용되었지만 개발자 또는 사용자에게 우수한 경험을 제공하지는 못했습니다. Docker 기술은 컨테이너를 실행하는 기능 이상의 것을 제공하며 무엇보다도 컨테이너 생성 및 구축, 이미지 전송, 이미지 버전 관리 프로세스를 용이하게 해 줍니다.

전통적인 Linux 컨테이너는 멀티플 프로세스를 관리할 수 있는 초기화 시스템을 사용합니다. 즉, 전체 애플리케이션을 하나로 실행할 수 있습니다. Docker 기술은 애플리케이션이 개별 프로세스로 세분화되도록 하며 이를 수행할 수 있는 툴을 제공합니다. 이 세분화된 접근 방식에는 이점이 있습니다.


Docker 컨테이너의 이점

모듈성

Docker의 컨테이너화 접근 방식은 전체 애플리케이션을 분해할 필요 없이 애플리케이션의 일부를 분해하고, 업데이트 또는 복구하는 능력에 집중되어 있습니다. 사용자는 이 마이크로서비스 기반 접근 방식 외에도 SOA(service-oriented architecture)의 작동 방식과 동일하게 멀티플 애플리케이션 사이에서 프로세스를 공유할 수 있습니다.

계층 및 이미지 버전 제어

각 Docker 이미지 파일은 일련의 계층으로 이루어져 있으며 이 계층들은 단일 이미지로 결합됩니다. 이미지가 변경될 때 계층이 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성됩니다.

Docker는 새로운 컨테이너를 구축할 때 이러한 계층을 재사용하므로 구축 프로세스가 훨씬 더 빨라집니다. 중간 변경 사항이 이미지 사이에서 공유되므로 속도, 규모, 효율성이 더 개선됩니다. 계층화에는 버전 관리가 내재되어 있으며 새로운 변경 사항이 발생할 때마다 내장 변경 로그가 기본적으로 적용되므로 컨테이너 이미지를 완전히 제어할 수 있습니다.

롤백

계층화에서 가장 유용한 부분은 아마도 롤백 기능일 것입니다. 모든 이미지에는 계층이 있으며, 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백하면 됩니다. 이 기능은 애자일(agile) 개발 접근 방식을 지원하며 툴 관점에서 실제로 지속적인 통합 및 연속 배포(CI/CD)를 수행하는 데 도움을 줍니다.

신속한 배포

새로운 하드웨어를 준비하고, 실행하고, 프로비저닝하고, 사용할 수 있게 하려면 일반적으로 며칠이 소요되었습니다. 많은 노력과 부가적인 업무가 필요하므로 부담도 상당했습니다. Docker 기반 컨테이너는 배포 시간을 몇 초로 단축할 수 있습니다. 각 프로세스에 대한 컨테이너를 생성함으로써 사용자는 유사한 프로세스를 새 앱과 빠르게 공유할 수 있습니다. 또한, 컨테이너를 추가하거나 이동하기 위해 OS를 부팅할 필요가 없으므로 배포 시간이 크게 단축됩니다. 이뿐만 아니라 배포 속도가 빨라 컨테이너에서 생성된 데이터를 비용 효율적으로 쉽게 생성하고 삭제할 수 있고 사용자는 우려를 할 필요가 없습니다.

즉, Docker 기술은 효율성을 중시하며 더 세분화되고 제어 가능한 마이크로서비스 기반 접근 방식입니다.


Docker를 사용하는 데 제약이 있으신가요?

Docker는 단일 컨테이너 관리에 적합하도록 만들어져 있습니다. 수백 개로 세분화된 컨테이너와 컨테이너화된 앱을 점점 더 많이 사용하기 시작하면 관리와 오케스트레이션이 매우 어려워질 수 있습니다. 결국 모든 컨테이너 전체에서 네트워킹, 보안, 텔레메트리와 같은 서비스를 제공하기 위해서는 한 걸음 물러나서 컨테이너를 그룹화해야 합니다. 바로 여기에 Kubernetes가 사용됩니다.

Docker에서는 전통적인 Linux 컨테이너에서 제공되는 것과 동일한 UNIX와 같은 기능을 사용할 수 없습니다. 여기에는 컨테이너 내에서 애플리케이션과 함께 cron 또는 syslog와 같은 프로세스를 사용할 수 있는 기능이 포함됩니다. 또한 자식 프로세스를 종료한 후에 손자 프로세스를 정리하는 작업 등 기존의 Linux 컨테이너에서 기본적으로 처리되는 작업에 대한 제약이 있습니다. 이러한 문제는 처음부터 바로 드러나지는 않지만 초기에 설정 파일을 수정하고 이러한 기능을 셋업하여 완화할 수 있습니다.

네임스페이스가 없는 기타 Linux 하위 시스템과 장치도 있습니다. 여기에는 SELinux, Cgroups 및 /dev/sd* 장치가 포함됩니다. 그렇기 때문에 공격자가 이러한 하위 시스템에 대한 제어 권한을 얻을 경우 호스트가 손상됩니다. 경량을 유지하기 위해 호스트 커널을 컨테이너와 공유할 경우 이러한 보안 취약점이 발생할 수 있습니다. 호스트 커널은 호스트 시스템에서 훨씬 더 확실히 분리된 가상 머신과 다릅니다.

Docker 데몬에도 보안 문제는 있을 수 있습니다. Docker 컨테이너를 사용하고 실행하기 위해 가장 많이 사용하는 것이 컨테이너의 퍼시스턴트 런타임인 Docker 데몬입니다. Docker 데몬을 사용하려면 루트 권한이 필요하므로 이 프로세스에 액세스할 수 있는 사람과 프로세스가 상주하는 위치에 각별한 주의를 기울여야 합니다. 예를 들어, 로컬 데몬은 웹 서버와 같은 퍼블릭 위치에 상주하는 데몬보다 공격에 대한 취약성이 낮습니다.

컨테이너를 활용하는 방법을 살펴 보세요