Docker란?

Deagwon Bu·2021년 9월 23일
0

docker

목록 보기
1/1

도커를 다루기에 앞서 컨테이너에 대해 알아 봅시다.

Container 란?

Linux 컨테이너는 실행에 필요한 모든 파일을 포함하여 전체 런타임 환경에서 애플리케이션을 패키지화하고 분리하는 기술입니다.

어플리케이션을 실행하기 위해서는 일반적으로 다음과 같은 구성이 필요합니다.

  • 물리적인 장치(Device) & (instructure) -> 운영체제(OS) -> Middle Ware -> Run time -> Application

하나의 디바이스위에 운영체제 미들웨어 스트로리지 네트워크 환경을 설정하는 것은 여러면에서 매우 번거운 상황이 발생합니다. 2가지 예시를 통해서 컨테이너를 사용하지 않을 때의 불편함을 알아보겠습니다.

우선 개발자가 본인의 컴퓨터(window os)에서 개발을 진행하고 클라우드(AWS EC2 linux)에서 배포를 하는 상황을 가정해 봅시다. 만약 미들웨어나 런타임이 운영체제에 따라 다르게 동작한다면, 개발자가 열심히 본인의 컴퓨터에서 작업한 내용을 서버에 그대로 배포할 수 없고, 추가적인 작업을 해야합니다.

또 다른 예시로는 하나의 클라우드 서버에서 서비스를 배포하고 있는 상황을 가정해 봅시다. 사용자가 많이 늘어나서 서버를 증설해야하는 상황입니다. 만약 컨테이너를 통해 이 환경을 구성하지 않았다면, 개발하는 새롭게 증설되는 서버마다 일일이 기존 환경을 구성해야합니다.

이때, 실행에 필요한 모든 파일을 포함하여 전체 런타임 환경이 분리된다면 개발자는 그 분리된 환경을 작업하여 어디에서든지 배포할 수 있게됩니다.

  • 개발자의 컴퓨터에서 컨테이너를 만들고 그 컨테이너를 바로 서버에 올리기만 하면 추가적인 작업없이 개발과 배포가 가능해 집니다.

  • 기존의 서비스 컨테이너를 통해 하나의 서버에 배포되고 있다면 새로운 서버를 확장할 때, 기존의 컨테이너를 복사해서 붙여넣기만 한다면 간단하게 서버를 증설 할 수 있습니다.

    이러한 Linux의 컨테이너의 생성 및 관리를 도와주는 유용한 도구로
    Docker, 포드맨(Podman), OpenVZ, LIBVIRT 등의 다양한 툴이 존재합니다.

    이 포스트에서는 그중에서도 가장 대중적으로 사용되는 docker에 관해서 알아봅시다.

docker란?

Docker는 어플리케이션의 개발, 전달, 실행을 위한 오픈 플랫폼입니다.

도커는 container라는 고립된 환경에서 하나의 어플리케이션을 패키징하는 기능을 제공합니다. 앞에서 설명 했듯이 이러한 어플리케이션의 컨테이너화를 통해 하나의 host에서 여러개의 컨테이너를 동시에 실행할 수 있습니다.

Docker의 architecture

docker는 컨테이너를 관리하기 위해 client-server architecture를 채택하였습니다.

server 역할을 담당하는 docker demon은 docker 컨테이너의 배포, 실행, building이라는 무거운 작업을 수행합니다.

사용자는 docker client를 통해서 docker demon과 정보-명령을 주고 받으며, REST API, UNIX sockets, network interface를 통해서 통신합니다.

또한 여러 줄의 docker client의 커맨드를 하나의 docker-compose.yml파일에 정리하여 docker demon와 통신하는 것이 가능합니다.

1. The Docker daemon

docker daemon은 Docker API request를 항상 listening하고 있으며, 이 요청을 받아 docker objects(images, containers, networks, volumes)를 관리합니다.

2. The Docker objects

  • Images

    docker image는 컨테이너를 생성, 실행하기위해 필요한 정보를 담고 있는 read-only 템플릿입니다. 여러개의 docker image를 중첩하여 새로운 docker iamge를 생성할 수 있습니다.

  • Containers

    docker container는 docker image의 실행가능한 인스턴스 입니다. docker image가 환경의 정보를 담고 있는 "틀"이라면, docker container는 이 image를 통해서 만들어진 "실체"입니다. 우리가 만드는 어플리케이션은 이 docker container 속에서 실행됩니다. 또한 하나의 이미지에서 여러개의 container를 찍어내듯 생성할 수 있습니다.

  • Dockerfile - docker image - docker container

  1. DcokerFile이라는 문서를 통해서 docker image가 어떤 환경으로 구성되어야 하는지 정의합니다. 구성을 정의하는 문서이기때문에 보통 매우 적은 용량으로 dockerfile을 작성할 수 있습니다.
  2. 이 DockerFile을 통해서 새로운 docker image를 생성할 수 있습니다. docker image는 docker container를 실행하기 직전의 모든 환경이 설치되어 있습니다. 따라서 하나의 container와 비슷한 용량을 갖습니다.
  3. 하나의 docker image를 통해서 하나 혹은 그 이상의 docker container를 생성하고 실행할 수 있습니다. 실제 서비스는 이 docker container를 통해서 실행되며 배포됩니다.

3. The Docker registries

docker의 image들을 저장하는 공간입니다. docker hub라는 docker에서 만든 public registry를 통해서 image를 관리 및 배포할수 있고, private으로 관리할 수도 있습니다.

The underlying technoloy

docker는 Go language로 작성되었습니다. Go 를 사용하므로써 linux 커널의 기능을 수행하는데 여러 이점이 존재한다고 합니다.

또한 호스트로부터 contanier를 고립시키기 위해 namespaces라는 기술을 사용합니다. docker container가 실행되면 docker는 해당 container를 생성하기 위해서 일련의 namespace들의 집합을 생성합니다. 서로 다른 namespace로 layer가 분리되면 하나의 host에서도 container들이 서로 접근하는 것을 차단할 수 있습니다.

reference

0개의 댓글