본문 바로가기

docker

container가 생성되는 과정 (2) - file system

https://almostgeneral.tistory.com/16 ( container가 생성되는 과정 (1) - computing resource )

에 이어서 2번째로 file system이 어떻게 생성되고 할당되는지 알아보자!

Docker의 File System

docker는 UFS(Union File System)기반으로 동작한다. 

UFS?
UFS는 여러 개의 파일 시스템을 하나의 파일 시스템으로 취급할 수 있도록 해주는 것.

흔히 Container와 Image의 차이를 Linux에 비유하여 아래와 같이 표현한다
Image - Binary
Container - Process
Container 생성 시 base image를 이용하여 container를 생성하고, 생성 이후에 User가 정의한 여러 동작(추가 프로그램 설치, file copy, command, ...)을 각각의 layer로 정의하여 image layer를 쌓게된다. 

이러한 특징은 UFS의 CoW(Copy on Write)전략과 관련이 있는데, 아래 그림과 같이 image layer가 쌓일 때, 아래층에 있는 layer들은 read only 상태가 되며 만약 위층 layer에서 아래층 layer에 write 작업을 하게 될 경우, copy 이후에 작업이 되기 때문에 아래층 layer는 아무 영향을 받지 않는다.
결과적으로 write는 최상위 layer에서만 발생하게되며, 최상위 layer는 container 종료 시 삭제된다.

Container and layer (출처 :  https://docs.docker.com/storage/storagedriver/images/sharing-layers.jpg )

위와 같은 특징을 통해 여러 container에서 동일한 image layer를 공유할 수 있게되며 동일한 image layer를 공유하더라도 독립적인 file system을 사용할 수 있는 것이다.

Container의 Filesystem 확인

지난 게시글에서 확인했던 것과 동일하게 host server에서 container pid를 확인하고, 해당 pid의 mount 정보를 확인해보자 (별도 mount 없이 container 실행)

### container 실행
$ docker run -it -d --cpu-shares=512 --memory=512m ubuntu:16.04 /bin/bash

### pid 확인
$ ps -ef | grep bin/bash
root      3763  3740  0 07:45 pts/0    00:00:00 /bin/bash
root      4677  3871  0 08:11 pts/1    00:00:00 grep --color=auto bin/bash

### 해당 process의 mounts 정보 확인
$ cat /proc/3763/mounts
overlay / overlay rw,relatime,lowerdir=/var/lib/docker/overlay2/l/42LDXC5KATLWHMFVJMGEUOFQST:/var/lib/docker/overlay2/l/4T6NT3B76MID7K7IZI57SHAZHN:/var/lib/docker/overlay2/l/3222XQU2G3OLW2RGK2K6HR5E6R:/var/lib/docker/overlay2/l/FWH3IQAD3L36FSGBSACBY5YZRT:/var/lib/docker/overlay2/l/FBHSKORW6X4NRLT3VSEEORVGCC,upperdir=/var/lib/docker/overlay2/0e10a9761b150e4393aa15d4c6e62ff5edd3a9516ae31838f3f89d0e4bff82c2/diff,workdir=/var/lib/docker/overlay2/0e10a9761b150e4393aa15d4c6e62ff5edd3a9516ae31838f3f89d0e4bff82c2/work 0 0
...

위와 같은 절차대로 mounts 정보를 확인하면 layer(lowerdir, upperdir, workdir)별 mount 정보를 알 수 있다.

해당 container 안에서 filesystem의 변경이 생겼을 경우, 어떤 변화가 생기는지 확인해보자

### container에 접속하여 aa.txt file 생성
$ docker exec -it e9cf9 /bin/bash
root@e9cf9c145019:/#
root@e9cf9c145019:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e9cf9c145019:/# touch aa.txt
root@e9cf9c145019:/# ls
aa.txt  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e9cf9c145019:/# exit

### upperlayer mount를 확인하면 아래와 같이 aa.txt 파일 생성된 것 확인
$ ls -ltr /var/lib/docker/overlay2/0e10a9761b150e4393aa15d4c6e62ff5edd3a9516ae31838f3f89d0e4bff82c2/diff/
total 0
-rw-r--r-- 1 root root  0 Nov 24 08:08 aa.txt
drwx------ 2 root root 27 Nov 24 08:09 root

### lowerlayer mount를 확인하면 추가 생성한 파일 외에 기존에 있던 목록 확인
$ ls -ltr /var/lib/docker/overlay2/l/FBHSKORW6X4NRLT3VSEEORVGCC/
total 16
drwxr-xr-x  8 root root   96 Sep 13  2015 lib
drwxr-xr-x  2 root root    6 Feb  5  2016 sys
drwxr-xr-x  2 root root    6 Apr 12  2016 proc
drwxr-xr-x  2 root root    6 Apr 12  2016 home
drwxr-xr-x  2 root root    6 Apr 12  2016 boot
drwxr-xr-x 10 root root  105 Aug  4 19:00 usr
drwxr-xr-x  2 root root    6 Aug  4 19:00 srv
drwxr-xr-x  2 root root    6 Aug  4 19:00 opt
drwxr-xr-x  2 root root    6 Aug  4 19:00 mnt
drwxr-xr-x  2 root root    6 Aug  4 19:00 media
drwxr-xr-x  4 root root 4096 Aug  4 19:01 dev
drwxr-xr-x  2 root root   34 Aug  4 19:01 lib64
drwxr-xr-x  8 root root  130 Aug  4 19:01 run
drwxr-xr-x 11 root root  139 Aug  4 19:01 var
drwx------  2 root root   37 Aug  4 19:01 root
drwxrwxrwt  2 root root    6 Aug  4 19:01 tmp
drwxr-xr-x  2 root root 4096 Aug  4 19:01 sbin
drwxr-xr-x 42 root root 4096 Aug  4 19:01 etc
drwxr-xr-x  2 root root 4096 Aug  4 19:01 bin

위에서 확인한 내용과 같이, container 실행 도중 변경되는 사항에 대해서 upper layer에만 적용되며, lower layer에는 아무런 변화가 생기지 않음을 확인할 수 있다.

 

참고

https://velog.io/@koo8624/Docker-%EC%9C%A0%EB%8B%88%EC%98%A8-%ED%8C%8C%EC%9D%BC-%EC%8B%9C%EC%8A%A4%ED%85%9C-Union-File-System

http://cloudrain21.com/examination-of-docker-containersize-ufs

반응형

'docker' 카테고리의 다른 글

container가 생성되는 과정 (3) - network  (0) 2021.11.25
container가 생성되는 과정 (1) - computing resource  (0) 2021.11.22
set -e 와 exec "$@"  (0) 2021.07.19