[Docker] 도커의 개념과 장점

2023. 1. 25. 05:46
반응형

가상 머신의 등장과 문제점

컴퓨터 기술의 발전에 따라서, 컴퓨터 안에서 또다른 컴퓨터를 만들어 이용할 수 있게 하는 기술이 생겨났다. 이를 가상 머신이라고 한다.

  • 한 컴퓨터에서 두 개 이상의 운영체제를 사용이 가능하게 하는 기술
  • 컴퓨터의 시스템 환경에 영향을 받지 않고 독립적인 환경에서 Task를 진행 가능
  • 가상화 기술을 이용하여 서버를 임대해주는 기술이 바로 클라우드 서비스

하지만 이런 가상 머신에는 문제점이 있었다. 컴퓨터를 그대로 복제하여 사용하기에 독립적인 운영체제(Guest OS)를 생성한다. 따라서 용량을 많이 잡아먹으며 성능 문제이 발생한다는 측면이 있었다. 이를 바탕으로 컨테이너 기반의 격리 환경을 만들어주는 Docker가 사용되기 시작하였다.

 

 


 

 

Docker란 무엇인가?

 

1. 반가상화

기존의 CPU안에 가상화 기술을 넣어 별도의 Guest OS 안에서의 환경을 제공하는 가상머신에서, 호스트의 커널과 시스템 Call을 공유하면서, 서버 운용을 위한 프로그램과 라이브러리만 격리하여 설치한다. 컨테이너 기반의 격리 환경에서의 개발과, 테스트, 서비스 환경을 구축하는 기술이다. 하드웨어 가상화 계층이 없으며 성능이 가상화 기술에 비해 뛰어나다.

 

 

2. 컨테이너 기술

리눅스 커널에서 제공하는 컨테이너 기술을 이용한다. 컨테이너 안에 가상 공간을 만든 이후 실행 파일을 호스트에서 직접 실행한다. 격리된 환경에서 Application을 실행할수 있어 외부 환경에 영향을 받지 않고 항상 같은 조건에서 Application의 구동이 가능해진다.

 

 

 

3. 이미지와 컨테이너

3-1. 이미지

서비스 운영에 필요한 서버 프로그램, 소스 코드, 컴파일된 실행파일과 일련의 명령을 묶은 형태, 저장소에 올리고(push) 받는(pull) 파일

Dockerfile을 통해 작성하여 Build하는 행위가 이미지를 생성하는 것이다.

직접 이미지를 빌드하는 것 뿐 아니라 빌드한 이미지를 중앙 저장소인 DockerHub에 배포하고, 배포된 이미지를 사용하는 것에 특화되어 있다.

Dockerhub와 개인 저장소에서 이미지를 공유할 때 바뀐 부분만 주고받을 수 있다. 각 이미지는 의존관계를 형성하게 된다.

 

3-2. 컨테이너

컨테이너 실행 상태라는 것은 빌드된 이미지를 컨테이너에 올려 실행하는 런타임 상태. 이미지는 직접 빌드할 수도 있고, DockerHub에서 가져올 수도 있다. 

하나의 이미지로부터 여러개의 컨테이너를 실행시키는 것이 가능하다.

쉬운 개념으로 말하면 이미지는 실행파일, 컨테이너는 프로세스의 개념으로 생각하자.

 

 

3-3. 레이어와 Union file System

 

도커에서 이미지를 빌드할 때 이미지의 바뀐 부분을 관리하는 방식이다. 

이미지를 빌드할 때 만약 기존 이미지에서 변경된 부분이 있다면, 바뀐 부분만 새로 이미지 Layer를 생성하게 되며 컨테이너에서 실행할 때 베이스 이미지 Layer와 바뀐 이미지 Layer를 합쳐서 컨테이너에서 실행한다.

즉, 도커는 이미지를 레이어 단위로 관리하고 있으며 각각의 레이어를 재사용하여 이미지를 효과적으로 빌드하게 설계되어 있다.

 

Docker의 레이어

