Docker란 무엇인가?

Docker 컨테이너는 애플리케이션의 모든 코드 및 종속성을 표준 형식으로 패키징할 수 있게 해주는 컨테이너입니다. 이를 통해 애플리케이션이 컴퓨팅 환경 전반에서 빠르고 안정적으로 실행될 수 있죠. Docker 컨테이너는 라이브러리, 시스템 도구, 코드, 런타임 등 애플리케이션 실행에 필요한 모든 것을 담고 있는 인기 있는 경량의 독립형 실행 컨테이너입니다. Docker는 개발자가 컨테이너화된 애플리케이션을 빠르게 빌드, 테스트 및 배포할 수 있게 해주는 소프트웨어 플랫폼이기도 합니다.

CaaS(서비스형 컨테이너)라고도 불리는 컨테이너 서비스는 컨테이너의 수명 주기를 관리하는 관리형 클라우드 서비스입니다. 컨테이너 서비스는 컨테이너 런타임의 통합관리(시작, 중지, 확장)를 지원합니다. 컨테이너 서비스를 사용하면 애플리케이션 개발 및 배포 수명 주기를 단순화, 자동화 및 가속화할 수 있습니다.

지난 수년간 Docker 및 컨테이너 서비스는 빠르게 채택되었고, 동시에 엄청난 성공을 거두었습니다. 2013년까지만 해도 거의 알려지지 않았던, 다소 전문적인 오픈 소스 기술이었던 Docker는 표준화된 런타임 환경으로 진화했고, 이제 많은 Oracle 기업용 제품에서 Docker를 공식적으로 지원하고 있습니다.

Docker 용어 정의

Docker:

컨테이너 기술을 활용하는 앱의 개발, 제공 및 실행을 위해 설계된 소프트웨어 컨테이너 플랫폼입니다. Docker는 엔터프라이즈 에디션과 커뮤니티 에디션 이렇게 두 가진 버전으로 제공됩니다.

컨테이너:

하드웨어 가상화를 제공하는 VM과 달리 컨테이너는 '사용자 공간'을 추상화함으로써 경량의 운영체제 수준의 가상화를 제공합니다. 컨테이너는 호스트 시스템의 커널을 다른 컨테이너와 공유합니다. 호스트 운영체제에서 실행되는 컨테이너는 코드와 모든 종속성을 패키지화하여 애플리케이션이 한 환경에서 다른 환경으로 빠르고 안정적으로 실행될 수 있게 해주는 표준 소프트웨어 장치입니다. 컨테이너는 영구적이지 않으며 이미지로부터 생성됩니다.

Docker 엔진:

컨테이너를 구축 및 실행하는 오픈 소스 호스트 소프트웨어입니다. Docker 엔진은 Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE, Ubuntu 등 다양한 Windows 서버 및 Linux 운영체제에서 컨테이너를 지원하는 클라이언트 서버 애플리케이션의 역할을 합니다.

Docker 이미지:

컨테이너로 실행될 소프트웨어 모음입니다. 여기에는 Docker 플랫폼에서 실행할 수 있는 컨테이너 생성 지침이 포함되어 있습니다. 이미지는 변경할 수 없으며, 이미지를 변경하려면 새로운 이미지를 생성해야 합니다.

Docker 레지스트리:

이미지를 저장 및 다운로드할 수 있는 공간입니다. 레지스트리는 무상태성을 갖춘 확장 가능한 서버측 애플리케이션으로 Docker 이미지를 저장 및 배포합니다.

누가 Docker를 사용하나요?

Docker는 DevOps 및 개발자에게 혜택을 제공하기 위해 설계된 개방형 애플리케이션 개발 프레임워크입니다. 개발자는 Docker를 사용하여 거의 모든 곳에서 실행할 수 있는 경량의, 이식성을 갖춘, 자립형 컨테이너형 애플리케이션을 손쉽게 빌드, 패키징, 제공 및 실행할 수 있습니다. 컨테이너를 사용하면 개발자가 모든 종속성으로 애플리케이션을 패키징하고 단일 단위로 배포할 수 있습니다. 사전에 구축되고 자체적으로 유지되는 애플리케이션 컨테이너를 제공함으로써 개발자는 기본 운영체제 또는 배포 시스템에 대한 걱정 없이 애플리케이션 코드 및 사용성에만 집중할 수 있습니다.

