ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker platform (개발 및 실행 환경)
    Search: SwDevTool SwDevTool 2022. 11. 25. 15:07

     

    개요

    Docker는 애플리케이션 개발, 배송 및 실행을 위한 플랫폼이다.

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

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

    Docker는 표준화된 런타임 환경으로 진화했고, Oracle 기업용 제품에서 Docker를 공식적으로 지원하고 있다.

    도커 아키텍처 다이어그램

    ( 이미지 출처 도커 공식 사이트 )

     

    도커 플랫폼

    Docker는 컨테이너라고 하는 느슨하게 격리된 환경에서 애플리케이션을 패키징하고 실행할 수 있는 기능을 제공한다.
    격리 및 보안을 통해 지정된 호스트에서 여러 컨테이너를 동시에 실행할 수 있다.
    컨테이너는 애플리케이션을 실행하는 데 필요한 모든 것을 포함하므로 호스트에 현재 설치된 항목에 의존할 필요가 없다. 작업하는 동안 컨테이너를 공유할 수 있으며 공유하는 모든 사람이 동일한 방식으로 작동하는 동일한 컨테이너를 갖게 된다.

    Docker는 컨테이너의 수명 주기를 관리하기 위한 도구 및 플랫폼을 제공한다.

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

     

    Docker 사용

    Docker는 개발자가 애플리케이션과 서비스를 제공하는 로컬 컨테이너를 사용하여 표준화된 환경에서 작업할 수 있도록 하여 개발 수명 주기를 간소화한다. 컨테이너는 지속적 통합 및 지속적 제공(CI/CD) 워크플로우에 적합하다(continuous integration and continuous delivery (CI/CD) workflows).

    사용 시나리오.
    개발자는 로컬에서 코드를 작성하고 Docker 컨테이너를 사용하여 동료와 작업을 공유한다.
    Docker를 사용하여 애플리케이션을 테스트 환경에 푸시하고 자동 및 수동 테스트를 실행한다.
    개발자가 버그를 발견하면 개발 환경에서 버그를 수정하고 테스트 및 검증을 위해 테스트 환경에 재배포할 수 있다.
    테스트가 완료되면 고객에게 수정 사항을 제공한다.

    반응형 배포 및 확장
    Docker의 컨테이너 기반 플랫폼은 이동성이 뛰어난 워크로드를 허용한다. Docker 컨테이너는 개발자의 로컬 랩톱, 데이터 센터의 물리적 또는 가상 머신, 클라우드 공급자 또는 혼합 환경에서 실행할 수 있다.
    Docker의 이식성과 경량성 덕분에 비즈니스 요구 사항에 따라 거의 실시간으로 애플리케이션 및 서비스를 확장하거나 축소하여 워크로드를 동적으로 쉽게 관리할 수 있다.

     

    도커 아키텍처

    Docker는 클라이언트-서버 아키텍처를 사용한다.

    Docker 클라이언트
    Docker 컨테이너를 빌드, 실행 및 배포하는 무거운 작업을 수행 하는 Docker 데몬 과 통신한다. Docker 클라이언트와 데몬 은 동일한 시스템에서 실행되거나 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있다. Docker 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다. 또 다른 Docker 클라이언트는 컨테이너 세트로 구성된 애플리케이션으로 작업할 수 있는 Docker Compose다.

    DockerDaemon

    DockerClient

     

    DockerDaemon

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

     

    DockerClient

    DockerClient( docker)는 많은 Docker 사용자가 Docker와 상호 작용하는 기본 방법이다. docker run명령을 사용하면 클라이언트는 이러한 명령을 전송하여 DockerDaemon(dockerd)수행한다. 이 docker명령은 Docker API를 사용한다. Docker 클라이언트는 둘 이상의 데몬과 통신할 수 있다.

     

    DockerDesktop

    DockerDesktop은 Mac, Windows 또는 Linux 환경을 위한 설치가능한 애플리케이션으로 컨테이너화된 애플리케이션 및 마이크로서비스를 구축하고 공유할 수 있다. DockerDesktop에는 DockerDaemon(dockerd), DockerClient(docker), Docker Compose, Docker Content Trust, Kubernetes 및 Credential Helper가 포함된다.

     

    DockerRegistry

    DockerRegistry는 Docker 이미지를 저장한다. DockerHub는 누구나 사용할 수 있는 공개 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있다. 개인 레지스트리를 실행할 수도 있다.
    docker pull또는 docker run명령 을 사용하면 구성된 레지스트리에서 필수 이미지를 가져온다. docker push명령 을 사용하면 이미지가 구성된 레지스트리로 푸시된다.

     

    Docker 개체

    Docker를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 개체를 만들고 사용하게 된다. 이 섹션은 이러한 개체 중 일부에 대한 간략한 개요다.

    이미지
    이미지 는 Docker 컨테이너 생성 지침이 포함된 읽기 전용 템플릿이다 . 종종 이미지는 일부 추가 사용자 지정과 함께 다른 이미지 를 기반으로 한다. 예를 들어 이미지를 기반으로 하는 이미지를 빌드할 수 ubuntu 있지만 Apache 웹 서버와 애플리케이션은 물론 애플리케이션을 실행하는 데 필요한 구성 세부 정보도 설치한다.

    자신의 이미지를 만들 수도 있고 다른 사람이 만들고 레지스트리에 게시한 이미지만 사용할 수도 있다. 고유한 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하는 구문으로 Dockerfile를 만든다. Dockerfile의 각 명령어는 이미지에 레이어를 만든다. Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드된다.

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

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

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

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

    docker run -i -t ubuntu /bin/bash

    이 명령을 실행하면 다음 일들이 발생한다(기본 레지스트리 구성을 사용한다고 가정).

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

     

    기본 기술

    Docker는 Go 프로그래밍 언어로 작성되었으며 Linux 커널의 여러 기능을 활용하여 기능을 제공합니다. Docker는 컨테이너namespaces 라는 격리된 작업 공간을 제공하기 위해 라는 기술 을 사용한다 . 컨테이너를 실행하면 Docker 는 해당 컨테이너에 대한 네임스페이스 세트를 생성한다 .

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

     

    댓글