다음처럼 컨테이너의 구조는 Image layers와 Container layer로 나누어진다.

이미지 레이어는 이미지의 변경 시 갱신하는 것이 아닌 바뀐 부분을 쌓아 올리는 방법으로 사용한다.

비유가 잘 와닿을지 모르겠으나 선생님이 학생기록부를 작성한다고 할 때, 1학년 선생님이 "철수는 사교성이 좋고 취미는 축구이다"라고 기록해두었다. 그런데 2학년이 되어서 취미가 독서로 바뀌었다. 그러면 1학년 선생님이 작성한 내용을 지우고 "철수는 사교성이 좋고 취미는 독서이다"라고 작성하는 방법이 아니라, 1학년 내용을 남겨두고 2학년 내용에 추가적으로 "취미가 축구에서 독서로 변경되었다."로 바뀐 부분만 추가로 쌓아올리는 것이다.

 

이미지 레이어는 Read-Only의 특성을 지닌다고 되어 있는데 이러한 특성 때문에 다른 컨테이너들에서 동일한 이미지를 사용할 수 있는 것이다. 변경이 없으므로 동일한 우분투 환경을 서로 다른 컨테이너에서 사용가능한 것이다.

컨테이너 레이어는 Write가 가능한 특성을 지니며, 컨테이너의 최상단 레이어에서 작용하게 된다. 컨테이너가 생성된 후 모든 변경사항들은 해당 레이어에 반영이 되며, 같은 이미지 레이어를 사용해도 각기 다른 컨테이너 환경을 지니게 되는 것은 해당 레이어 때문이다.

하나의 이미지로 여러개의 컨테이너를 운용한다.

 

 

 

 

 

 


Docker의 장점

 

1. 일관성있는 개발 환경 세팅

회사에 신입사원이 입사했다고 치자. 가장 먼저 해야 할 일은 기존 직원들의 개발 환경과 마찬가지로 신입의 OS 환경을 세팅하고, 개발에 필요한 도구, DB등을 설치하는 과정이 필요하다. 하지만 이는 아무리 메뉴얼이 잘 되어 있다고 해도 환경의 차이가 생기기 마련이다. Docker를 이용하면 Dockerfile이라는 환경세팅 메뉴얼 하나만 주면 독립된 컨테이너 안에서 개발에 필요한 Application들이 구동되는 환경이 구축된다.

 

 

2. 개발 환경과 운영 환경의 통합

컨테이너 안에서의 작업을 배포하려면 Image로 생성하여 운영 서버에 전달하면 된다. 개발했을 때의 환경과 동일한 환경을 복제 가능하기 때문에 내부 시스템과의 의존성 및 충돌을 거의 고려하지 않아도 된다. 즉 개발할 때는 됬는데 막상 배포하고 나니까 안되는 현상을 줄일수 있는 것이다.

가상 서버를 생성, 삭제, 복제, 배포, 프로세스 관리, 로깅 등의 과정이 자동화되어 CI/CD가 가능해지며, 일관성과 자동화를 보장받을 수 있게 되는 것이다.

서버 개수가 많아지더라도 모든 것이 사람이 세팅하는 것이 아니라 코드로 작성된 이미지가 자동화해주기 때문에 손쉽게 DevOps 환경을 구축할 수 있다.

 

 

 

3. Application의 독립성과 확장성을 보장

어플리케이션 모듈들의 의존관계에 대한 고려를 하지 않아도 되므로 인증 API/ 검색 API/ 데이터베이스 등을 컨테이너라는 독립된 형태로 개별의 모듈별 기능에 대한 개발에만 힘을 쓸 수 있다.

만약 모듈이 추가되어야 하면 컨테이너를 추가시키면 되며, 특정 컨테이너에 대한 부하와 같은 이슈가 생기면 해당 컨테이너에 대한 보수만 하면 되므로 유지보수가 용이해진다.

 

 

 

 

 

Reference

도커 공식문서

 https://docs.docker.com/storage/storagedriver/

 

반응형

BELATED ARTICLES

more