또한 개발자는 이미 Docker 컨테이너 내에서 실행될 수 있게 설계된 수천 개의 오픈 소스 컨테이너 애플리케이션을 활용할 수 있습니다. 또한 Docker는 DevOps 팀을 위해 지속적인 통합 및 개발 도구 체인을 제공하고, 애플리케이션 배포 및 관리를 위해 시스템 아키텍처에 필요한 제약과 복잡성을 줄여줍니다. 컨테이너 통합관리 클라우드 서비스 도입을 통해, 모든 개발자는 자신의 개발 환경에서 직접 컨테이너화된 애플리케이션을 개발한 다음, 이를 관리형 Kubernetes 서비스 등 클라우드 서비스의 프로덕션 환경에서 이동 및 실행할 수 있습니다.

Docker와 개발자들

모든 개발자들은 컨테이너를 패키징할 수 있습니다. 소프트웨어 업계에 종사하는 개인들은 종종 전문성에 따라 개발자들을 프론트엔드, 백엔드 또는 그 중간에 속하는 개발자로 구분합니다. 컨테이너 패키징은 대부분 백엔드 개발자들이 담당한다고 알려져 있지만, CaaS의 기본 개념을 이해한 사람이라면 누구나 소프트웨어 개발 수명 주기의 이 특정한 영역에서 성공을 거둘 수 있습니다. 애플리케이션 종속성을 패키지화할 준비를 하기 전에 developer.oracle.com을 방문해 애플리케이션 또는 프로그램 구축에 사용할 수 있는 도구들을 숙지해 보세요.

Docker 대 Kubernetes

Linux 컨테이너는 2008년부터 존재했지만 2013년 Docker 컨테이너가 등장할 때까지 잘 알려지지 않았습니다. Docker 컨테이너의 시대가 열리면서 컨테이너화된 애플리케이션의 개발 및 배포에 대한 관심이 폭발적으로 증가했습니다. 컨테이너화된 애플리케이션의 수가 여러 서버에 배포된 수백 개의 컨테이너로 확장됨에 따라 컨테이너의 운영은 더욱 복잡해졌습니다. 그렇다면 수백 개의 컨테이너를 어떻게 조정, 확장, 관리 및 예약해야 할까요? 이때 Kubernetes가 도움을 줄 수 있습니다. Kubernetes는 Docker 컨테이너 및 워크로드를 실행할 수 있는 오픈 소스 통합관리 시스템입니다. 여러 서버에 배포된 여러 컨테이너의 확장을 위해 이동할 때 운영 복잡성을 관리하는 데 도움이 됩니다. Kubernetes 엔진은 컨테이너 수명 주기를 자동으로 통합관리하여 호스팅 인프라 전체에 애플리케이션 컨테이너를 배포합니다. Kubernetes는 수요에 따라 리소스를 빠르게 확장하거나 축소할 수 있습니다. 또한 컨테이너의 상태를 지속적으로 프로비저닝, 예약, 삭제 및 모니터링하죠.

Docker 기본 사항

Docker의 핵심 개념은 이미지와 컨테이너입니다. Docker 이미지에는 소프트웨어 실행에 필요한 모든 것, 즉 코드, 런타임(예: JVM(Java Virtual Machine)), 드라이버, 도구, 스크립트, 라이브러리, 배치 등이 포함됩니다.

Docker 컨테이너는 실행 중인 Docker 이미지 인스턴스를 의미합니다. 그러나 유형 1 또는 유형 2 하이퍼바이저를 사용하는 기존 가상화와 달리 Docker 컨테이너는 호스트 운영체제의 커널에서 실행됩니다. 그림 1에서 볼 수 있듯이 Docker 이미지 내에는 별도의 운영체제가 없습니다.

docker 기본 사항 이미지
그림 1

격리 대 가상화

모든 Docker 컨테이너에는 자체 파일 시스템, 자체 네트워크 스택(따라서 자체 IP 주소), 자체 프로세스 공간, CPU 및 메모리를 위해 정의된 리소스 제한이 있습니다. Docker 컨테이너는 운영체제를 부팅할 필요가 없기 때문에 즉시 실행됩니다. Docker의 주요 기능은 호스트 운영체제의 리소스를 분리하는 격리입니다. 호스트 운영체제 위에 게스트 운영체제를 제공하는 가상화와는 대조적이죠.

