Docker Images

BLAKE KIM·2020년 9월 12일
0

Docker Image

Docker image는 파일 시스템들의 layer로 만들어져 있다. 가장 base layer는 boot filesystem bootfs로 일반적인 Linux boot 파일 시스템으로 되어있다. Docker 유저가 직접적으로 boot filesystem을 사용할 일은 없으며, 실제로 container가 부팅되면 메모리로 옮겨지고 boot filesystem은 unmount된다.

Boot layer 다음에는 rootfs 라고 하는 root 파일 시스템 layer이다. Root 파일 시스템은 실제 OS가 설치된다.(예를 들어 Debian이나 Ubuntu) 원래 리눅스에서는 root 파일 시스템은 처음 mount 될 때는 read-only로 mount가 된 후 integrity check 후 read-write으로 바뀐다. 하지만 Docker에서는 계속해서 read-only 모드이다. Read-Write 모드로 변환하지 않는 이유는 Docker는 union mount를 사용해서 read-only 파일 시스템들을 root 파일 위에 덮는 구조로 이루어져 있기 때문이다. 참고로 union mount는 여러 개의 파일 시스템을 mount 하되 하나의 파일 시스템만이 mount 된 것 처럼 사용하는 방법이다.

Docker 구조에서는 이러한 파일 시스템 하나 하나가 바로 image이다. 그러므로 image들을 서로 위에 layer 시키는 구조로 되어 있다. Base가 되는 이미지를 부모 이미지라고 하며 맨 위의 이미지부터 가장 밑 부분의 이미지까지 횡단하는 구조로 되어있다. 즉 filesystem/image를 수정하는 구조가 아니라 read-only filesystem/image들을 서로 위에 layer 시키되 union mount 기법으로 마지막에는 하나의 파일 시스템으로 보이는 구조를 가지고 있는 것이다.

모든 read-only 파일 시스템들이 mount가 되고 docker 컨테이너가 이미로부터 시작될 때 docker는 마지막으로 read-write 파일 시스템을 파일 시스템 layer 맨 위에 mount한다. 마지막에는 read-only가 아니라 read-write로 올려놓은 이유는 read-wrtie 파일 시스템에 컨테이너가 필요한 프로세스를 생성하고 실행하기 위해서다.

이러한 패턴을 copy on write이라고 한다. 이 copy on write 구조는 Dockerfile을 이용해 docker image를 빌드할 때 효과적이다. Docker image를 빌드할 때 Dockerfile의 각각의 instruction이 바로 filesystem/image가 되는 것이다. 그러므로 빌드를 할때 처음부터 다 빌드하는 것이 아니라 바뀐 파일 스스템만 mount하면 됨으로 효과적이고 빠르게 빌드할 수 있으며 빌드가 도중에 실패하더라도 마지막으로 성공한 instruction은 빌드가 되어 있는 상태이므로 그 이미지에 shell에 접속을 해서 디버깅을 한다거나 하는 것이 가능해진다.

Docker Image 구조

profile
BackEnd

0개의 댓글