Docker는 애플리케이션을 개발, 제공 및 실행하기 위한 개방형 플랫폼입니다. Docker를 사용하면 애플리케이션을 인프라에서 분리할 수 있으므로 소프트웨어를 빠르게 제공 할 수 있습니다. Docker를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리 할 수 있습니다. 코드를 신속하게 전달, 테스트 및 배포하는 Docker의 방법론을 활용하면 코드 작성과 프로덕션 실행 사이의 지연을 크게 줄일 수 있습니다.
Docker는 컨테이너라고 하는 느슨하게 격리된 환경에서 애플리케이션을 패키징하고 실행할 수 있는 기능을 제공합니다. 격리 및 보안을 통해 주어진 호스트에서 여러 컨테이너를 동시에 실행할 수 있습니다. 컨테이너는 하이퍼 바이저의 추가 로드가 필요하지 않기 때문에 경량이지만 호스트 시스템의 커널 내에서 직접 실행됩니다. 즉, 가상 머신을 사용하는 경우보다 주어진 하드웨어 조합에서 더 많은 컨테이너를 실행할 수 있습니다. 실제로 가상 머신인 호스트 머신 내에서 Docker 컨테이너를 실행할 수도 있습니다!
Docker는 컨테이너의 수명주기를 관리하기 위한 도구와 플랫폼을 제공합니다.
Docker Engine은 다음과 같은 주요 구성 요소가 포함 된 client-server 애플리케이션입니다.
dockerd
command)라고 하는 장기 실행 프로그램 유형인 서버.docker
command).CLI는 Docker REST API를 사용하여 스크립팅 또는 직접 CLI 명령을 통해 Docker 데몬을 제어하거나 상호 작용합니다. 다른 많은 Docker 애플리케이션은 기본 API 및 CLI를 사용합니다.
데몬은 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 생성하고 관리합니다.
Note: Docker is licensed under the open source Apache 2.0 license.
자세한 내용은 아래의 Docker Architecture를 참조하세요.
Docker는 개발자가 애플리케이션과 서비스를 제공하는 로컬 컨테이너를 사용하여 표준화된 환경에서 작업 할 수 있도록 함으로써 개발 수명주기를 간소화합니다. 컨테이너는 지속적 통합 및 지속적 배포 (CI/CD) 워크 플로에 적합합니다.
다음 예제 시나리오를 고려하십시오.
Docker의 컨테이너 기반 플랫폼은 이동성이 뛰어난 워크로드를 허용합니다. Docker 컨테이너는 개발자의 로컬 노트북, 데이터 센터의 물리적 또는 가상 머신, 클라우드 제공 업체 또는 혼합 환경에서 실행할 수 있습니다.
Docker의 휴대 성과 경량 특성 덕분에 거의 실시간으로 비즈니스 요구에 따라 애플리케이션과 서비스를 확장하거나 축소하여 워크로드를 동적으로 쉽게 관리 할 수 있습니다.
Docker는 가볍고 빠릅니다. 하이퍼 바이저 기반 가상 머신에 대한 실행 가능하고 비용 효율적인 대안을 제공하므로 더 많은 컴퓨팅 용량을 사용하여 비즈니스 목표를 달성 할 수 있습니다. Docker는 더 적은 리소스로 더 많은 작업을 수행해야하는 고밀도 환경과 중소 규모 배포에 적합합니다.
Docker는 client-server 아키텍처를 사용합니다. Docker 클라이언트는 Docker 컨테이너를 빌드, 실행 및 배포하는 무거운 작업을 수행하는 Docker 데몬과 통신합니다. Docker 클라이언트와 데몬은 동일한 시스템에서 실행되거나 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있습니다. Docker 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신합니다.
Docker daemon (dockerd
)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다. 데몬은 다른 데몬과 통신하여 Docker 서비스를 관리 할 수도 있습니다.
Docker 클라이언트 (docker
)는 많은 Docker 사용자가 Docker와 상호 작용하는 기본 방법입니다. docker run
과 같은 명령을 사용할 때 클라이언트는 이러한 명령을 dockerd
로 전송하여 실행합니다. docker
명령은 Docker API를 사용합니다. Docker 클라이언트는 둘 이상의 데몬과 통신 할 수 있습니다.
Docker registry는 Docker 이미지를 저장합니다. Docker Hub는 누구나 사용할 수있는 공용 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성됩니다. 자신의 개인 레지스트리를 실행할 수도 있습니다.
docker pull
또는 docker run
명령을 사용하면 필요한 이미지를 자신의 설정된 레지스트리에서 가져옵니다. docker push
명령을 사용하면 이미지가 자신의 설정된 레지스트리로 푸시됩니다.
Docker를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체를 생성하고 사용하게 됩니다. 이 섹션은 이러한 개체 중 일부에 대한 간략한 개요입니다.
이미지는 Docker 컨테이너를 만들기위한 지침이 있는 read-only 템플릿입니다. 종종 이미지는 몇 가지 추가 사용자 정의와 함께 다른 이미지를 기반으로합니다. 예를 들어, ubuntu
이미지를 기반으로하는 이미지를 빌드 할 수 있지만 Apache 웹 서버와 애플리케이션은 물론 애플리케이션을 실행하는 데 필요한 구성 세부 사항도 설치합니다.
자신의 이미지를 만들거나 다른 사람이 만들고 레지스트리에 게시한 이미지만 사용할 수 있습니다. 자체 이미지를 빌드하려면 이미지를 생성하고 실행하는 데 필요한 단계를 정의하는 간단한 구문으로 Dockerfile을 생성합니다. Dockerfile의 각 명령어는 이미지에 레이어를 만듭니다. Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어 만 다시 빌드됩니다. 이것은 다른 가상화 기술과 비교할 때 이미지를 매우 가볍고, 작고, 빠르게 만드는 요소의 일부입니다.
컨테이너는 이미지의 실행 가능한 인스턴스입니다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있습니다. 컨테이너를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지를 만들 수도 있습니다.
기본적으로 컨테이너는 다른 컨테이너 및 호스트 시스템과 비교적 잘 격리되어 있습니다. 컨테이너의 네트워크, 저장소 또는 기타 기본 하위 시스템이 다른 컨테이너 또는 호스트 시스템에서 분리되는 방식을 제어 할 수 있습니다.
컨테이너는 이미지와 사용자가 생성하거나 시작할 때 제공하는 구성 옵션에 의해 정의됩니다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항이 사라집니다.
docker run
command다음 명령은 우분투 컨테이너를 실행하고, 로컬 명령 줄 세션에 대화 형으로 연결하고, /bin/bash
를 실행합니다.
$ docker run -i -t ubuntu /bin/bash
이 명령을 실행하면 다음과 같은 일이 발생합니다 (기본 레지스트리 설정을 사용하고 있다고 가정).
ubuntu
이미지가 없는 경우 Docker는 수동으로 docker pull ubuntu
를 실행 한 것처럼 설정된 레지스트리에서 이미지를 가져옵니다.docker container create
명령을 수동으로 실행 한 것처럼 새 컨테이너를 만듭니다./bin/bash
를 실행합니다. 컨테이너가 대화식으로 실행되고 터미널에 연결되어 있기 때문에 (-i
및 -t
플래그로 인해) 출력이 터미널에 기록되는 동안 키보드를 사용하여 입력을 제공 할 수 있습니다.exit
를 입력하여 /bin/bash
명령을 종료하면 컨테이너가 중지되지만 제거되지는 않습니다. 다시 시작하거나 제거 할 수 있습니다.서비스를 사용하면 여러 Docker 데몬에서 컨테이너를 확장 할 수 있습니다.이 데몬은 모두 여러 관리자 및 작업자와 함께 떼처럼 함께 작동합니다. swarm의 각 구성원은 Docker 데몬이며 모든 데몬은 Docker API를 사용하여 통신합니다. 서비스를 사용하면 주어진 시간에 사용 가능해야하는 서비스 복제본 수와 같은 원하는 상태를 정의 할 수 있습니다. 기본적으로 서비스는 모든 작업자 노드에서 로드 밸런싱됩니다. 소비자에게 Docker 서비스는 단일 애플리케이션으로 보입니다. Docker Engine은 Docker 1.12 이상에서 스웜 모드를 지원합니다.
Docker는 Go 프로그래밍 언어로 작성되었으며 Linux 커널의 여러 기능을 활용하여 기능을 제공합니다.
Docker는 namespaces
라는 기술을 사용하여 컨테이너라는 격리 된 작업 공간을 제공합니다. 컨테이너를 실행하면 Docker는 해당 컨테이너에 대한 네임 스페이스 집합을 만듭니다.
이러한 네임 스페이스는 격리 계층을 제공합니다. 컨테이너의 각 측면은 별도의 네임 스페이스에서 실행되며 액세스는 해당 네임 스페이스로 제한됩니다.
Docker Engine은 Linux에서 다음과 같은 네임 스페이스를 사용합니다.
pid
namespace: Process isolation (PID: Process ID).net
namespace: Managing network interfaces (NET: Networking).ipc
namespace: Managing access to IPC resources (IPC: InterProcess Communication).mnt
namespace: Managing filesystem mount points (MNT: Mount).uts
namespace: Isolating kernel and version identifiers. (UTS: Unix Timesharing System).Linux의 Docker Engine은 제어 그룹 (cgroup
)이라는 다른 기술에도 의존합니다. cgroup은 애플리케이션을 특정 리소스 세트로 제한합니다. 제어 그룹을 통해 Docker Engine은 사용 가능한 하드웨어 리소스를 컨테이너에 공유하고 선택적으로 제한 및 제약 조건을 적용 할 수 있습니다. 예를 들어 특정 컨테이너에서 사용할 수 있는 메모리를 제한 할 수 있습니다.
Union 파일 시스템 또는 UnionFS는 레이어를 만들어 매우 가볍고 빠르게 만드는 파일 시스템입니다. Docker Engine은 UnionFS를 사용하여 컨테이너의 빌딩 블록을 제공합니다. Docker Engine은 AUFS, btrfs, vfs 및 DeviceMapper를 포함한 여러 UnionFS 변형을 사용할 수 있습니다.
Docker Engine은 네임 스페이스, 제어 그룹 및 UnionFS를 컨테이너 형식이라는 래퍼로 결합합니다. 기본 컨테이너 형식은 libcontainer
입니다. 향후 Docker는 BSD Jails 또는 Solaris Zones와 같은 기술과 통합하여 다른 컨테이너 형식을 지원할 수 있습니다.