증분 파일 시스템

증분 파일 시스템 이미지
그림 2

Docker 이미지의 파일 시스템은 쓰기 시 복사(copy-on-write) 구문을 통해 계층화됩니다. 이를 통해 상속 및 재사용이 가능해지고, 디스크의 리소스가 절약되며, 증분 이미지의 다운로드가 가능해집니다.

그림 2에 나와 있는 것처럼 WebLogic 배포를 사용하는 Docker 이미지는 Oracle WebLogic Server 도메인이 있는 이미지를 기반으로 할 수 있고, 이는 WebLogic 이미지를 기반으로 할 수 있으며, 이는 Java Development Kit(JDK) 이미지를 기반으로 할 수 있기 때문에, 결과적으로 Docker 이미지는 Oracle Linux 기본 이미지를 기반으로 한다고 할 수 있습니다.

Docker 레지스트리

Docker 이미지는 구축하기 쉽다는 이점이 있고, 개발자들은 이런 Docker 이미지의 단순성과 이식성을 좋아했습니다. 하지만 이내 수천 개의 Docker 이미지를 관리하는 일이 매우 어렵다는 것을 깨달았죠. Docker 레지스트리는 이와 같은 문제를 해결합니다. Docker 레지스트리는 Docker 이미지를 저장 및 배포하기 위한 표준 방식입니다. 레지스트리는 개방형 Apache 라이선스 하의 오픈 소스 기반 저장소입니다.

또한 Docker 레지스트리는 저장소에 저장된 Docker 이미지의 액세스 관리 및 보안 개선을 지원하죠. 이미지 배포를 관리하고 애플리케이션 개발 워크플로와 통합할 수도 있습니다. 개발자는 고유한 Docker Registry를 설정하거나 Docker Hub, Oracle Container Registry, Azure Container Registry 등과 같은 호스팅된 Docker 레지스트리 서비스를 사용할 수 있습니다.

Docker Hub는 Docker에서 관리하는 호스팅된 Docker 레지스트리입니다. Docker Hub에는 소프트웨어 공급업체, 오픈 소스 프로젝트 및 커뮤니티에서 제공하는 100,000개 이상의 컨테이너 이미지가 있습니다. Docker Hub는 NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu, Oracle Linux와 같은 공식 저장소의 소프트웨어 및 애플리케이션을 포함합니다.

컨테이너를 실행할 때 Docker는 기본적으로 공용 Docker Hub에서 해당 이미지를 자동으로 가져옵니다(로컬에서 사용할 수 없는 경우). 또한 자체 이미지를 생성하여 이를 Docker Hub에 있는 공용 또는 개인 저장소로 푸시할 수도 있습니다.

그림 3: Docker 레지스트리 스크린샷
그림 3

마이크로서비스 런타임 역할을 하는 Docker

모놀리식 애플리케이션을 더 작은 마이크로서비스 청크로 자르는 아이디어는 요즘 소프트웨어 개발자들 사이에서 많은 관심을 받고 있습니다.

마이크로서비스는 하나의 프로세스로서 독립적으로 배포되고, 경량 프로토콜을 사용하여 서로 통신하며, 모든 서비스는 저마다의 데이터를 소유합니다. 마이크로서비스는 분산형 거버넌스 접근 방식을 따르기 때문에 상당히 많은 양의 인프라 자동화, 자동화된 테스트, 완전 자동화된 CD 파이프라인 및 숙련되고 민첩한 DevOps 팀이 필요합니다.

이 아키텍처 스타일에 대한 논의가 여전히 활발히 진행되고 있지만, 마이크로서비스로 분해된 애플리케이션을 프로세스 집합으로 만들어 간단히 운영할 수 있다고 가정하는 것은 안일한 생각입니다. 몇 가지 요구 사항만 언급하자면, 마이크로서비스는 호스트로부터 독립적이어야 하고, 운영체제 수준에서 격리되어야 합니다. 또한 제한된 리소스 내에서 실행되어야 하며, 확장 및 축소가 가능해야 하고, 실패한 경우 다시 시작할 수 있어야 하고, 소프트웨어에서 정의한 네트워크 계층을 통해 다른 마이크로서비스를 검색 및 연결할 수 있어야 합니다.

