MoreLean

docker 를 이해하기 위하여 #1 본문

Programmer/Docker

docker 를 이해하기 위하여 #1

judeKim' 2013. 8. 22. 01:59
반응형

docker의 경우 이전 포스트에서 어떤 것인지 대략 그림이 그려졌다.
( 지극히 주관적인 post 임 )

docker를 이해하기 위해선 약간의 사전 정보가 필요하다.

Linux에 cgroups라는 새로운 시스템이 커널에 추가되었다.

cgroups는 커널에서 다른 프로세스 그룹간에 격리할 수 있는 방법을 제공한다.

이 기술을 바탕으로 LXC( LinuX Containers)라는 프로젝트가 생겨났다.

docker는 이 LXC를 기반으로 가상환경을 제공합니다.

또한 리눅스는 Union File System중의 하나인 AUFS를 사용한다. 

 

일단, 이런것들이 어떻게 구성이 될지를 생각하기 전에 미리 알아두어야 할 몇가지 사항이 있다.

 

 


# File System ( http://docs.docker.io/en/latest/terms/filesystem/ )

 

 

리눅스 시스템이 구동할때의 과정에는 일반적으로 2개의 파일 시스템이 필요하다.

boot file system( bootfs )와 root file system( rootfs )가 바로 그것이다.

boot file system은 부트로더와 커널을 가지고 있다. 사용자들은 boot file system에 어떤 변경도 하지 않는다.

사실 부팅과정이 끝난직후에는 커널 전체가 메모리에 있고, initrd( 초기의 램디스크로, 리눅스 커널의 부팅 과정에서 사용되는 임시 파일 시스템 )와 연결된 RAM의 정보를 초기화 하고 언마운트 된다.

root file system은 유닉스 기반의 OS와 관련있는 일반적인 디렉토리 구조( /dev, /proc, /bin, /etc, /lib, /usr and /tmp 그리고, )와 유저 어플리케이션을 실행하기 위해 필요한 모든 환경설정 파일 및 바이너리 및 라이브러리 파일등을 포함한다.

다른 리눅스 배포판들 사이에 중요한 커널의 차이가 있을수 있지만, root file system의 내용이나 구성은 보통 당신이 만드는 소프트웨어 패키지에 따라 의존적으로 만들어진다. docker는 동시에 다수의 배포버전에서 실행되었을때의 문제점을 해결하는데 도움이 될수 있다.


 

 

 


# Layers

(

http://docs.docker.io/en/latest/terms/layer/

)

 

 

 

전통적인 리눅스 부팅 과정에는 커널은 read-only 모드로 root file system을 마운트 하고, 마운트 무결성을 검사한 다음, read-write 모드로 전체 root file system을 전환한다.

Layer

Docker가 rootfs를 마운트할때, 리눅스의 전통적인 부팅 과정처럼 read-only로 마운트 되지만, read-write 모드로 전환하는것 대신에 read-only 파일시스템 위에 read-write 파일 시스템을 추가하여 union mount를 활용한다.

사실 서로의 위에 쌓인 여러개의 read-only 파일시스템이 있을 수 있으며, 우리(docker.io)는 이들 파일시스템을 layer로서 생각한다. 

첫째로 맨위의 read-write 파일시스템 레이어는 그 안에 아무것도 없지만, 언젠가 프로세스에 의해서 파일이 생성될때, 이것은 맨 뒤의 레이어인 read-write 파일 시스템에서 생성된다.

그리고, 낮은 레이어에서 존재하는 파일이 업데이트 될 필요성이 있다면, 그때 파일이 상위 레이어로 복사되고, 변경사항은 복사본으로 이동한다.

Union File System

우리는 read-write레이어의 통합이라고 부르고, 모든 read-only 레이어들은 union file system 이라고 부른다. 

 


졸려서(=.=) 내일 이어서~

간단히 부연 설명을 하자면 이렇다.

파일시스템에는 bootfs 와 rootfs가 있는데, 일단, 그림을 보니 bootfs가 kernel등을 포함하여 최하단 레이어로 자리잡고 그 위에 os별 다른 image들을 하나씩 레이어로써 올리게 되는 구조이다. 다만, 이 레이어들은 기본적으로 read-only 속성을 지니고, 이 레이어의 값을 수정하게 되면 실제로 해당 레이어의 값을 수정하게 되는 것이 아닌 최상단에서 바라보게 되는 시각에서 유일한 read-write 모드인 최상단 레이어에 기존값에 새로운 수정된값을 적용한 그 파일을 덮어 씌운 것처럼 가지고 있는 형태이다. 

말이 좀 어려운데, 여튼 중간의 read-only 레이어들은 속성상 수정이 불가능하고, ( 향후 필요할때 나중에 재활용 된다. ) 만일 그 값을 수정하게 된다면 수정이 가능한 최상단 레이어에서 그 값을 복사한 형태로 수정하고 새로운 파일을 인지시킨다. ( 기존의 파일은 그 레이어에 그대로 있지만 최상단에서 바라보는 우리의 환경은 그 값을 직접 접근 할수가 없다. )

아직도 이해가 안갈 수 있지만, 여기서의 핵심은 docker에서 vm은 레이어로 겹겹이 싸여진 형태로 구성되어 있고, 수정한 사항은 최상단 레이어에서 복사된채로 보존된다 정도만 기억하면 된다.

 

 

 

반응형

'Programmer > Docker' 카테고리의 다른 글

Repositories in docker  (0) 2013.08.28
Commands of docker  (0) 2013.08.26
Installation of docker  (0) 2013.08.25
docker 를 이해하기 위하여 #2  (0) 2013.08.22
About Docker  (0) 2013.08.21