[Docker] Docker overview

https://docs.docker.com/get-started/overview/

Docker docs

Docker는 애플리케이션 개발, 발송, 실행을 위한 개방형 플랫폼이다. Docker를 사용하면 소프트웨어를 신속하게 제공할 수 있도록 애플리케이션과 인프라를 분리할 수 있다. Docker를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있다. 코드를 신속하게 발송, 테스트, 배치하는 도커의 방법론을 활용하면 코드 작성과 프로덕션에서 실행 사이의 지연을 현저하게 줄일 수 있다.

도커 플랫폼

도커는 컨테이너라고 불리는 느슨하게 격리된 환경에서 애플리케이션을 패키징하고 실행할 수 있는 기능을 제공한다. 격리 및 보안을 통해 지정된 호스트에서 여러 컨테이너를 동시에 실행할 수 있다. 컨테이너는 하이퍼바이저의 추가 로드가 필요하지 않지만, 호스트 시스템의 커널 내에서 직접 실행되기 때문에 경량(lightweight)이다. 이는 가상 시스템을 사용하는 경우보다 지정된 하드웨어 조합에서 더 많은 컨테이너를 실행할 수 있음을 의미한다. 실제 가상 시스템인 호스트 시스템 내에서 도커 컨테이너를 실행할 수도 있다!

도커는 컨테이너의 라이프사이클을 관리하기 위한 툴링과 플랫폼을 제공한다.

  • 컨테이너를 사용하여 애플리케이션 및 지원 구성요소를 개발.
  • 컨테이너는 애플리케이션을 배포하고 테스트하는 단위가 된다.
  • 준비가 되었으면 애플리케이션을 컨테이너 또는 오케스트레이션된 서비스로 프로덕션 환경에 배포한다. 이는 프로덕션 환경이 로컬 데이터 센터, 클라우드 공급자 또는 둘의 하이브리드 환경인 경우에도 동일하게 작동한다.

도커 엔진

Docker Engine은 다음과 같은 주요 구성요소를 갖춘 클라이언트-서버 애플리케이션이다.

  • 데몬 프로세스(dockerd 명령어)라고 하는 장기 실행 프로그램의 일종인 서버.
  • 프로그램이 데몬과 대화하는 데 사용할 수 있는 인터페이스를 지정하고 수행할 작업을 지시하는 REST API.
  • 명령줄 인터페이스(CLI) 클라이언트(docker 명령).

CLI는 Docker REST API를 사용하여 스크립팅 또는 직접 CLI 명령을 통해 Docker 데몬을 제어하거나 상호 작용한다. 다른 많은 Docker 애플리케이션은 기본 API와 CLI를 사용한다.

데몬은 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 생성하고 관리한다.

참고: 도커는 오픈 소스 Apache 2.0 라이센스로 라이센스가 부여된다.

자세한 내용은 아래 Docker Architecture를 참조한다.

도커는 무엇에 사용할 수 있는가?

빠르고 일관된 애플리케이션 제공

도커는 개발자가 애플리케이션과 서비스를 제공하는 로컬 컨테이너를 사용하여 표준화된 환경에서 작업할 수 있도록 함으로써 개발 라이프사이클을 간소화한다. 컨테이너는 지속적인 통합과 지속적인 전달(CI/CD) 워크플로우에 적합하다.

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

  • 개발자들은 현지에서 코드를 작성하고 도커 컨테이너를 사용하여 동료들과 작업을 공유한다.
  • 도커를 사용하여 애플리케이션을 테스트 환경으로 밀어넣고 자동 및 수동 테스트를 실행한다.
  • 개발자가 버그를 발견하면 개발 환경에서 버그를 수정하여 테스트 및 유효성 검사를 위해 테스트 환경에 재배치할 수 있다.
  • 테스트가 완료되면 고객에게 수정 사항을 제공하는 것이 업데이트된 이미지를 프로덕션 환경으로 푸시하는 것만큼 간단하다.

신속한 구현 및 확장

Docker의 컨테이너 기반 플랫폼은 휴대성이 뛰어난 워크로드를 허용한다. 도커 컨테이너는 개발자의 로컬 노트북, 데이터 센터의 물리적 또는 가상 머신, 클라우드 공급자 또는 혼합 환경에서 실행될 수 있다.

