티스토리 뷰

아키텍트 코스

Docker 아키텍처 이해하기

인공 체 (Che) 2016.01.27 02:14

도커는 무엇인가?

도커는 애플리케이션을 실행하고 적재시키고 개발하기 위한 오픈 플랫폼이다.

도커는 애플리케이션 전달을 더 빠르게 하기 위해 설계되었다. 우리의 애플리케이션을 인프라로부터 분리시킬 수 있으며 인프라를 관리되는 앱처럼 처리할 수 있다. 도커는 코드를 적재하는 것을 빠르게 해주며 테스트를 빠르게 해주고 배포를 빠르게 해주고 코드 작성과 실행사이 사이클을 줄인다.


도커는 워크플로우와 도구에 경량화된 컨테이너 가상화 플랫폼을 결합한다.


코어에서, 도커는 거의 어떤 앱이라도 안전하게 컨테이너에 고립시켜 동작시킬 수 있는 방법을 제공한다. 고립과 보안은 많은 컨테이너를 호스트에 자율적으로 작동할 수 있게 한다. 컨테이너의 경량화 환경은 하드웨어 제약을 더 넘을 수 있음을 의미하낟.


컨테이너 가상화를 둘러싸는 것은 여러 방식으로 우리를 도울 수 있는 도구와 플랫폼이다:

내 앱을 도커 컨테이너에 넣는 것

컨테이너를 분리하고 적재하는 것

우리 생산 환경에 애플리케이션을 배포하는 것 (로컬이든 클라우드이든)



도커를 무엇을 위해 사용할 수 있을까?

앱의 더 빠른 전달

도커는 개발 라이프사이클을 돕는데 완벽하다. 

예를 들어 개발자가 코드를 로컬에서 쓰고 개발 스택을 도커에 공유한다. 준비가 되면 그들의 코드를 푸시하고 

테스팅 환경에서 당신은 도커 이미지를 생산에 푸시할 수 있고 코드를 배포할 수 있다.


배포와 확장을 쉽게

컨테이너 기반 플랫폼은 포터블 워크로드를 가능하게 한다. 도커 컨테이너는 개발자 로컬 호스트에서, 데이터 센터의 물리적 또는 가상 머신에서 또는 클라우드에서 작동 가능하다. 

도커의 이식성과 경량 환경은 동적으로 워크로드를 쉽게 관리한다. 도커를 빠르게 스케일업하고 티어다운할 수 있다. 스케일링이 실시간으로


높은 밀집도를 얻고 더 많은 워크로드 실행

경량이고 빠르다. 하이퍼바이저기반 가상 머신에 실행가능하고 비용 효율적인 대안이다. 특히 높은 밀집환경에 유용. 예를 들어 스스로의 클라우드나 플랫폼를 만들때. 작고 중간 배포에도 유용하다. 



도커의 주요 컴포넌트는?

도커는 두 가지 주요 컴포넌트가 있다.

도커: 오픈 소스 컨테이너 가상화 플랫폼

도커 허브: 서비스로서의 소프트웨어 플랫폼 도커 컨테이너의 관리와 공유를 위한



도커의 아키텍처는?

Docker Architecture Diagram


도커는 클라이언트 서버 아키텍처를 사용. 도커 클라이언트는 우리 도커 컨테이너를 만들고 작동하고 분산시키는 무거은 리프팅을 하는 도커 데몬에게 말을 한다. 클라이언트와 데몬 모두 같은 시스템에서 동작할 수 있거나 도커 클라이언트를 원격 도커데몬에 연결할 수 있다. 도커 클라이언트와 데몬은 RESTful API를 통해 소켓으로 통신한다.


도커 데몬

호스트 머신에서 동작한다. 사용자는 직접적으로 데몬과 상호작용하지 않고 대신 도커 클라이언트를 통한다.


도커 클라이언트

도커 바이너리 폼에서 도커 클라이언트는 주요 사용자 인터페이스이다. 사용자에게 명령을 받아 도커 데몬과 통신한다


도커 내부

도커 이미지: 읽기 전용 템플릿이다. 이미지는 우분투OS 같은 것들.. 이미지는 도커 컨테이너를 만드는데 사용된다. 도커는 새로운 이미지나 존재하는 이미지를 업데이트하는 단순한 방법을 제공한다. 또는 다른 사람이 만든 도커 이미지를 다운받을 수 있다. 도커 이미지는 도커의 빌드 컴포넌트이다.

도커 레지스트리: 이미지를 가지고 있다. 퍼블릭 도커 레지스트리는 도커 허브에서 제공받는다. 도커의 분배 컴포넌트

도커 컨테이너: 디렉토리와 비슷하다. 애플리케이션이 작동하는데 필요하는 모든 것을 가진다. 각각의 컨테이너는 도커 이미지로부터 생성된다. 작동, 시작, 정지, 이동, 삭제 가능하다. 컨테이너는 고립되고 안전한 애플리케이션 플랫폼이다. 도커의 작동 컴포넌트이다.



그래서 도커는 어떻게 작동하나?

도커이미지의 작업방식

각각으이 이미지는 레이어 시리즈를 가진다. 통합 파일 시스템을 사용해 이 레이어를 단일 이미지로 결합한다. 통합 파일 시스템은 파일과 디렉토리 (분리된 파일 시스템의) 브렌치로 알려져 있는, 를 투명하게 덮어씌운다. 단일 통합 파일 시스템을 형성해