따라서 Docker 컨테이너에서 마이크로서비스를 실행함으로써, 이러한 목표를 대부분 달성하기 위한 확실한 출발점에 설 수 있습니다.

Docker의 두 가지 주요 측면

Docker는 두 가지 서로 다른 측면에서 소프트웨어를 빌드, 제공 및 실행하는 방식을 변경합니다:

  • 개발에서 프로덕션까지 애플리케이션을 안정적으로 구축할 수 있도록 프로세스를 개선합니다.
  • 온프레미스에서 클라우드로 이전할 수 있도록 표준 이미지 형식을 제공합니다.

두 가지 측면에 대한 자세한 설명은 아래에서 확인할 수 있습니다.

Docker 이미지—개발에서 프로덕션까지

모든 종속성을 갖춘 Docker 이미지를 생성하면 '내 개발 기기에서만 제대로 작동하는' 문제를 해결할 수 있습니다. 핵심 아이디어는 Docker 이미지가 Git와 같은 소스 코드 저장소의 빌드 파이프라인을 통해 자동으로 생성되고, 초기에 개발 환경에서 테스트된다는 것입니다. 이 변경 불가능한 이미지는 이후 Docker 레지스트리에 저장됩니다.

그림 4에 나타난 것처럼, 추가 부하 테스트, 통합 테스트, 승인 테스트 등에 동일한 이미지가 사용됩니다. 모든 환경에서 동일한 이미지가 사용됩니다. 프로덕션 데이터베이스용 JDBC URL과 같이 작지만 환경적으로 필요한 특수성은 환경 변수 또는 파일로서 컨테이너에 제공될 수 있습니다.

docker 이미지 스크린샷
그림 4

통계에 따르면 현재 모든 Docker 사용 사례의 65%가 개발 단계에 있고, 48%는 지속적인 통합을 목적으로 Docker를 사용합니다.

Docker 클라우드

Docker는 퍼블릭 클라우드 도입 양상을 변화시켰습니다. 한편으로 Docker 이미지를 통해 역사상 처음으로 온프레미스 및 모든 주요 클라우드 제공업체에서 실행할 수 있는 공통 패키지 형식이 존재하게 되었습니다. Docker 컨테이너가 노트북 컴퓨터에서와 동일한 방식으로 Oracle Cloud에서도 실행될 수 있게 된 것이죠.

다른 한편으로는, 모든 주요 퍼블릭 클라우드에서 실행되는 Docker 컨테이너는, 퍼블릭 클라우드에 대한 오랜 편견인 벤더 종속성을 극복하는 데 크게 기여했습니다. 모든 주요 클라우드 공급업체는 이제 Docker를 PaaS로 제공합니다.

ocker 버전—기본 기술의 성숙도

Docker 릴리스의 속도는 기존 엔터프라이즈 소프트웨어의 릴리스 주기보다 훨씬 빠릅니다. Docker 프로젝트의 참신함과 더불어 Docker 릴리스의 빠른 속도는 종종 Docker의 보안 및 안정성에 대한 우려를 야기합니다.

Docker 및 명령행, Docker 데몬, API 및 Docker Swarm, Docker Machine, Docker Compose 같은 도구는 겨우 지난 3년간 발전했을 뿐이지만, 기본 커널 기능은 거의 10년 가까이 모든 Linux 커널에서 사용되어 왔습니다.

컨테이너 기술의 대표적인 얼리어답터는 Google입니다. Google은 Docker가 등장하기 전에도 Linux 컨테이너를 사용해 왔습니다. 또한 Google은 모든 것을 컨테이너에서 실행합니다. Google은 매주 수십억 개의 컨테이너를 생성하는 것으로 추측됩니다.

Cgroup 및 네임스페이스 기록

Docker가 사용하는 기본 Linux 커널 기능은 cgroup 및 네임스페이스입니다. 2008년 Google 개발자가 사전에 해둔 작업을 기반으로 Cgroup이 Linux 커넬에 처음 도입되었습니다1. Cgroup은 운영체제 프로세스 집합의 리소스 사용량을 제한 및 처리합니다.

