도커(Docker)의 탄생 배경
최근 들어 소프트웨어 개발을 할 때 서버를 직접 서버 부품들을 사고, 서버 설정을 하고, 계속 가동해서 서버를 구성하는 시스템보다, 클라우드 서비스에서 몇 번의 클릭으로 원하는 사양의 서버를 구매해 사용하는 경우가 늘어나고 있습니다. 하나의 소프트웨어에 필요한 서버가 많은 경우도 있습니다. 클라우드 서비스에서 서버 1개~2개를 구매해 사용해서 설정한다면 무리가 없지만, 서버를 여러 대 구매해서 사용하는 경우 서버의 환경을 모두 일일이 설정해주는 것은 쉽지 않은 일입니다.
이러한 단점을 해결하기 위해 Immutable Structure가 탄생했습니다. Immutable Structure는 변하지 않는 구조라는 뜻으로 호스트 OS와 서비스 운영 환경을 분리해 한번 설정하고 변경하지 않는 구조를 말하 빈다. 이때 서비스 운영 환경을 이미지라는 것으로 생성하여 배포합니다. 이런 Immutable Structure를 구현한 것이 Docker입니다. 이런 구조의 장점은 다음과 같습니다.
- 편리한 관리 - 배포하기 위해 만든 이미지만 관리하면 된다
- 확장 - 이미지 하나로 여러 개의 환경을 생성할 수 있다
- 테스트 - 이미지로 서비스 운영 환경과 개발 환경을 구성하기 쉽다
- 가벼움 - 호스트OS와 서비스 운영을 분리해서 가볍고 빠르다
도커(Docker)란?
흔히 도커(Docker)에 대한 얘기를 할 때 대부분 VM(가상화 머신)과 비교를 많이 합니다.
가상화 머신은 보통 호스트OS위에 하이퍼바이저라는 다수의 운영체제를 동시에 실행하기 위한 플랫폼을 두고, 그 위에 게스트 OS를 설치해 애플리케이션을 구동합니다.
하지만 도커는 하이퍼바이저와 게스트OS없이 호스트 OS를 공유하며 애플리케이션을 구동합니다.
이렇게 가상화 머신에서의 오버헤드인 하이퍼바이저와 게스트 OS를 줄여 속도를 향상하고 가볍게 만든 것이 도커입니다. 이렇게 가상화 머신 대신 사용하여 오버헤드를 줄이고, 통합적인 SW 지식을 요구하는 가상화 머신과 달리 쉽게 사용할 수 있습니다.
가상화 머신에서 만든 이미지는 게스트OS를 담고 있기 때문에 이미지 파일의 용량도 엄청 크지만, 도커의 경우 게스트 OS를 담고 있지 않기 때문에 이미지 파일의 용량에도 차이가 있습니다.
이렇게 도커는 애플리케이션을 개발하고, 제공하고, 실행하기 위한 개방형 플랫폼입니다. Docker를 사용해서 애플리케이션을 인프라에서 분리하고 소프트웨어를 빠르게 제공할 수 있습니다. 이렇게 개발과 운영을 동시에 도와주는 Docker는 Devops에서 많이 사용됩니다. Docker로 코드를 신속하게 전달하고 테스트, 배포하면 코드 작성과 프로덕션 사이의 시간을 많이 아껴줍니다.
Devops에서 도커 사용 방법
- 소스코드 개발, Git으로 관리
- Jenkins, CruiseControl 같은 프로그램으로 Docker이미지로 빌드
- 빌드된 이미지로 테스트 서버에서 테스트
- 테스트가 정상적으로 완료되면 배포/운영 서버에 해당 이미지 배포
도커(Docker)의 아키텍처
Docker는 기본적으로 server-client 아키텍처를 사용합니다.
Docker의 client는 사용자의 입력을 받아서 Docker daemon과 통신합니다. Docker client와 Docker daemon은 같은 시스템에서 실행되거나 UNIX 소켓, REST API 등으로 원격으로 통신도 가능합니다.
Docker의 전체적인 실행 흐름은, 사용자가 실행하는 명령을 입력하면, client가 daemon에게 전달하고, daemon이 images에 해당 이미지가 있는지 확인하여 있으면 실행하고, 없으면 registry에서 이미지를 가져와 실행합니다.
Docker Client
Docker Client는 사용자와 상호작용 하는 곳입니다. 명령어를 입력하면 Docker Daemon에게 Docker API를 통해 전달합니다. 한 개의 Client는 두 개 이상의 Daemon과 통신이 가능합니다.
Docker Daemon
Docker Daemon은 Docker Client 측에서 보낸 명령어를 Docker API를 통해 전달받고 Docker의 이미지, 컨테이너, 네트워크, 볼륨 등 Docker 객체를 관리합니다.
Docker Registry
Docker Registry는 Docker 이미지를 저장하는 공간입니다. 개인 레지스트리를 구성할 수 도 있으며, 공용 레지스트리인 Docker Hub도 존재합니다.
Docker 객체
이미지
이미지는 본인이 직접 만들거나, 다른 사람들이 레지스트리에 올려놓은 이미지가 있습니다. 자신이 만들 때는 Dockerfile을 사용해서 만듭니다. 이미지는 계층, 레이어로 이루어져 최종적으로 단일 이미지로 결합됩니다. 이로 인해 Docker이미지를 사용하면 CI/CD가 빨라집니다. 계층으로 이루어져 있기 때문에 Dockerfile을 변경하여 빌드하면, 변경되지 않은 부분의 레이어는 그대로 있고, 변경된 부분의 레이어만 새로 빌드해 적용됩니다. 이런 레이어는 이미지를 빌드할 때뿐만 아니라, 저장소에서 이미지를 주고받을 때도 기존의 이미지와 차이점이 없는 부분은 그대로 두고, 추후 변경사항만 주고받게 됩니다. 이러한 점들이 Docker 이미지가 가볍고 빠르게 사용되는 이유입니다.
컨테이너
컨테이너는 Docker이미지를 실행하는 객체입니다 혹은 이미지를 실행한 상태라고 불리기도 합니다. 컨테이너는 애플리케이션을 배포하고 테스트하는 단위입니다. 다른 컨테이너와 잘 분리되어있으며 이미지와 컨테이너 설정으로 구성되어 있습니다. 컨테이너는 실행하는데 필요한 모든 구성요소를 담고 있어서 호스트 OS에 의존할 필요가 없습니다. 이렇게 호스트 OS와도 분리가 잘 되어있습니다. 컨테이너는 쉽게 공유되며 이로 인해 모든 사람들이 동일한 개발 환경을 가질 수 있게 됩니다.
도커(Docker) 활용하기
개발자가 애플리케이션을 개발하고, 로컬 컨테이너를 활용해 표준화된 환경에서 구동될 수 있도록 Docker를 활용해 배포할 수 있습니다. 이를 통해 Devops에서 CI/CD에 적합하게 사용될 수 있습니다. Docker를 활용하는 과정은 다음과 같습니다.
- 개발자가 로컬 작업 환경에서 소스코드 작성 후 컨테이너로 협업 동료들과 작업 환경 공유
- Docker로 애플리케이션을 테스트 환경으로 push
- 버그 발견 시 개발 환경에서 수정하고 테스트 환경으로 다시 push
- 업데이트된 해당 이미지를 배포 환경에 push 후 고객에게 전달
이러한 Docker의 기술은 Microservice와 잘 어울립니다. Microservice를 구현하기 위해 단일 컨테이너에서 다양한 모듈들을 각각 관리를 쉽게 할수록 설계할 수 있지만, 세분화가 심해질수록 관리, 운영은 매우 힘들어집니다. 이렇게 컨테이너를 그룹화하고, 네트워킹, 보안에 적합하게 구성하고 배포하기 쉽게 해주는 툴이 쿠버 네티스(Kubernetes)입니다. 쿠버 네티 스테 관한 포스팅은 추후 하려고 합니다.
'Devops > Docker' 카테고리의 다른 글
[Docker] Docker Life Cycle 이해하기 (0) | 2021.06.10 |
---|---|
[Docker] 기본 명령어 (0) | 2021.06.10 |
[Docker] Root계정 아닌 계정으로 Docker관리하기 (0) | 2021.06.10 |
[Docker] Hello World (0) | 2021.06.10 |
[Docker] Docker 시작하기 (0) | 2021.06.10 |
댓글