Docker를 알아보자 (Docker-1)

Container

흔히들 DockerContainer 기반의 가상화 기술이라고 설명을 하는데, 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 커널을 공유한다는 점에서 ContainerVM보다 더 작은 가상화 개념으로 이해하시면 될 것 같습니다. 아래, Docker에서 제공하는 그림을 통해 VM 과 다른 Container의 가상화 레벨을 확인하실수 있습니다.

1

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 등 의 다양한 툴이 있는데 툴마다 조금씩 다르겠지만 이들이 전반적으로 제공하는 내용들은 다음과 같습니다.

  • 컨테이너 리소스 할당
  • 컨테이너 배포 / 복제 자동화
  • 컨테이너 가용성
  • 컨테이너 스케일링
  • 컨테이너 스케쥴링
  • 노드 클러스터링
  • 로깅 / 모니터링
  • 로드 밸런싱
  • 트래픽 라우팅