도커 개요

Docker overview

Docker는 응용 프로그램을 개발, 배포 및 실행하기위한 개방형 플랫폼입니다.
Docker를 사용하면 인프라에서 응용 프로그램을 분리하여 소프트웨어를 신속하게 제공 할 수 있습니다.
Docker를 사용하면 응용 프로그램을 관리하는 것과 동일한 방법으로 인프라를 관리 할 수 ​​있습니다.
코드를 신속하게 선적, 테스트 및 배포하는 Docker의 방법론을 활용하면 코드 작성과 프로덕션 환경에서의 실행 간의 지연을 크게 줄일 수 있습니다.

The Docker platform

Docker는 컨테이너라고하는 느슨한 격리 환경에서 응용 프로그램을 패키징하고 실행할 수있는 기능을 제공합니다.
격리 및 보안을 통해 주어진 호스트에서 여러 컨테이너를 동시에 실행할 수 있습니다.
컨테이너는 하이퍼 바이저의 추가로드가 필요 없기 때문에 경량이지만 호스트 시스템의 커널 내에서 직접 실행됩니다.
즉, 가상 시스템을 사용하는 경우보다 특정 하드웨어 조합에서 더 많은 컨테이너를 실행할 수 있습니다.
실제로 가상 머신 인 호스트 시스템 내에서 Docker 컨테이너를 실행할 수도 있습니다.

Docker는 컨테이너의 수명주기를 관리하는 툴링 및 플랫폼을 제공합니다.

  • 컨테이너를 사용하여 응용 프로그램과 지원 구성 요소를 개발하십시오.
  • 컨테이너는 응용 프로그램을 배포하고 테스트하는 단위가됩니다.
  • 준비가되면 응용 프로그램을 컨테이너 또는 통합 서비스로 프로덕션 환경에 배포하십시오.
    이는 프로덕션 환경이 로컬 데이터 센터, 클라우드 공급자 또는 이 둘의 하이브리드 여부에 관계없이 동일하게 작동합니다.

Docker Engine

Docker Engine 은 다음과 같은 주요 구성 요소가있는 클라이언트 - 서버 응용 프로그램입니다.

  • 데몬 프로세스 (dockerd 명령) 라고하는 장기 실행 프로그램 유형의 서버입니다.
  • 프로그램이 데몬과 대화하고 무엇을해야하는지 지시하는 데 사용할 수있는 인터페이스를 지정하는 REST API입니다.
  • 명령 행 인터페이스 (CLI) 클라이언트 (docker 명령).

CLI는 Docker REST API를 사용하여 스크립팅 또는 직접 CLI 명령을 통해 Docker 데몬을 제어하거나 상호 작용합니다.
다른 많은 Docker 응용 프로그램은 기본 API 및 CLI를 사용합니다.

데몬은 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 만들고 관리합니다 .

Docker는 무엇을 할수있나요?

애플리케이션의 빠르고 일관된 전달

Docker는 개발자가 응용 프로그램 및 서비스를 제공하는 로컬 컨테이너를 사용하여 표준화 된 환경에서 작업 할 수 있도록하여 개발 수명주기를 간소화합니다.
컨테이너는 지속적인 통합 및 지속적인 전달 (CI / CD) 워크 플로우에 유용합니다.

다음 예제 시나리오를 고려하십시오.

  • 개발자는 코드를 로컬에서 작성하고 Docker 컨테이너를 사용하여 동료와 작업을 공유합니다.
  • Docker를 사용하여 응용 프로그램을 테스트 환경에 적용하고 자동화 된 수동 테스트를 실행합니다.
  • 개발자가 버그를 발견하면 개발 환경에서 버그를 수정하고 테스트 및 검증을 위해 테스트 환경에 재배포 할 수 있습니다.
  • 테스트가 완료되면 업데이트 된 이미지를 프로덕션 환경으로 푸는 것만 큼 간단합니다.

응답 성있는 배포 및 확장

Docker의 컨테이너 기반 플랫폼은 이동성이 뛰어난 워크로드를 허용합니다.
Docker 컨테이너는 개발자의 로컬 랩톱, 데이터 센터의 실제 또는 가상 컴퓨터, 클라우드 공급자 또는 여러 환경에서 실행될 수 있습니다.

Docker의 이식성과 가벼운 특성으로 인해 워크로드를 동적으로 관리하고 비즈니스 요구 사항에 따라 애플리케이션 및 서비스를 거의 실시간으로 축소 또는 확장 할 수 있습니다.

동일한 하드웨어에서 더 많은 작업 부하 실행

