Container
흔히들 Docker
를 Container
기반의 가상화 기술이라고 설명을 하는데, Docker
는 컨테이너 기술을 활용해 제공하는 플랫폼 서비스이자, 현 시점에서 컨테이너 기술을 선도하는 기업 입니다. 따라서 Docker
를 이해하기 위해서는 Container
에 대해서 알고 넘어가는것이 필수 입니다.
Container
혹은 LXC(Linux Container)
라 불리는 기술은 Docker
에서 만든 새로 생긴 기술이 아닙니다.
2000년대 초반 FreeBSD Jail
이름으로 시스템을 Jail
으로 분할 시켜 ‘격리된 환경’을 제공하는것으로 시작해 Host OS의 커널을 공유하지만 나머지 시스템에 대해서는 격리시킨 공간을 제공하는 현재의 Container
로 발전해왔습니다.
즉 Container
기술은 OS레벨에서 제공되는 기술이며 Docker
는 사용자들이 Container
를 사용 할 수 있게끔 해주는 Container System
이라고 이해를 해 주시면 될 것 같습니다.
Docker에서는 container
에 대해서 다음과같이 설명 하고 있습니다.
A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another
‘코드, 런타임, 시스템 툴, 라이브러리, 세팅 등 모든것을 포함한
실행가능한
소프트웨어 패키지의 단위’
Container
는 실행 소프트웨어를 관련 라이브러리 환경과 묶인 패키지로써 격리된 환경
울 제공 해 줍니다.
- ‘그렇다면 가상머신(
VM
) 같은건가?’
제공받을 수 있는 효과 자체는 유사 할 수 있으나 위에서도 설명드렸듯이 Host OS 커널을 공유한다는 점에서 Container
는 VM
보다 더 작은 가상화 개념으로 이해하시면 될 것 같습니다. 아래, Docker에서 제공하는 그림을 통해 VM
과 다른 Container
의 가상화 레벨을 확인하실수 있습니다.
VM
의 경우 OS 레벨에서 가상화를 제공하기 때문에 매우 무거울 수 밖에 없습니다. 반면에 Container
는 Host OS 커널을 공유해 사용하고 격리된 프로세스
를 통해 마치 가상환경처럼 사용되기 때문에 가벼운 패키지로써 동작 할 수 있습니다.
"Container가 VM을 대체 할 수 있을까?"
에 대한 주제로 Docker blog에 포스팅 된 글이 있습니다.
- Container는 VM보다 민첩하다 (Agile)
- Container는 어떤 환경에서나 배포 가능하다.
- 기존 VM 환경에서 Container를 구축하여 사용도 가능하다.
- Container 사용으로 자원을 효과적으로 사용 하여 VM 비용을 절약할수있다.
- Container는 애플리케이션간에 격리계층을 생성하기때문에 본질적으로 안전하다.
전문 : https://www.docker.com/blog/containers-replacing-virtual-machines/
Docker
위에서 Container
에 대해서 알아보았는데요, Docker
는 사용자들에게 컨테이너 기술을 잘 사용 할 수 있도록 다양한 서비스를 제공하는 플랫폼입니다.
그렇다면 Docker
는 어떤 서비스를 제공하여 사용자들이 Container
기술을 잘 활용 할 수 있도록 해줄까요?
- Container build
- Container deploy
- Container run
이외에 친절하게도, 공식 사이트에서 도커를 통해 다음과같은 일들을 할 수 있다고 설명하고 있습니다.
(https://www.docker.com/use-cases/productivity)
|도커 이전|도커 이후|
|:–|:–|
|config 설정, 개발환경 세팅등을 직접 수행|설정된 도커 이미지로 쉽게 처리 가능|
|개발환경의 차이로인해 이식성이 낮음|일관된 환경 제공으로 이식성이 매우 높음|
|개발 툴, 프레임워크 설치의 복잡도|개발 툴, 프레임워크를 선택만으로 간편한 설치 가능|
|직접 빌드하고, 배포하는데 시간이 오래걸림|DockerHub에 이미지 배포로 자동 서버 배포,빌드 통합 과정 수행 가능|
|수동 테스트를하고, CI를 구축하는데도 오랜시간이 걸림|자동으로 테스트 할 수 있고 CI 구축도 편하게 진행 가능|
|개발과 CI/CD tool 들간의 연결 부족으로 app 제공 속도가 늦음|Webhook을 통해 쉽게 연동 할 수 있음|
|컨테이너 레지스스트리를 직접관리하여 복잡하고 많은 비용이 들어감|클라우드에서 컨테이너 레지스트리를 관리 할 수 있음|
|공유 이미지 접근권한 설정이 어려움|접근권한 설정이 간편함|
|알림 설정이 어려움|slack integration을 통해 이미지 빌드/업데이트 알림 간편하게 처리 가능|
Docker image
Docker
를 사용하는데에 있어 image
는 가장 중요한 개념중 하나입니다.
Docker image
는 코드, 런타임, 시스템 툴, 라이브러리, 세팅 등 모든것을 포함한 실행가능하고(Runnable) 변하지않는(Immutable)
소프트웨어 패키지 입니다.
눈치 채신분도 있으시겠지만, 위에서 Container
를 설명한 개념과 똑같은 개념으로 설명을 드렸는데요 Docker image
는 결국 Container
를 생성하기 위한 템플릿
이고 Container
는 실행중인 image
라고 생각하시면 좀더 이해가 쉬울것 같습니다.
Docker hub
결국 동작하는 Container
를 만들기 위해서는 image
가 존재해야 하는데, Docker에서 제공하는 이미지 저장소인 Docker hub
에서는 즉시 사용 가능한 수많은 이미지들을 제공합니다.
사용법도 매우 간단합니다.
docker pull mysql
위 명령어와 같이 사용하고자 하는 이미지(mysql)를 docker hub
에서 다운받고
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
run
을 실행 하면, 벌써 사용가능한 mysql 가상환경 세팅이 완료되었습니다.
아마도 여러분이 사용하고자 하는, 대부분의 공개된 서비스들은 이미 Docker hub
에서 지원하고 있을것입니다.
https://hub.docker.com/search?q=&type=image
운영환경에서의 Container
실제로 Docker
는 ‘가볍고 편리하게’ 서비스를 실행시킬 수 있다는 장점때문에, 개발자들의 로컬에 서드파티 서비스를 동작시키는 용도로 많이들 사용하고있습니다. 이러한 장점은 누구나 인정을 하는 점 이지만, 굳이 운영환경에서 Container를 통해 서비스를 해야하는지에 대한 의구심을 가지고 계신분들도 있습니다.
운영환경에서 Container 기술을 사용한다면 다음과같은 이점들을 얻을 수 있습니다.
- 소프트웨어의
'일관성'
각각 다른 환경을 가진 Snowflake server(눈송이 서버)
들에서 운영을 한다거나, Local 환경과 다른 운영환경으로 인해 서비스가 다르게 동작하거나 정상 실행시키는데에도 실패한 경험이 있으실겁니다.
컨테이너
환경을 일관되게 맞추어 서비스를 수행시킴으로써 운영환경 및 실행 시점과 관계없이 늘 동일한 개발환경을 구축하고 실행 시킬 수 있습니다.
- 하나의 실행가능한 패키지
위에서 계속해서 말 해 왔듯이, 컨테이너를 구성시 서비스 동작에 필요한 일련의 전반적인 필요한 시스템들을 하나의 패키지
화 시켜 수행시키기때문에 복잡한 여러 설치 및 설정 과정 없이 하나의 container
만 동작시키기만 하면 됩니다.
- 리소스 격리
만약, 한 서버에서 여러 컨테이너를 수행시킨다고 가정할때, 컨테이너들에대한 자원 할당을 설정해줌으로써 각 컨테이너별로 사용하는 자원을 격리시키는것이 용이합니다.
Container ochestration
Container
기술의 특성상 서비스가 확장 될 수록 Container
의 갯수는 자연히 증가하기 마련입니다. 수많은 Container
들을 개발자가 하나씩 관리하기에는 무리가 있기에 Container Ochestration
이라는 멋진이름으로 수많은 Container
들을 관리 할 수 있는 툴이 있습니다.
대표주자인 Kubernetes(k8s)
, Docker swarm
등 의 다양한 툴이 있는데 툴마다 조금씩 다르겠지만 이들이 전반적으로 제공하는 내용들은 다음과 같습니다.
- 컨테이너 리소스 할당
- 컨테이너 배포 / 복제 자동화
- 컨테이너 가용성
- 컨테이너 스케일링
- 컨테이너 스케쥴링
- 노드 클러스터링
- 로깅 / 모니터링
- 로드 밸런싱
- 트래픽 라우팅
- …