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에서 동일한 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에는 아무런 변화가 생기지 않음을 확인할 수 있다.
참고
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 |