Docker는 가볍고 빠릅니다. Hypervisor 기반 가상 시스템 대신 실용적이고 비용 효율적인 대안을 제공하므로 더 많은 컴퓨팅 기능을 사용하여 비즈니스 목표를 달성 할 수 있습니다.
Docker는 고밀도 환경과 적은 리소스로 더 많은 작업을 수행해야하는 중소 규모 배포 환경에 이상적입니다.

Docker architecture

Docker는 클라이언트 - 서버 아키텍처를 사용합니다.
Docker 클라이언트 는 Docker 데몬 과 대화를합니다.
Docker 데몬 은 Docker 컨테이너를 구축, 실행 및 배포하는 작업을 많이 수행합니다.
Docker 클라이언트와 데몬 은 동일한 시스템에서 실행되거나 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있습니다.
Docker 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신합니다.

The Docker daemon

Docker 데몬 (dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다.
데몬은 Docker 서비스를 관리하기 위해 다른 데몬과 통신 할 수도 있습니다.

The Docker client

Docker 클라이언트 (docker)는 많은 Docker 사용자가 Docker와 상호 작용하는 주요 방법입니다.

docker run 명령을 사용 하면 클라이언트가 dockerd에게 다음 명령을 전송합니다.
이 docker 명령은 Docker API를 사용합니다.
Docker 클라이언트는 둘 이상의 데몬과 통신 할 수 있습니다.

Docker registries

Docker 레지스트리 는 Docker 이미지를 저장합니다.
Docker Hub는 누구나 사용할 수있는 공용 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있습니다.
자신의 개인 레지스트리를 실행할 수도 있습니다.
DDC(Docker Datacenter)을 사용하는 경우 DTR(Docker Trusted Registry)이(가) 포함됩니다.

docker pull 또는 docker run 명령을 사용하면 구성된 레지스트리에서 필요한 이미지를 가져옵니다.
docker push 명령을 사용하면 이미지가 구성된 레지스트리로 푸시됩니다.

Docker objects

Docker를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 개체를 만들고 사용하고있는 것입니다.
이 섹션에서는 이러한 개체 중 일부에 대해 간단히 설명합니다.

IMAGES

도커 컨테이너를 만들기위한 지침 읽기 전용 템플릿입니다.
종종 이미지는 다른 이미지를 기반으로 하며 몇 가지 추가 사용자 정의가 있습니다.
예를 들어 ubuntu 이미지를 기반으로 이미지를 만들 수 있지만 응용 프로그램을 실행하는 데 필요한 세부 구성 정보는 물론 Apache 웹 서버와 응용 프로그램을 설치합니다.

자신 만의 이미지를 만들거나 다른 사람들이 만들고 레지스트리에 게시 한 이미지 만 사용할 수 있습니다.
자신의 이미지 를 만들려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하기위한 간단한 구문 으로 Dockerfile 을 만듭니다.
Dockerfile의 각 명령은 이미지에 레이어를 만듭니다.
Dockerfile을 변경하고 이미지를 다시 작성하면 변경된 레이어 만 재구성됩니다.
이는 다른 가상화 기술과 비교할 때 이미지를 매우 가볍고 작고 빠르 게 만드는 요소의 일부입니다.

CONTAINERS

컨테이너는 이미지의 실행 가능한 인스턴스입니다.
Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있습니다.
컨테이너를 하나 이상의 네트워크에 연결하거나 여기에 저장소를 연결하거나 현재 상태를 기반으로 새 이미지를 만들 수도 있습니다.

기본적으로 컨테이너는 다른 컨테이너와 호스트 시스템과 비교적 잘 격리되어 있습니다.
컨테이너의 네트워크, 저장소 또는 다른 하위 시스템이 다른 컨테이너 또는 호스트 시스템에서 분리 된 상태를 제어 할 수 있습니다.

컨테이너는 해당 이미지와 이를 만들거나 시작할 때 제공 한 구성 옵션으로 정의됩니다.
컨테이너를 제거하면 영구 저장소에 저장되지 않은 상태의 변경 사항이 사라집니다.

Example docker run command

다음 명령은 ubuntu 컨테이너를 실행하고 로컬 명령 줄 세션에 대화 형으로 연결하여 /bin/bash을 실행 합니다.

1
2

$ docker run -i -t ubuntu /bin/bash

이 명령을 실행하면 다음이 수행됩니다 (기본 레지스트리 구성을 사용 중이라고 가정).

  1. ubuntu 이미지가 로컬에 없으면 Docker는 docker pull ubuntu 명령을 수동으로 실행 한 것처럼 구성된 레지스트리(기본은: 도커허브)에서 이미지를 가져옵니다.

  2. Docker는 docker container create 명령을 수동으로 실행 한 것처럼 새 컨테이너를 만듭니다.

  3. Docker는 읽기/쓰기 파일 시스템을 최종 레이어로 컨테이너에 할당합니다. 이것은 실행중인 컨테이너가 로컬 파일 시스템의 파일과 디렉토리를 작성하거나 수정할 수있게 합니다.

  4. Docker는 네트워킹 옵션을 지정하지 않았으므로 컨테이너를 기본 네트워크에 연결하는 네트워크 인터페이스를 만듭니다. 여기에는 컨테이너에 IP 주소 할당이 포함됩니다. 기본적으로 컨테이너는 호스트 시스템의 네트워크 연결을 사용하여 외부 네트워크에 연결할 수 있습니다.

  5. Docker가 컨테이너를 시작하고 /bin/bash를 실행 합니다. 컨테이너가 대화식으로 실행 중이며 (-i및 -t 플래그 로 인해) 터미널에 연결되어 있기 때문에 출력이 터미널에 기록되는 동안 키보드를 사용하여 입력을 제공 할 수 있습니다.

  6. 명령 exit를 입력 하기 위해 입력 할 때 /bin/bash 컨테이너가 중지되지만 제거되지는 않습니다. 다시 시작하거나 제거 할 수 있습니다.

SERVICES

여러 도커 데몬에서 컨테이너를 확장 할 때 서비스는 스윔(swarm) with multiple managers and workers 모두가 함께 작동한다.
스웜의 각 구성원은 Docker 데몬이며 Docker는 Docker API를 사용하여 통신합니다.
서비스를 사용하면 주어진 시간에 사용할 수 있어야하는 서비스의 복제본 수와 같은 원하는 상태를 정의 할 수 있습니다.
기본적으로 서비스는 모든 작업자 노드에서로드 균형 조정됩니다.
소비자에게는 Docker 서비스가 단일 응용 프로그램으로 보입니다.
Docker 엔진은 Docker 1.12 이상에서 스웜 모드를 지원합니다.

기본 기술

Docker는 Go로 작성되었으며 Linux 커널의 여러 기능을 활용하여 기능을 제공합니다.

Namespaces

Docker는 namespaces 라는 격리 된 작업 영역을 제공하기 위해 호출되는 기술을 사용합니다.
컨테이너를 실행할 때 Docker 는 해당 컨테이너에 대한 네임 스페이스 집합을 만듭니다 .

이러한 네임 스페이스는 격리 계층을 제공합니다.
컨테이너의 각 측면은 별도의 네임 스페이스에서 실행되며 액세스는 해당 네임 스페이스로 제한됩니다.

Docker Engine은 Linux에서 다음과 같은 네임 스페이스를 사용합니다.

  • pid 네임 스페이스 : 프로세스 격리 (PID : 프로세스 ID).
  • net 네임 스페이스 : 관리 네트워크 인터페이스 (NET : 네트워킹).
  • ipc 네임 스페이스 : IPC 자원에 대한 액세스 관리 (IPC : 프로세스 간 통신).
  • mnt 네임 스페이스 : 관리 파일 시스템은 점 (: 마운트 MNT)를 탑재합니다.
  • uts 네임 스페이스 : 격리를 커널과 버전 식별자. (UTS : Unix Timesharing System).

Control groups

Linux의 Docker Engine은 컨트롤 그룹(cgroups) 이라는 또 다른 기술을 사용 합니다.
cgroup은 응용 프로그램을 특정 자원 세트로 제한합니다.
컨트롤 그룹을 통해 Docker Engine은 사용 가능한 하드웨어 리소스를 컨테이너에 공유하고 선택적으로 제한 및 제약 조건을 적용 할 수 있습니다.
예를 들어 특정 컨테이너에서 사용 가능한 메모리를 제한 할 수 있습니다.

Union file systems

유니온 파일 시스템(UnionFS)은 레이어를 생성하여 작동하는 파일 시스템으로 매우 가볍고 빠릅니다.
Docker Engine은 UnionFS를 사용하여 컨테이너에 대한 빌딩 블록을 제공합니다.
Docker Engine은 AUFS, btrfs, vfs 및 DeviceMapper를 비롯한 여러 UnionFS 변형을 사용할 수 있습니다.

Container format

Docker Engine은 네임 스페이스, 컨트롤 그룹 및 UnionFS를 컨테이너 형식이라는 래퍼로 결합합니다.
기본 컨테이너 형식은 libcontainer 입니다.
앞으로 Docker는 BSD Jails 또는 Solaris 영역과 같은 기술과 통합하여 다른 컨테이너 형식을 지원할 수 있습니다.

참조