Tool/Docker

도커(Docker)란? - 기본 개념 및 배경, 이미지와 컨테이너 의미

재은초 2024. 1. 18. 18:16
반응형

Docker란?

  • Docker는 2013년 3월 Docker, Inc(구 dotCloud)에서 출시한 오픈 소스 컨테이너 프로젝트다. 현재 전 세계적으로 큰 인기를 끌고 있으며 컨테이너 분야에서 사실상 표준으로 자리잡았다.

Docker 탄생 배경

  • 2010년을 넘어서면서 서버 시장은 급속히 클라우드 환경으로 옮겨가면서, 클릭 몇 번 만으로 가상 서버를 만들어낼 수 있게 되었다. 이렇게 생성된 가상 서버에 각종 소프트웨어를 설치하고 설정을 해야 하는데, 서버 개수가 많아지면서 사람이 하기가 어려워진다. 따라서 클라우드 환경에서 각종 소프트웨어 설치와 배포가 큰 어려움으로 다가왔다.
  • 리눅스/유닉스 환경에서 오랫동안 사용해왔던 셸 스크립트로 설치 및 설정 자동화를 구현해도 되지만 셸 스크립트로는 중앙 관리 기능이나 복잡한 기능은 구현하기 힘든 한계가 있다. 그리고 리눅스 환경은 설치해야 할 응용프로그램이 많고 설정도 복잡하며, 사소한 설정 하나가 운영체제와 서비스의 안정성에 큰 영향을 미치는 단점이 있다.

Immutable Infrastructure

  • Immutable Infrastructure는 호스트 OS와 서비스 운영 환경(서버 프로그램, 소스 코드, 컴파일된 바이너리)을 분리하고, 한 번 설정한 운영 환경은 변경하지 않는다(Immutable)는 개념이다. 즉 서비스 운영 환경을 이미지로 생성한 뒤 서버에 배포하여 실행한다. 이때 서비스가 업데이트되면 운영 환경 자체를 변경하지 않고, 이미지를 새로 생성하여 배포하는 것이다. 클라우드 플랫폼에서 서버를 쓰고 버리는 것처럼, Immutable Infrastructure도 서비스 운영 환경 이미지를 한 번 쓰고 버린다.

 

가상 머신과 Docker

  • Docker는 VMware 등의 가상 머신과 비슷하다. 가상 머신에 리눅스를 설치한 뒤 각종 서버 프로그램과 DB를 설치하고, 개발한 애플리케이션이나 웹사이트를 실행했다. 이렇게 구축한 가상 머신 이미지를 여러 서버에 복사해서 실행하면 이미지 하나로 서버를 계속 만들어낼 수 있었다. 보통 가상 머신 서버를 독자적으로 운영하거나, 서비스 형태로 제공되 Amazon Web Services, Microsoft Azure, Google Cloud Platform을 사용하기도 한다.
  • 가상 머신은 편하긴 하지만 아직도 가상 머신은 리얼 머신에 비해 속도가 느리며 성능이 좋지 못한 것이 단점이 있다.
  • 가상 머신 자체는 완전한 컴퓨터라 항상 게스트 OS를 설치해야 한다. 그래서 이미지 안에 OS가 포함되기 때문에 이미지 용량이 커지는데, 아무리 네트워크와 인터넷 속도가 빨라졌다 하더라도 가상화 이미지를 주고받는 것은 부담스러운 일이다. 특히 오픈 소스 가상화 소프트웨어는 OS를 가상화하는 것에만 초점이 맞춰져 있어서, 이미지를 생성하고 실행하는 기능만 있을 뿐 배포와 관리 기능이 부족하다.
  • 반면 Docker는 가상 머신의 반가상화보다 좀 더 경량화된 방식으로 게스트 OS를 설치하지 않는다. Docker 이미지에 서버 운영을 위한 프로그램과 라이브러리만 격리해서 설치할 수 있고, OS 자원(시스템 콜)은 호스트와 공유하는데, 이로 인해 이미지 용량이 크게 줄어들었다.
  • Docker는 하드웨어를 가상화하는 계층이 없기 때문에 메모리 접근, 파일시스템, 네트워크 속도가 가상 머신에 비해 월등히 빠르다.
  • Docker는 가상 머신과는 달리 이미지 생성과 배포에 특화된 기능을 제공한다. Git에서 소스를 관리하는 것처럼 이미지 버전 관리 기능을 제공하며, 중앙 관리를 위해 저장소에 이미지를 올리고, 받을 수 있다(Push/Pull). 그리고 GitHub처럼 Docker 이미지를 공유할 수 있는 Docker Hub도 제공한다(GitHub처럼 유료 개인 저장소도 제공합니다).

 

