본문 바로가기
프로그램/dockerize

Docker(도커)란?

by 게맛쌀 2021. 7. 22.
728x90
반응형

Docker(도커)

서비스 형태의 플랫폼은 서비스 제공업체가 고객에게 플랫폼을 제공함으로써 고객이 일반적으로 소프트웨어  개발 프로세스에 필요한 인프라를 구축하고 유지할  필요 없이  비즈니스  애플리케이션을 개발, 실행 관리할  수 있도록 하는 클라우드 컴퓨팅의 시대를 말합니다. 이미 많은 사람들에게 친숙한 기술용어가 되어버린 container, 그 시대를 이끌고 있는  대표주자가  바로 Docker입니다.

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

다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해 줍니다.. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고  조립 PC, AWS, Azure, Google cloud 등 어디에서든 실행할 수 있습니다.

 

그러면 컨테이너는 무엇일까?

운영체계를 기반으로 만들어진 대부분의 Software는 그 실행을 위하여 OSSoftware가 사용하는 동적 Library에 대하여 의존성을 갖는다. , Software의 실행을 위해선 OSLibrary를 포함, Software가 필요로 하는 파일 등으로 구성된 실행환경이 필요한데, 하나의 시스템 위에서 둘 이상의 Software를 동시에 실행하려고 한다면 문제가  발생하기도 한다. 예를 들면, Software A, B가가  동일한 Library를 사용하지만 서로 다른 버전을 필요로 하는 경우라던지 두 Software 운영체제가 다를 경우   다양한  경우에서 문제가 발생한다. 이런  상황에서 가장 간단한 해결책은 두 Software를 위한 시스템을 각각 준비하는 것인데, 시스템을 각각 준비할 경우 비용이라는 다른 문제가 발생한다. (100개의 Software라면 100개의 시스템이 준비되어야 한다.).) 이러한 문제점을 효율적으로 해결한 것이 바로 컨테이너이다. 컨테이너(Container)는 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반 환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말한다. 컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공한다.

(컨테이너에 대해 더 자세히 알고 싶다면 아래 링크 참조)

 

Container( 컨테이너 )란?

컨테이너는 사전적의미로 어떤 물체를 격리하는 공간을 의미합니다. 하지만 리눅스 기술을 의미하는 컨테이너는 애플리케이션을 실제 구동 환경ㅇ으로부터 추상화할 수 있는 논리 패키징 메커

masssal.tistory.com

 

Container 기술 자체는, 격리된 실행환경을 제공하기 위한 인프라 기술이긴 하지만, Docker는 이미 그 이름에서 향기를 품고 있듯이, 그 목적부터 Software 또는 Service의 빠르고 효율적인 Shipping에 강하게 집중하고 있다. 때문에 Docker, 근간이 되는 격리 기술을 넘어 ContainerImage, 네트워크와 서비스, 보안 등 Software의 배포와 생명 주기를 관리할 수 있는 다양한 주변 기능에 초점이 맞추어져 있다고 할 수 있다.

 

이미지(Image)

이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않습니다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가  삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.

도커 저장방식

 

Docker Layer

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

도커는 이런 문제를 해결하기 위해 레이어 layer라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해 줍니다. 이미지는 여러 개의 읽기 전용 read only 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성됩니다. ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 됩니다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 예상대로 A + B + C + nginx + source 레이어로 구성됩니다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운로드하면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있습니다.

컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 read-write 레이어를 추가합니다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용합니다.

 

이미지 경로

이미지는 url 방식으로 관리하며 태그를 붙일 수 있습니다. ubuntu 14.04 이미지는 docker.io/library/ubuntu:14.04 또는 docker.io/library/ubuntu:trusty이고 docker.io/library는 생략 가능하여ubuntu:14.04로. 이러한 방식은 이해하기 쉽고 편리하게 사용할 수 있으며 태그 기능을 잘 이용하면 테스트나 롤백도 쉽게 할 수 있습니다.

 

dockerfile

도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSLDomain-specific language언어를 이용하여 이미지 생성 과정을 적습니다. 추후에 문법에 대해 자세히 다루겠지만 위 샘플을 보면 그렇게 복잡하지 않다는 걸 알 수 있습니다. 이것은 굉장히 간단하지만 유용한 아이디어인데, 서버에 어떤 프로그램을 설치하려고 이것저것 의존성 패키지를 설치하고 설정 파일을 만들었던 경험이 있다면 더 이상 그 과정을 블로깅 하거나 메모장에 적지 말고 Dockerfile로 관리하면 됩니다. 이 파일은 소스와 함께 버전 관리되고 원한다면 누구나 이미지 생성과정을 보고 수정할 수 있습니다.

반응형

'프로그램 > dockerize' 카테고리의 다른 글

도커와 쿠버네티스의 차이?  (0) 2021.07.26
Kubernetes(쿠버네티스)란?  (0) 2021.07.23
Container( 컨테이너 )란?  (0) 2021.07.19

댓글