Docker 개요
Docker는 프랑스에 기반을 둔 dotCloud라는 회사의 설립자인 솔로몬 하이크스(Solomon Hykes)에 의해 처음 시작된 내부 프로젝트였습니다. 이것은 dotCloud의 수년간의 클라우드 서비스 기술에 기반한 혁신이었으며, 2013년 3월에 Apache 2.0 라이선스로 오픈 소스화 되었습니다. 주요 프로젝트 코드는 GitHub에서 유지되며, 프로젝트는 Moby로 이름이 변경되었습니다. 나중에 Docker 프로젝트는 리눅스 재단에 합류하여 오픈 컨테이너 이니셔티브(OCI)를 설립했습니다.
오픈 소스화된 후, Docker는 광범위한 관심과 토론을 받았으며, GitHub 프로젝트는 현재까지 67,000개가 넘는 스타와 18,000개 이상의 포크를 누적하였습니다. Docker 프로젝트의 인기로 인해 dotCloud는 2013년 말 Docker로 브랜드를 변경하기로 결정했습니다. Docker는 초기에 우분투 12.04에서 개발 및 구현되었으며, 레드 햇은 RHEL 6.5부터 Docker를 지원하기 시작했고, 구글은 PaaS 제품에서 Docker를 광범위하게 사용했습니다.
Docker는 Google이 도입한 Go라는 프로그래밍 언어를 사용하여 개발되었으며, cgroups, namespaces, OverlayFS 유형의 Union FS와 같은 리눅스 커널 기술을 활용합니다. 그것은 운영 체제 수준에서 프로세스를 캡슐화하고 격리합니다. 격리된 프로세스는 호스트 및 다른 격리된 프로세스와 독립되어 있기 때문에 컨테이너라고 합니다. 초기 구현은 LXC를 기반으로 했지만, 버전 0.7부터는 LXC가 제거되고 Docker는 자체 개발한 libcontainer를 사용하기 시작했습니다. 버전 1.11에서는 runC와 containerd를 사용하여 더욱 발전했습니다.
Docker란 무엇인가
Docker는 애플리케이션을 개발하고, 전송하며 실행하기 위한 공개 플랫폼입니다. Docker를 사용하면 인프라로부터 애플리케이션을 분리하여 소프트웨어를 빠르게 전달할 수 있습니다. Docker를 사용하면 애플리케이션을 관리하는 것처럼 인프라를 관리할 수 있습니다. Docker의 배송, 테스팅 및 배포 방법론을 활용함으로써, 코드를 작성하고 프로덕션에서 실행되는 사이의 지연을 크게 줄일 수 있습니다.
Docker 사용 이유
새로운 가상화 방법으로서 Docker는 전통적인 가상화 접근 방식에 비해 여러 가지 이점을 제공합니다.
더 효율적인 자원 활용 컨테이너는 하드웨어 가상화나 완전한 운영 체제를 실행할 필요가 없기 때문에 Docker는 시스템 자원을 더 효율적으로 활용합니다. 애플리케이션 실행 속도, 메모리 소비량 또는 파일 저장 속도에 있어서 Docker는 전통적인 가상화 기술보다 우수한 성능을 보입니다. 결과적으로 같은 구성의 호스트는 종종 더 많은 애플리케이션을 실행할 수 있습니다.
더 빠른 시작 시간 전통적인 가상 머신 기술은 애플리케이션 서비스를 시작하는 데 종종 몇 분이 걸리는 반면, Docker 컨테이너는 완전한 운영 체제를 부팅할 필요 없이 호스트 커널에서 직접 실행되기 때문에 거의 즉시 시작할 수 있으며, 보통 몇 초 혹은 심지어 밀리초 내에 시작할 수 있습니다. 이것은 개발, 테스팅 및 배포 시간을 크게 줄입니다.
일관된 런타임 환경 개발 과정에서 흔히 발생하는 문제는 환경 불일치입니다. 개발, 테스팅 및 생산 환경 간의 차이로 인해 일부 버그는 개발 중에 발견되지 않을 수 있습니다. Docker 이미지는 커널을 제외한 완전한 런타임 환경을 제공하여 애플리케이션 런타임 환경의 일관성을 보장하고 "내 기계에서는 작동하는데" 문제를 방지합니다.
지속적인 배송 및 배포 개발자와 운영(DevOps) 인력에게 이상적인 시나리오는 한 번 만들거나 구성하고 어디에서나 올바르게 실행되는 것입니다.
Docker는 애플리케이션 이미지를 맞춤화함으로써 지속적인 통합, 지속적인 배송 및 배포를 가능하게 합니다. 개발자는 Dockerfiles를 사용하여 이미지를 빌드하고 지속적인 통합 시스템과 통합하여 테스팅할 수 있습니다. 운영 팀은 이 이미지를 생산 환경에 빠르게 배포할 수 있으며, 지속적인 배송/배포 시스템과 통합하여 자동 배포를 할 수 있습니다.
Dockerfiles를 사용하면 이미지 빌딩이 투명해지고 개발 및 운영 팀 모두 애플리케이션의 런타임 환경과 배포 요구 사항을 이해할 수 있어 생산 환경에서 이미지를 더 잘 배포할 수 있습니다.
더 쉬운 마이그레이션 Docker는 런타임 환경의 일관성을 보장하기 때문에 애플리케이션 마이그레이션이 더욱 간단해집니다. Docker는 물리적 기계, 가상 머신, 공용 클라우드, 개인 클라우드, 심지어 랩톱 등 다양한 플랫폼에서 실행될 수 있으며 일관된 결과를 제공합니다. 사용자는 애플리케이션이 한 플랫폼에서 다른 플랫폼으로 마이그레이션되더라도 런타임 환경의 변화로 인해 애플리케이션이 제대로 작동하지 않는 문제에 대해 걱정할 필요가 없습니다.
더 쉬운 유지보수 및 확장성 Docker의 계층화된 저장 및 이미지 기술은 중복된 애플리케이션 구성 요소를 재사용하기 쉽게 만들어 애플리케이션 유지보수 및 업데이트를 단순화합니다. 기반 이미지를 기반으로 이미지를 확장하는 것도 매우 간단해집니다. 또한, Docker 팀과 다양한 오픈 소스 프로젝트 팀은 생산 환경에서 직접 사용할 수 있는 높은 품질의 공식 이미지들을 대규모로 유지 관리하고 있으며, 이는 더 나아가 맞춤화할 수 있는 기반이 되어 애플리케이션 서비스 이미지를 만드는 비용을 크게 줄입니다.
Docker 아키텍처
Docker는 클라이언트-서버 아키텍처를 사용합니다. Docker 클라이언트는 Docker 데몬과 통신하여 Docker 컨테이너를 빌드하고, 실행하며 배포합니다. Docker 클라이언트와 데몬은 동일한 시스템에서 실행하거나 Docker 클 라이언트를 원격 Docker 데몬에 연결할 수 있습니다. Docker 클라이언트와 데몬은 REST API, UNIX 소켓 또는 네트워크 인터페이스를 통해 통신합니다. 또 다른 Docker 클라이언트는 Docker Compose로, 컨테이너 세트로 구성된 애플리케이션을 작업할 수 있습니다.
Docker 데몬
Docker 데몬(dockerd)은 Docker API 요청을 듣고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다. 데몬은 Docker 서비스를 관리하기 위해 다른 데몬과도 통신할 수 있습니다.
Docker 클라이언트
Docker 클라이언트(docker)는 많은 Docker 사용자가 Docker와 상호 작용하는 주요 방법입니다. docker run
과 같은 명령을 사용할 때, 클라이언트는 이러한 명령을 dockerd에 보내고, dockerd는 이를 수행합니다. docker
명령은 Docker API를 사용합니다. Docker 클라이언트는 하나 이상의 데몬과 통신할 수 있습니다.
Docker 데스크톱
Docker 데스크톱은 Mac, Windows 또는 Linux 환경에서 쉽게 설치할 수 있는 응용 프로그램으로, 컨테이너화된 애플리케이션과 마이크로서비스를 빌드하고 공유할 수 있습니다. Docker 데스크톱에는 Docker 데몬(dockerd), Docker 클라이언트(docker), Docker Compose, Docker Content Trust, Kubernetes 및 Credential Helper가 포함되어 있습니다. 자세한 정보는 Docker 데스크톱을 참조하세요.
Docker 레지스트리
Docker 레지스트리는 Docker 이미지를 저장합니다. Docker Hub는 누구나 사용할 수 있는 공개 레지스트리이며, Docker는 기본적으로 Docker Hub에서 이미지를 찾습니다. 심지어 자신만의 개인 레지스트리를 운영할 수도 있습니다.
docker pull
또는 docker run
명령을 사용할 때, Docker는 구성된 레지스트리에서 필요한 이미지를 가져옵니다. docker push
명령을 사용할 때, Docker는 이미지를 구성된 레지스트리로 푸시합니다.
Docker 객체
Docker를 사용할 때 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체를 생성하고 사용합니다. 이 섹션은 그러한 객체 중 일부에 대한 간략한 개요입니다.
이미지
이미지는 Docker 컨테이너를 생성하기 위한 지침이 포함된 읽기 전용 템플릿입니다. 종종 이미지는 다른 이미지를 기반으로 하며, 추가 맞춤화가 이루어집니다. 예를 들어, 우분투 이미지를 기반으로 하고 아파치 웹 서버와 애플리케이션을 설치하고, 애플리케이션을 실행하는 데 필요한 구성 세부 정보를 설치하는 이미지를 빌드할 수 있습니다.
자신만의 이미지를 만들거나, 레지스트리에 공개된 다른 사람이 만든 이미지만 사용할 수 있습니다. 자신의 이미지를 빌드하려면 이미지를 생성하고 실행하는 데 필요한 단계를 정의하는 간단한 구문을 사용하여 Dockerfile을 만듭니다. Dockerfile의 각 명령은 이미지의 레이어를 생성합니다. Dockerfile을 변경하고 이미지를 다시 빌드할 때, 변경된 레이어만 다시 빌드됩니다. 이것은 이미지가 다른 가상화 기술에 비해 경량이고, 작고, 빠른 이유 중 일부입니다.
컨테이너
컨테이너는 이미지의 실 행 가능한 인스턴스입니다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있습니다. 컨테이너를 하나 이상의 네트워크에 연결하고 스토리지를 연결하거나, 그것의 현재 상태를 기반으로 새로운 이미지를 생성할 수도 있습니다.
기본적으로 컨테이너는 다른 컨테이너 및 호스트 기계와 상당히 잘 격리됩니다. 컨테이너의 네트워크, 스토리지 또는 기타 기본 시스템이 다른 컨테이너 또는 호스트 기계와 얼마나 격리되어 있는지를 제어할 수 있습니다.
컨테이너는 이미지 및 생성 또는 시작할 때 제공하는 모든 구성 옵션에 의해 정의됩니다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태의 모든 변경 사항이 사라집니다.