리눅스 컨테이너

  • 오래 전부터 리눅스/유닉스 환경은 chroot라는 명령을 제공했다. chroot는 파일시스템에서 루트 디렉터리(/)를 변경하는 명령이다. chroot로 특정 디렉터리를 루트 디렉터리로 설정하면 chroot jail(감옥)이라는 환경이 생성되는데, chroot jail안에서는 바깥의 파일과 디렉터리에 접근할 수 없다. 이처럼 chroot는 디렉터리 경로를 격리하기 때문에 서버 정보 유출과 피해를 최소화 하는데 주로 사용되었다.
  • 하지만 chroot는 chroot jail에 들어갈 실행 파일과 공유 라이브러리를 직접 준비해야 하고 설정 방법이 복잡하며, 완벽한 가상 환경이 아니기 때문에 각종 제약이 많다. 그래서 이후 리눅스는 LXC(LinuX Container)라는 시스템 레벨 가상화를 제공했다.
  • LXC는 컴퓨터를 통째로 가상화하여 OS를 실행하는 것이 아닌 리눅스 커널 레벨에서 제공하는 일종의 격리(Isolate)된 가상 공간이다. 이 가상 공간에는 OS가 설치되지 않기 때문에 가상 머신이라 하지 않고, 컨테이너라 부른다.
  • 리눅스 커널의 Control Groups(cgroups)는 CPU, 메모리, 디스크, 네트워크 자원을 할당하여 완전한 형태의 가상 공간을 제공한다. 또한 프로세스 트리, 사용자 계정, 파일시스템, IPC 등을 격리시켜 호스트와 별개의 공간을 만드는데, 이를 Namespace isolation(namespaces)이라고 한다.
  • LXC는 리눅스 커널의 cgroups와 namespaces 기능을 활용하여 가상 공간을 제공한다. LXC는 격리된 공간만 제공할 뿐 개발 및 서버 운영에 필요한 부가 기능이 부족했다. Docker는 리눅스 커널의 cgroups와 namespaces를 기반으로 하여 이미지, 컨테이너 생성 및 관리 기능과 다양한 부가 기능을 제공한다. Docker가 처음 개발될 당시에는 LXC를 기반으로 구현을 하였지만 최근부터는 Containerd(runC)를 개발하여 사용하고 있다.

 

도커의 이미지와 컨테이너

이미지

  • Docker 이미지라고 하면 베이스 이미지에 필요한 프로그램과 라이브러리, 소스를 설치한 뒤 파일 하나로 만든 것을 말한다. 베이스 이미지란 리눅스 배포판의 유저랜드만 설치된 파일을 뜻한다. 베이스 이미지는 보통 리눅스 배포판 이름으로 되어 있거나 리눅스 배포판 유저랜드에 Redis나 Nginx 등이 설치되어 있다. 각 리눅스 배포판 이름으로 된 베이스 이미지는 배포판 특유의 패키징 시스템을 이용할 수 있으며, 원하면 베이스 이미지를 직접 만들 수도 있다.

https://pyrasis.com/jHLsAlwaysUpToDateDocker/Unit01/02

  • 매번 베이스 이미지에 필요한 프로그램과 라이브러리, 소스를 설치하면 용량이 큰 이미지가 중복되어 생성될 것이라고 생각하기 쉽다. 하지만 Docker 이미지는 베이스 이미지에서 바뀐 부분만 이미지로 생성하고, 실행할 때는 베이스 이미지와 바뀐 부분을 합쳐서 실행한다.
유저랜드란?
OS는 메모리 사용을 기준으로 커널 공간과 유저 공간으로 나눌 수 있다. 유저 공간에서 실행되는 실행 파일과 라이브러리를 유저랜드(userland)라고 한다. 리눅스는 커널만으로 부팅할 수 없으므로 부팅에 필요한 최소 실행 파일과 라이브러리 조합을 뜻하기도 한다. 보통 리눅스 배포판에서 유저랜드는 부팅에 필요한 실행 파일과 라이브러리 그리고 고유의 패키징 시스템을 포함한다.

https://pyrasis.com/jHLsAlwaysUpToDateDocker/Unit01/02

  • centos:centos7 이미지는 511136ea3c5a, 34e94e67e63a, b517b77b1a65가 조합된 것이다. centos:centos6 이미지에 서비스 운영에 필요한 프로그램을 설치한 뒤 Docker 이미지를 생성하면 example:0.1과 같은 형태가 된다. 즉 Docker는 이미지를 통째로 생성하지 않고, 바뀐 부분만 생성한 뒤 부모 이미지를 계속 참조하는 방식으로 동작하는데 이를 레이어라고 한다.
  • Docker 이미지는 파일이기 때문에 저장소에 올린 뒤 다른 곳에서 받을 수 있다. 그리고 저장소에 올릴 때는 자식 이미지와 부모 이미지를 함께 올리고, 받을 때도 마찬가지로 부모 이미지를 함께 받지만, 이후에는 내용이 바뀐 이미지만 주고 받는다.

컨테이너

  • Docker 컨테이너는 이미지를 실행한 상태다. 이미지로 여러 개의 컨테이너를 만들 수 있다. 운영체제로 보면 이미지는 실행 파일이고 컨테이너는 프로세스다. 이미 실행된 컨테이너에서 변경된 부분을 이미지로 생성할 수도 있다.
  • Docker는 특정 실행 파일 또는 스크립트를 위한 실행 환경이라 보면 된다. 리눅스/유닉스 계열은 파일 실행에 필요한 모든 구성요소가 잘게 쪼개어져 있다. 시스템 구조가 단순해지고 명확해지는 장점이 있지만 의존성 관계를 해결하기가 어려워지는 단점이 있다. 그래서 리눅스 배포판 별로 미리 컴파일된 패키지(rpm, deb 등)라는 시스템이 나왔지만 서버를 실행할 때마다 일일이 소스를 컴파일하거나 패키지를 설치하고, 설정하려면 상당히 귀찮다. 서버 구성을 미리 해놓은 Docker 이미지를 사용하면 실행할 서버가 몇 개가 되든 손쉽게 해결할 수 있다.

 

Reference

반응형