도커가 경량인 이유는 이 레이어때문. 도커 이미지를 바꿀 때 새로운 레이어가 생성됨. 그래서 전체 이미지나 전체 빌딩보단 가상 머신에서 우리가 하듯, 그 레이어만 더해지고 업데이트된다. 이제 전체 새로운 이미지를 분배할 필요가 없다. 

모든 이미지는 기본 이미지에서 시작. 


도커 이미지는 instruction 이라 불리는 단계를 설정. 각 인스트럭션은 이미지에 새로운 레이어를 생성. 

포함하는 액션들: 명령 실행, 파일이나 디렉토리 추가, 환경 변수 생성, 실행할 프로세스가 무엇인지 이미지에서 컨테이너 런칭할 때

이 명령들은 Dockerfile 에 저장된다. 도커는 우리가 이미지 빌드를 요청할 때 이 파일을 읽고 명령을 실행하며 최종 이미지를 리턴한다.


도커 레지스트리는 어떻게 작동할까?

도커 레지스트리는 도커 이미지의 저장소다. 도커 이미지를 한번 빌드하고 나면 이걸 퍼블릭 또는 프라이빗 레지스트리에 푸시할 수 있다.

도커 클라이언트를 아요해서 우리는 이미 출시된 이미지를 검색할 수 있고 그 다음 컨테이너를 만들기 위해 우리 도커 호스트에 땡겨올 수 있다.

도커 허브는 이미지를 위한 퍼블릭/프라이빗 저장소 모두를 제공한다. 퍼블릭은 검색가능하고 누구나 다운받을 수 있다. 


컨테이너는 어떻게 작동할까?

컨테이너는 OS, 사용자가 추가한 파일, 메타 데이터롤 구성된다. 각 컨테이너는 이미지에서 만들어진다. 그 이미지는 도커에게 컨테이너가 가지고 있는 것이 무엇인지, 컨테이너가 시작될때 어떤 프로세스를 실행시킬지, 그리고 여러 개의 다른 설정 데이터를 알려준다. 도커 이미지는 읽기전용이다. 도커가 컨테이너를 이미지로부터 실행시키면 도커는 읽기-쓰기 레이어를 이미지 위에 올린다.


컨테이너를 실행하면 무슨 일이 일어나나?

도커 바이너리나 API나 도커 클라이언트는 도커 데몬에게 컨테이너를 실행시키라고 말한다.

docker run -i -t ubuntu /bin/bash

이 명령을 쪼개보자. 도커 클라이언트는 도커 바이너리를 사용해 시작되고 (run옵션과 함께) 도커 클라이언트가 최소한으로 말해야 하는 것은:

어느 이미지에서 컨테이너를 만들지 (위에서는 우분투)

실행되었을 때 컨테이너 안에서 실행시키고 싶은 명령 (위에선 /bin/bash, Bash shell을 시작하기 위해)


그럼 위의 명령을 실행했을 때 어떤 일이 일어나냐면

우분투 이미지를 땡긴다: 도커는 우분투 이미지 존재를 확인하고 로컬에 없으면 도커 허브에서 다운로드한다. 있으면 새로운 컨테이너를 위해 그것을 사용한다.

새로운 컨테이너를 만든다: 

파일시스템을 할당하고 읽기-쓰기 레이어를 마운트한다: 컨테이너가 파일시스템에 생성되고 읽기-쓰기 레이어가 이미지에 추가된다

네트워크/브릿지 인터페이스 할당: 도커 컨테이너가 로컬 호스트와 대화할 수 있는 네트워크 인터페이스 생성

IP 주소 설정: 이용 가능한 IP주소를 풀에서 찾고 설정

우리가 명시한 프로세스 실행: 애플리케이션을 실행

애플리케이션 출력 캡쳐/제공: 표준 입출력과 에러를 연결하고 로그해 앱이 어떻게 실행되고 있는지 볼 수 있게 한다.


이제 우리는 컨테이너 하나를 실행하고 있다. 이제 우리는 컨테이너를 관리하고 애플리케이션과 상호작용할 수 있고 끝나면 정지하고 제거할 수 있다.



기반 기술

도커는 Go로 쓰여졌고 몇몇 커널 피처를 사용해 기능을 제공한다.


네임스페이스

우리가 컨테이너라고 부르는 고립된 작업공간을 제공하기 위해 네임스페이스라 불리는 기술의 장점을 취한다. 컨테이너를 실행하면 도커는 그 컨테이너를 위한 네임스페이스 집합을 생성한다.

이것은 고립 레이어를 제공한다: 각 컨테이너 양상은 자기 네임스페이스에서 실행하고 밖에 접근할 수 없다.


리눅스에서 도커가 사용하는 네임스페이스는:

pid: 프로세스 고립

net: 네트워크 인터페이스 관리

ipc: IPC 리소스 접근 관리

mnt: 마운트 포인트 관리

uts: 커널과 버전 식별자 고립 


control groups는 도커가 이용가능한 하드웨어 리소스를 공유할 수 있게 하고 한계나 제약을 설정하는 것을 돕는다. 


union file system은 레이어를 생성해 운영하는 파일시스템으로 경량화하고 빠르게 한다. 


도커는 이 컴포넌트들을 컨테이너 포맷이라는 래퍼로 결합한다. 기본 컨테이너 포맷은 libcontainer라고 불린다. 


[참고 자료]

"Understand the architecture", https://docs.docker.com/engine/introduction/understanding-docker/

댓글
댓글쓰기 폼