본문 바로가기
CI & CD/Docker & Kubernetes

[컨테이너 개발 실전 입문] #1 도커의 기초

by Riverandeye 2019. 11. 27.

 

01. 도커란 무엇인가. 

 

정의

도커는 컨테이너형 가상화를 구현해주는 상주 애플리케이션 (도커 데몬) 과 이 어플리케이션을 조작하기 위한 도커 CIL로 구성된 Product이다. 넓은 의미로는 도커 허브 및 클라우드를 비롯한 생태계를 포함한다.

 

이점

- 기존 가상화 소프트웨어 보다 가볍다 (게스트 OS 없이 호스트 운영체제에서 작동)

- 개발 후 운영 환경에 대한 배포나 어플리케이션 플랫폼으로 작용할 수 있다. 

- 조작이 간편하여 로컬 머신의 개발 환경 구축에 사용된다.

 

적합하지 않은 경우

- 도커 컨테이너는 운영체제의 동작을 완전히 재현하지는 못한다. 엄밀한 리눅스 계열 운영 체제의 동작이 요구되면 가상화 소프트웨어를 사용하는 것이 낫다. 

- 비리눅스 환경이 필요한 경우엔 도커가 적합하지 않다.

 

기본 개념

- 컨테이너 가상화 기술

runC 라는 컨테이너 가상화 오픈소스를 이용한다. 도커 Daemon에 있어서 Host OS의 Kernel과 소통한다.

이와 다른 기존 개념은 호스트 운영 체제 가상화인데, 운영 체제 위에서 가상화 소프트웨어를 사용해 하드웨어를 에뮬레이션 하는 방법으로 게스트 운영체제를 만드는데, 자체적으로 CPU, RAM 등의 자원을 분리시키기 때문에 오버헤드가 크다. 

 

LXC와 도커의 차이점

LXC는 runC를 사용하기 이전에 컨테이너 가상화를 구현하기 위한 런타임인데, 애플리케이션을 복제할 때 호스트간 설정 차이로 오류가 주로 발생하는 바람에, 배포 및 운영이 원활하지 않았다고 한다.

LXC에 비교한 도커의 차이는 다음과 같다.

 

- Docker Engine으로 호스트 운영 체제의 영향을 받지 않는 실행 환경 구현

- Dockerfile(DSL)을 이용한 컨테이너 구성 및 애플리케이션 정의 및 배포

- 이미지 버전 관리

- 레이어 구조를 갖는 이미지 포맷 (빌드를 나누어 할 수 있음)

- 도커 레지스트리(이미지 저장 서버 역할을 함)

- 프로그램 가능한 다양한 기능의 API

 

도커 파일 을 기반으로 컨테이너 복제 및 배포가 이루어져 재현성이 높고, 컨테이너에 애플리케이션 실행 환경을 함께 배포하여 의존성 문제를 근본적으로 해결하였다. 

 

02. 도커를 사용하는 의의

 

그래서 왜 도커를 도입하는가? 

- 변화하지 않는 실행 환경으로써 멱등성 (Idempotency) 확보

- 코드를 통한 실행 환경 구축 및 애플리케이션 구성

- 실행 환경과 애플리케이션의 일체화로 이식성 향상

- 시스템을 구성하는 애플리케이션 및 미들웨어의 관리 용이성

 

사실 실행환경이 원인이 되는 것을 방지하는거 하나로도 매우 큰 역할을 하는 것이다. 

웹 서버도 복잡한 절차 없이 컨테이너로 설정할 수 있는 등 개발 및 운영 업무가 쉬워진다.

파이썬의 requirement.txt , nodejs의 nodebrew 와 같이 버전 관리를 위해 여러 도구들이 마련되어 있는데, 도커는 이러한 코드 작성마저 불필요하게 만드는 것이다. 

 

에플리케이션 구성 관리

인프라와 애플리케이션이 함께 담겨져 있는 도커 컨테이너를 여러개 조합하여 구성해야 하는데, 

이를 관리해주는 것이 Docker compose 이다. yaml 포맷으로 컨테이너를 정의하고, 의존관계를 정의하여 시작 순서를 제어한다. Docker swarmDocker compose 를 이용하여 여러 서버에 걸쳐 있는 여러 컨테이너를 관리할 수 있도록 해준다. 

도커 스웜은 컨테이너 배치 및 로드 밸런싱 기능 등을 갖추고 있으며, 롤링 업데이트(컨테이너 교체 투입)가 가능하다.

 

Kubernetes 는 도커 스웜과 같은 Container Orchestration 도구인데, 도커 스웜보다 기능이 충실하며 확장성이 높다. 

 

댓글