Docker 란?

김가영

Updated:

Intro

안녕하세요. 김가영대리입니다. 도커를 공부하면서 알게 된 내용을 정리하였습니다.

1. 도커란 무엇인가?

컨테이너를 사용해 응용 프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구이며 컨테이너 기반 오픈소스 가상화 플랫폼이며 생태계다.

Docker는 소프트웨어를 컨테이너라는 표준화 된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다.

일반 컨테이너의 개념에서 물건을 손쉽게 운송해주는 것처럼 프로그램을 손쉽게 이동 배포 관리할 수 있게 해주며 AWS, Google Cloud 등 어디에서든 실행 가능하다.

도커 이미지

Foo

코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지다. 프로그램을 실행하는데 필요한 설정이나 종속성들을 갖고있다.

도커 컨테이너

아래의 이미지를 보면 배 위에 컨테이너를 올린 모습을 볼 수 있다. 컨테이너란 “다양한 OS에 여러 application이 올려져 있는 것”을 의미하는 것이고, 컨테이너를 도커 위에 올리는 구나를 알 수 있다.

Foo

컨테이너는 코드와 모든 종속성을 패키지화하여 응용프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위다. 컨테이너는 소프트웨어를 환경으로부터 격리시키고 개발과 스테이징의 차이에도 불구하고 균일하게 작동하도록 보장한다. 이미지의 인스턴스이며, 프로그램을 실행한다.

2. 도커의 장점

어떤 프로젝트는 스프링으로 되어 있고, 또 다른 프로젝트는 NodeJS로 되어있다고 했을 경우, 한 컴퓨터에다가 설치해야 할게 많고 이것 저것 따로 설정해야 한다. 사실 이런 방법은 좋지 않다.

그럼 도커를 활용하면 어떤 장점이 있을까

  • 가장 큰 장점은 역시 애플리케이션 독립성이다. 호스트 OS와도, 다른 컨테이너와도 독립된 공간을 보장받을 수 있기 떄문에 충돌 발생 염려가 전혀 없다.

  • 또한 컨테이너 내부에 작업을 한 후에 배포하려고 한다면 도커 이미지라는 패키지로 만들어서 운영서버에 전달만 하면 된다. 즉, 배포가 쉬워진다.

  • 모놀리식 애플리케이션 방식에서 마이크로서비스 구조로 변화가 쉽다. 즉, 컨테이너 하나당 하나의 기능만을 제공하는 모듈로 만들어서 부하가 많은 모듈은 여러개 더 만들고 하는 조정이 가능해진다.

    • 소프트웨어의 여러 모듈이 상호 작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식을 모놀리스(Monolith) 애플리케이션이라고 한다.

3. Client - Server 구조

도커 버전을 확인해보면 버전정보가 클라이언트와 서버로 나뉘어져 있다.

$ docker version
Client: Docker Engine - Community
 Cloud integration: v1.0.22
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57
 Built:             Mon Dec 13 11:45:48 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:43:56 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.12
  GitCommit:        7b11cfaabd73bb80907dd23182b9347b4245eb5d
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

도커는 하나의 실행파일이지만 실제로 클라이언트와 서버역할을 각각 할 수 있다. 도커 커맨드를 입력하면 도커 클라이언트가 도커 서버로 명령을 전송하고 결과를 받아 터미널에 출력해준다.

Foo

기본값이 도커 서버의 소켓을 바라보고 있기 때문에 사용자는 의식하지 않고 마치 바로 명령을 내리는 것 같은 느낌을 받는다. 이러한 설계가 mac이나 windows의 터미널에서 명령어를 입력했을때 가상 서버에 설치된 도커가 동작하는 이유입니다.

4. 레이어 저장방식(Layer)

Foo

도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가MB에 이른다. 처음 이미지를 다운받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백메가를 다시 다운받는다면 매우 비효율적일 수 밖에 없다.

도커는 이런 문제를 해결하기 위해 레이어(Layer) 라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다. 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.

ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는A + B + C + nginx가 된다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 예상대로A + B + C + nginx + source 레이어로 구성된다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다. 컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한다. 가상화의 특성상 이미지 용량이 크고 여러대의 서버에 배포하는걸 감안하면 단순하지만 엄청나게 영리한 설계이다.

Tags:

Categories:

Updated:

Leave a comment