Linux 커널은 네임스페이스를 사용하여 프로세스의 시스템 리소스를 서로 분리합니다. 첫 번째 네임스페이스인 마운트 네임스페이스는 2002년에 도입되었습니다.2

컨테이너 클라우드 서비스

본 문서의 도입부에서 몇 가지 중요한 Docker의 개념들을 설명했습니다. 그러나 프로덕션 환경에서는 Docker 컨테이너에서 애플리케이션을 실행하는 것만으로 충분하지 않습니다.

프로덕션 환경을 설정 및 운영하려면 컨테이너를 실행할 하드웨어가 필요합니다. Docker와 같은 소프트웨어와 저장소 및 클러스터 관리자는 반드시 설치, 업그레이드 및 패치되어야 합니다. 호스트 간에 여러 Docker 컨테이너가 통신하는 경우 네트워크도 생성해야 하죠. 클러스터링된 컨테이너는 실패 시 재실행되어야 합니다. 또한 서로 연결된 컨테이너 세트는 단일 논리 애플리케이션 인스턴스처럼 손쉽게 배포할 수 있어야 합니다. 로드 밸런서, 몇 대의 웹 서버, 관리 서버를 갖춘 일부 Oracle WebLogic Server 인스턴스, 관리 서버 및 데이터베이스를 예로 들 수 있습니다. 컨테이너화된 애플리케이션을 대규모로 관리하려면 Kubernetes 또는 Docker Swarm과 같은 컨테이너 통합관리 시스템이 필요합니다. Kubernetes와 같은 통합관리 시스템을 배포, 관리 및 운영하는 일은 어렵고 시간이 많이 소요되는 일입니다.

개발자가 컨테이너화된 애플리케이션을 더 쉽고 효율적으로 생성할 수 있도록 클라우드 공급자는 컨테이너 클라우드 서비스 또는 CaaS(Containers as a Service)를 제공합니다. 컨테이너 클라우드 서비스는 개발자와 운영 팀이 자동화된 방식으로 컨테이너의 수명 주기를 간소화 및 관리할 수 있도록 지원합니다. 일반적으로 Kubernetes를 사용하여 구축되는 이러한 통합관리 서비스를 통해 DevOps 팀은 컨테이너화된 애플리케이션을 대규모로 손쉽게 관리하고 운영할 수 있습니다. Oracle Container Engine for Kubernetes 및 Azure Kubernetes Service는 인기 컨테이너 통합관리 관리형 클라우드 서비스의 대표적인 예입니다.

Oracle Container Engine for Kubernetes는 컨테이너화된 애플리케이션을 클라우드에 배포하는 데 사용할 수 있는 확장성과 고가용성을 갖춘 완전 관리형 서비스입니다. 클라우드 네이티브 애플리케이션을 안정적으로 빌드, 배포 및 관리하고 싶다면 Oracle Container Engine for Kubernetes(줄여서 OKE) 사용을 권장합니다.

Oracle의 Docker 이미지

모든 개발자들은 컨테이너를 패키징할 수 있습니다. 소프트웨어 업계에 종사하는 개인들은 종종 전문성에 따라 개발자들을 프론트엔드, 백엔드 또는 그 중간에 속하는 개발자로 구분합니다. 컨테이너 패키징은 대부분 백엔드 개발자들이 담당한다고 알려져 있지만, CaaS의 기본 개념을 이해한 사람이라면 누구나 소프트웨어 개발 수명 주기의 이 특정한 영역에서 성공을 거둘 수 있습니다. 애플리케이션 종속성을 패키지화할 준비를 하기 전에 developer.oracle.com을 방문해 애플리케이션 또는 프로그램 구축에 사용할 수 있는 도구들을 숙지해 보세요.

다음은 Oracle 제품용 Docker 이미지를 가져오거나 구축하는 데 필요한 소스입니다. Docker 이미지용 Oracle GitHub 저장소에는 Oracle 상용 제품 및 Oracle에서 후원하는 오픈 소스 프로젝트용 Docker 이미지 구축을 위한 Docker 파일 및 샘플이 포함되어 있습니다.

Docker 실습 랩—Docker를 활용한 컨테이너 개발

참고 자료

  1. Cgroup(Wikipedia)
  2. Linux Namespaces(Wikipedia)