또한 Docker의 휴대성과 경량성으로 인해 비즈니스 요구에 따라 애플리케이션과 서비스를 거의 실시간으로 확장하거나 해체하여 워크로드를 동적으로 관리할 수 있다.

동일한 하드웨어에서 더 많은 워크로드 실행

도커는 가볍고 빠르다. 하이퍼바이저 기반 가상 머신에 대해 실현 가능하고 비용 효율적인 대안을 제공하므로, 더 많은 컴퓨팅 용량을 사용하여 비즈니스 목표를 달성할 수 있다. Docker는 고밀도 환경 및 적은 리소스로 더 많은 작업을 수행해야 하는 중소형 배포 환경에 이상적이다.

도커 아키텍처

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

도커 데몬

Docker 데몬(Dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨 등의 Docker 객체를 관리한다. 데몬은 다른 데몬과 통신하여 도커 서비스를 관리할 수도 있다.

도커 클라이언트

도커 클라이언트(docker)는 많은 도커 사용자가 도커와 상호 작용하는 일차적인 방법이다. docker run과 같은 명령을 사용하면 클라이언트는 이러한 명령을 dockerd로 전송하고, 이 명령을 실행한다. docker 명령은 Docker API를 사용한다. 도커 클라이언트는 둘 이상의 데몬과 통신할 수 있다.

도커 레지스트리

도커 레지스트리는 도커 이미지를 저장한다. Docker Hub는 누구나 사용할 수 있는 공용 레지스트리로, 도커 허브에서 기본적으로 이미지를 찾도록 도커가 구성된다. 당신은 심지어 당신만의 개인 등록도 실행할 수 있다.

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

도커 오브젝트

도커를 사용할 때 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 오브젝트를 만들고 사용하는 경우 이 섹션은 이러한 일부 객체에 대한 간략한 개요다.

이미지

이미지(image)는 도커 컨테이너를 만드는 지시사항이 있는 읽기 전용 템플릿이다. 종종 이미지는 다른 이미지를 기반으로 하며, 약간의 추가 사용자 정의가 있다. 예를 들어, ubuntu 이미지를 기반으로 하는 이미지를 만들 수 있지만, Apache 웹 서버와 응용 프로그램을 설치 뿐만 아니라 애플리케이션을 실행하는 데 필요한 구성 세부 정보를 설치한다.

자신만의 이미지를 만들거나 다른 사용자가 만든 이미지만 사용하여 레지스트리에 게시할 수 있다. 이미지를 직접 작성하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하기 위한 간단한 구문을 사용하여 도커 파일을 작성하십시오. 도커 파일의 각 지시사항은 이미지에 레이어를 만든다. 도커 파일을 변경하고 이미지를 재구성하면 변경된 계층만 다시 작성된다. 이는 다른 가상화 기술에 비해 이미지를 경량화, 소형화, 고속화시키는 일부다.

컨테이너

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

기본적으로 컨테이너는 다른 컨테이너 및 해당 호스트 기계와 상대적으로 잘 격리되어 있다. 컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너 또는 호스트 시스템에서 얼마나 격리되어 있는지 제어할 수 있다.

컨테이너는 이미지를 생성하거나 시작할 때 제공하는 구성 옵션뿐만 아니라 이미지로 정의된다. 컨테이너를 제거하면 영구 저장소에 저장되지 않은 상태의 모든 변경 사항이 사라진다.

docker run 명령어 예

다음 명령은 ubuntu 컨테이너를 실행하고, 로컬 명령줄 세션에 대화식으로 연결하고, /bin/bash를 실행한다.

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

이 명령을 실행하면 다음과 같은 상황이 발생한다(기본 레지스트리 구성을 사용하고 있다고 가정할 때).

  1. 로컬로 ubuntu 이미지가 없는 경우 수동으로 docker pull ubuntu를 실행한 것처럼 구성된 레지스트리에서 ubuntu 이미지를 가져온다.
  2. docker container create 명령을 수동으로 실행한 것처럼 도커는 새 컨테이너를 만든다.
  3. Docker는 최종 계층으로 컨테이너에 읽기-쓰기 파일 시스템을 할당한다. 이를 통해 실행 중인 컨테이너가 로컬 파일 시스템에서 파일 및 디렉터리를 만들거나 수정할 수 있다.
  4. 사용자가 네트워킹 옵션을 지정하지 않았으므로 도커는 컨테이너를 기본 네트워크에 연결하기 위한 네트워크 인터페이스를 생성한다. 여기에는 컨테이너에 IP 주소를 할당하는 것도 포함된다. 기본적으로 컨테이너는 호스트 시스템의 네트워크 연결을 사용하여 외부 네트워크에 연결할 수 있다.
  5. Docker는 컨테이너를 시작하고 /bin/bash를 실행한다. ( -i 및 -t 플래그로 인해) 컨테이너가 대화형으로 실행되고 터미널에 부착되기 때문에 출력이 터미널에 기록되는 동안 키보드를 사용하여 입력을 제공할 수 있다.
  6. exit를 입력하여 /bin/bash 명령을 종료하면 컨테이너가 중지되지만 제거되지는 않는다. 다시 시작하거나 제거할 수 있다.

서비스

서비스를 통해 여러 도커 데몬에 걸쳐 컨테이너를 확장할 수 있으며, 이 모든 것이 여러 관리자와 작업자가 함께 모여 작업한다. 무리의 각 멤버는 도커 데몬이며, 모든 데몬은 도커 API를 사용하여 통신한다. 서비스는 당신이 언제든지 이용할 수 있어야 하는 서비스의 복제본 수와 같이 원하는 상태를 정의할 수 있다. 기본적으로 서비스는 모든 워커 노드에서 로드 밸런싱된다. 소비자에게 있어서, 도커 서비스는 단일 애플리케이션으로 보인다. 도커 엔진은 도커 1.12 이상에서 swarm 모드를 지원한다.

기반 기술

Docker는 Go로 작성되어 있으며 Linux 커널의 여러 기능을 활용하여 그 기능을 제공한다.

네임스페이스

도커는 네임스페이스라는 기술을 사용하여 컨테이너라는 고립된 작업 공간을 제공한다. 컨테이너를 실행할 때, 도커는 해당 컨테이너에 대한 네임스페이스 집합을 만든다.

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

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

  • pid 네임스페이스: 프로세스 격리(PID: Process ID)
  • net 네임스페이스: 네트워크 인터페이스 관리(NET: Networking)
  • ipc 네임스페이스: IPC 리소스에 대한 액세스 관리(IPC: InterProcess Communication)
  • mnt 네임스페이스: 파일 시스템 마운트 지점 관리(MNT: Mount)
  • uts 네임스페이스: 커널과 버전 식별자를 분리한다. (UTS: Unix Timesharing System).

제어 그룹

리눅스 상의 도커 엔진도 control group(cgroup)이라는 또 다른 기술에 의존한다. cgroup은 애플리케이션을 특정 리소스 집합으로 제한한다. control group은 도커 엔진이 사용 가능한 하드웨어 리소스를 컨테이너에 공유하고 선택적으로 제한과 제한을 시행할 수 있도록 허용한다. 예를 들어 특정 컨테이너에 사용할 수 있는 메모리를 제한할 수 있다.

유니온 파일 시스템

유니언 파일 시스템 또는 UnionFS는 레이어를 생성하여 작동하는 파일 시스템으로, 매우 가볍고 빠르다. 도커 엔진에서 UnionFS를 사용해서 컨테이너의 빌딩 블록을 제공한다. 도커 엔진에서 AUFS, btrfs, vfs, DeviceMapper과 같은 여러 UnionFS 유형을 사용할 수 있다.

컨테이너 형식

Docker Engine은 네임스페이스, 제어 그룹, UnionFS를 합쳐서 컨테이너 형식(format)으로 부른다. 기본 컨테이너 형식은 libcontainer이다. 향후 도커는 BSD Jails, Solaris Zones와 같은 기술과 통합하여 다른 컨테이너 형식을 지원할 수 있다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like
Read More

containerd 소개

단순성(simplicity), 견고성(robustness), 이식성(portability)에 중점을 둔 업계 표준 컨테이너 런타임 containerd가 CNCF에서 졸업! 2019년 2월 28일 현재, containerd는 Kubernetes,…
Read More

[Docker] What is a Container?

컨테이너란? 소프트웨어의 표준화된 단위 소프트웨어를 개발, 발송, 배포를 위한 표준화된 단위로 패키지화 컨테이너는 코드와 그 모든 의존성을 패키징하여…