도커의 아키텍처
리눅스 커널이 제공하는 기능을 활용하면 도커가 아니라 자체적으로 컨테이너를 만드는 것도 가능하다.
그러나 직접 개발한 컨테이너는 커뮤니티가 개발한 컨테이너를 재상용하는 것이 어렵고 공유하기도 어렵다.
도커는 스프트웨어 개발자가 컨테이너를 이용해 개발 생산성을 높일 수 있도록 컨테이너를 Build(작성), Ship(이동), Run(실행)할 수 있는 기능을 지원한다. 이런한 기능을 제공하는 도커는 도커 데몬 서버와 클라이언트인 도커 커맨드, 그리고 이미지 보관소인 레지스트리로 구성된다.
1. 도커 데몬
도커 데몬은 클라이언트인 도커 커맨드의 명령을 받아들여서 도커 오브젝트인 이미지, 컨테이너, 볼륨, 네트워크 등을 관리한다.
그리고 네트워크 너머에 있는 원격 클라이언트로 부터 요청을 받는 것도 가능하다.
2. 도커 클라이언트
도커 머맨드는 컨테이너를 조작하는 커맨드 라인 유저 인터페이스로 도커 데몬의 클라이언트다.
도커 커맨드는 도커 API를 사용하여 도커 데몬에 요청을 보낸다. 도커 커맨드를 통해서 자주 사용하는 서브 커맨드 세가지를 소개하면 다음과 같다.
- docker build : 베이스 이미지에 기능을 추가하여 새로운 이미지를 만들 때 사용한다.
- docker pull : 레지스트리에서 이미지를 로컬에 다운로드 할 때 사용한다.
- docker run : 이미지를 바탕으로 컨테이너를 실행한다.
도커 커맨드를 사용하면 컨테이너, 이미지, 네트워크, 볼륨 등의 오브젝트를 만들어 활용할 수 있다.
3. 이미지
이미지는 읽기 전용인 컨테이너의 템플릿을 말한다. 컨테이너를 가동하기 위한 실행 파일과 설정 파일의 묶음이라고 볼 수 있다.
컨테이너를 실행하면 이미지에 담긴 미들웨어나 애플리케이션이 설정에 따라 가동된다.
도커 허브에서는 데이터베이스, 웹 서버, 애플리케이션 등 다양한 이미지가 등록되어 있다.
예를 들면, CI/CD 도구인 젠킨스(Jenkins)도 도커 허브에 등록되어있어 이미지를 다운받으면 특별한 설치없이 젠킨스 서버를 바로 기동할 수 있다.
젠킨스를 본격적으로 사용하기 위해서는 일부 옵션을 추가해야 하지만, 별 다른 설정없이 기본 설정으로 docker run을 실행하면 젠킨스의 컨테이너가 실행되어 웹 대시보드에 접속할 수 있는 상태가 된다.
호스트의 로컬에 이미지가 존재하지 않는 경우에는 자동으로 원격 레지스트리에 다운받아 실행한다.
로컬에 이미지만을 다운로드 하고 싶은 경우에는 docker pull 명령어를 사용한다.
대부분의 이미지는 다른 이미지에 기반하여 만들어진다.
예를 들어 웹 서버인 Nginx의 컨테이너는 리눅스 배포판 중 하나인 데비안(Debian)에 기반하여 만들어졌다.
이미지를 만들 때는 기반 이미지와 설치 스크립트 등을 Dockerfile에 기재하여 빌드한다.
제일 먼저 Dockerfile은
- docker build 명령어를 통해 읽혀지며
- 기반이 되는 데미안 이미지가 로컬에 없으면 레지스트리로부터 다운받는다.
- 데비안 이미지를 컨테이너로 가동하고
- Nginx 패키지를 설치하고 설정 파일을 추가한 후
- 새운 이미지 Nginx로 로컬 리포지토리에 저장한다.
4. 컨테이너
컨테이너는 하나의 프로세스라고 볼 수 있다. 즉, 리눅스의 네임스페이스나 컨트롤 그룹(cgroup)을 통해 다른 프로세스들과 완전히 분리되어 실행되는 프로세스인 것이다.
하지만 컨테이너는 정지된 상태로도 관리되기 때문에 보다 명확하게 표현하자면 실행 가능한 이미지의 인스턴스라고 할 수 있다.
docker run 명령어를 통해 이미지는 컨테이너로 변환되어 하나의 인스턴스가 된다.
이 실행 상태의 컨테이너는 IP 주소를 가지는 하나의 독립된 서버처럼 동작한다. 컨테이너의 IP 주소와 포트번호로 온 요청은 컨테이너 내의 프로세스로 연결한다.
docker run 명령어를 실행할때 전달되는 파라매터를 통해 동작을 바꿀 수 있어 하나의 이미지를 다양한 상황에서 재사용할 수 있다.
컨테이너를 정지하고 싶을때는 docker stop 혹은 docker kill 명령어를 사용한다.
두 서브 커맨드의 차이점은 정상 종료를 기다릴지 아니면 바로 강제 종료할지 여부다. 어느 명령어를 사용해도 컨테이너는 정지 상태가 되지만, 삭제 되는것은 아니다. 정지 상태인 컨테이너는 docker run에 의해 지워지기 전까지 기동했을 때의 실행 옵션과 로그들을 간직한다.
정지된 컨테이너를 다시 기동하기 위해서는 docker start 명령어를 사용한다.
이때 주의할 점은 정지 전에 할당되었던 IP 주소가 유지되지 않는다는 점이다. 컨테이너는 가동 시에 이전 이력과 관계없이 IP 주소가 할당된다.
5. 도커 레지스트리
도커 레지스트리는 컨테이너의 이미지가 보관되는 곳이다.
도커는 기본으로 도커 허브(Docker Hub)에 있는 이미지를 찾도록 설정되어 있다.
docker run hello-world를 실행하면 공개 레지스트리인 도커 허브에 등록된 이미지 hello-world를 다운 받아서 컨테이너로 실행한다.
레지스트리와 리포지터리는 이름이 비슷하여 헥랄리기 쉬운데, 레지스트리는 리포지터리를 여러개 가지는 보관 서비스이다.
그리고 리포지터리는 하나의 이미지에 대해 태그를 사용하여 다양한 출시 버전을 함께 보관하는 곳이다.
퍼블릭 레지스트리
누구나 사용할 수 있도록 공개된 레지스트리다. 도커 허브의 경우 무료로 공개 리포지터리를 사용할 수 있는 반면, 비공개 지포지터리를 사용하기 위해서는 돈을 내야 한다.
git에 있는 Dockerfile이나 소스 코드를 편집하여 푸시(push)하면 자도으로 이미지를 빌드하고 리포지터리를 등록해 주는 자동화 허비스도 있다. 또한, 컨테이너의 취약성을 검사하여 보고서를 제공하는 기능을 갖춘 레지스트리도 있다.
대표적인 공개 레지스트리로는 Docker Hub, Quay 등이 있다.
클라우드 레지스트리
퍼블릭 클라우드가 제공하는 레지스트리 서비스이다. 접근 가능한 계정을 제한하여 비공개로 운영 할 수 있다.
물론 인터넷에 공개하는 것도 가능하다. 대표적인 클라우드 레지스트리로는
Amazon Elastic Container Registry, Azure Container Registry, Google Container Registry, IBM Cloud Container Registry 등이 있다.
비공개 레지스트리
회사나 팀 전용으로 레지스트리를 구축하여 운영하는 경우에 해당된다.
오픈 소스로 이용할 수 있는 레지스트리 소프트웨어는 Harbor, GitLab Container Registry, registry 등이 있다.
쿠버네티스를 코어로 하는 소프트웨어 제품들 중에는 레지스트리 기능이 포함된 경우도 있다. 이들을 활용하면 구축 시간을 절약할 수 있다.
'Docker & Kubernetes' 카테고리의 다른 글
쿠버네티스 API 오브젝트 (0) | 2021.11.23 |
---|---|
쿠버네티스의 아키텍처 및 계층 구조 (0) | 2021.11.23 |
컨테이너의 이해(3/3) - 도커와 쿠버네티스의 관계 (0) | 2021.11.21 |
컨테이너의 이해(1/3) - 쿠버네티스를 위해 꼭 알아야 하는 도커 지식 (0) | 2021.11.21 |
쿠버네티스란? (0) | 2021.11.21 |