Docker 개요와 입문

Docker ?

2013년 3월에 출시된 오픈소스 컨테이너 프로젝트입니다. Docker를 너무나도 늦게 접해서 출시 이후 탄생 배경과 발전 과정을 잘 모르지만, 사용하면서 다양한 환경의 일치라는 장점 때문인지 Docker가 매 순간 경이롭다고 느끼고 있습니다.

가상화

이전부터 컴퓨터 안에 컴퓨터를 만들려는 노력은 지속되어 왔고, Cloud Computing이 등장하면서 이러한 노력은 더욱 개선되고 발전해왔다고 생각합니다.

컴퓨터 안에 컴퓨터를 만드려는 이유는 크게 1) 좋은 서버의 경우 서버 한 대를 모두 활용하지 못하는 경우가 있고, 2) 가상 머신을 여러개 띄워서 일을 시키면 더 효율적이기 때문이라고 생각합니다.

그렇다면 미리 구축한 가상 머신 이미지를 여러 서버에 복사하여 실행하면 좋겠다는 생각을 가지기 쉽습니다. 하지만 컴퓨터 안에 컴퓨터를 또 만드는 가상화의 경우 각종 성능 손실이 크게 발생한다는 단점이 있습니다. 뿐만 아니라 가상화 이미지 안에 OS를 담아야 해서 이미지 사이즈 역시 만만치 않습니다.

가상화 < Docker

하지만 Docker는 다릅니다. Docker Image를 실행시킨 Docker Container는 (이따가 Image와 Container의 관계는 다시 기술하겠습니다.) 컨테이너 안에 가상 공간 실행 파일을 호스트 OS 에서 직접 실행한다는 장점이 존재하고 (호스트 OS의 자원을 사용), 하드웨어 가상화 계층이 없는 등의 이유로 Docker는 상당히 빠릅니다.

Docker, Image, Container

그렇다면 Docker와 이미지 그리고 컨테이너의 관계를 알아봅시다.

  • Docker

    컨테이너 기반의 오픈소스 가상화 플랫폼입니다.

  • Docker Image

    컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 파일이라고 생각하면 됩니다. 우리가 OS를 설치할 때 사용하는 Image와 상당히 유사한 느낌을 받을 수 있습니다.

  • Docker Container

    도커 컨테이너는 도커 이미지를 실행한 상태로 추가되거나 변하는 값들은 모두 컨테이너 내부에 저장하게 됩니다.

예시를 들어 간단히 살펴보면,

  • Docker Ubuntu 이미지는 Ubuntu 실행을 위한 모든 파일을 가지고 있으며,
  • Docker Gitlab 이미지는 CentOS 기반으로 ruby, go, database, Redis, Gitlab Source, Nginx 등을 가지고 있습니다.

Docker가 필요한 이유와 그 장점

Docker가 필요한 이유

DevOps

DevOps의 등장과 발전으로 개발자들의 개발 주기는 점점 더 짧아졌으며, 짧아진 개발 주기만큼 배포 역시 더 자주 이루어질 수 있어야 합니다.

Microservice Architecture

Microservice의 지향이 증가하면서 프로그램은 더 잘게 쪼개어지고, 각 단위 프로그램의 관리는 점점 더 복잡해집니다.

위와 같은 두 가지 상황 속에서 기존의 서버 운영 방식으로는 어느정도 한계점이 존재한다는 것이 분명합니다. 단순하게 생각했을 때 서버 대수를 수백 - 수천 대 운영한다고 하면 개발과 배포 환경의 일치부터 각 서버들의 관리가 쉽지는 않았을 것입니다.

Docker 장점

하지만 Docker를 사용하면 다릅니다. 어떤 애플리케이션이든 쉽게 배포 패키지를 만들 수 있을 뿐만 아니라, 개발하면서 만들어진 패키지와 배포 당시의 패키지를 서로 일치시킬 수 있습니다. 여기에 더해 어떤 환경에서든 (특히 Linux) 배포를 쉽게 할 수 있다는 이유로 개발팀이 배포를 고려해야 할 일들이 점점 줄어들게 된 것이죠.

개발 환경과 운영 환경의 일치

위에서 언급하였지만 개발 환경과 운영 환경의 일치에 대한 더욱 더 구체적인 아이디어를 제시하면 다음과 같습니다. 개발팀은 애플리케이션에 모든 의존성을 포함해 빌드할 수 있고, 개발/테스트 환경에서 이를 한 번 돌려본 후, 애플리케이션과 의존성을 빠짐없이 정확히 묶어서 서비스 운영 환경에 전달할 수 있다는 것을 의미합니다.

Docker 프로세스

Docker 사용에 따른 개발 환경과 운영 환경에 대한 프로세스는 다음과 같습니다.

  1. 개발자들은 도커 이미지를 빌드하고, 이를 도커 저장소에 보낸다.
  2. 실제 서비스 환경을 운영하는 사람들은 도커 저장소에 저장된 이미지를 받고, 해당 이미지에 대한 자원을 할당한다.
  3. 할당된 자원을 바탕으로 만들어진 이미지를 배포(컨테이너화)한다.

따라서 각 개발자들은 이미지만 잘 빌드하면 이를 배포하는 엔지니어는 테스트 후 자원만 잘 할당해주면 되는 것입니다. 기존처럼 개발 환경과 운영 환경이 서로 일치하지 않아 커뮤니케이션 하는 비용이 줄어들게 된 것이죠.

저는 앞서 언급한 것처럼 Docker 라는 기술을 최근에 제대로 알게 되었습니다. 하지만 Docker 이미지만 가지고 어떤 환경이든 쉽게 꾸릴 수 있을 뿐만 아니라, Microservice 아키텍쳐를 구성하기에 너무도 편리하다는 인식이 강하게 바뀌어서 각종 개발 뿐만 아니라 연구에도 Docker Image 하나로 어떠한 작업이든지 해결하려고 하고 있습니다.

더욱 더 자세한 Docker 사용법은 이후 포스트에서 언급해보려고 합니다. 더욱 더 아름다운 Docker를 살피려면 이후 포스트를 확인해주세요 :)

0%