[Docker] docker의 filesystem

숭글·2023년 5월 22일
0

container에 파일을 생성/업데이트/삭제한 후 컨테이너를 껐다 키면 모든 변경 사항이 사라져있다. 심지어 같은 이미지를 사용한 다른 컨테이너에서도 변경사항을 확인조차 할 수 없다.

이유는 docker의 filesystem때문이다.
docker를 launch할 때, docker image는 여러 레이어를 쌓으며 build되는데 가장 위 레이어를 제외한 레이어들은 모두 read-only레이어다.
그 가장 위 레이어는 보통 container layer라고 불린다.

# syntax=docker/dockerfile:1
FROM ubuntu:18.04
LABEL org.opencontainers.image.authors="org@example.com"
COPY . /app
RUN make /app
RUN rm -r $HOME/.cache
CMD python /app/app.py

위와 같은 Dockerfile이 실행될 때 한 command의 결과값이 새로운 레이어에 작성된다. 그리고 그 레이어는 모두 read-only레이어가 된다.

위 commands들이 모두 실행되면 레이어는 아래와 같이 생성된다.

docker가 실행되면서 생기는 모든 변경사항은 유일한 readable-writable레이어인 container layer에 작성된다. container가 삭제될 때 함께 삭제되는 레이어이기도 하다.

container layer는 해당하는 container만 사용하지만 그 아래 레이어들은 여러 container들이 함께 공유하고 있기때문에 container하나가 삭제된다고 변경사항이 생기지않는다. 한 컨테이너에 변경사항이 생겨도 다른 컨테이너는 변경사항을 절대 확인할 수 없는 이유이기도 하다.

이런 파일 시스템은 런타임동안만 일회용으로 파일을 저장할 데이터에는 알맞지만 relaunch했을 때 데이터를 유지해야하는 데이터에는 맞지않다. 거기다 write speed가 native file system에 비해 느리다는 단점도 있다.

그래서 docker는 voulme을 제공한다. volume은 host machine과 container의 filesystem path을 연결할 수 있게한다.
변경 사항을 host machine에 write하여 container를 다시 시작했을 때도 데이터가 남아있고, 여러 container에서 데이터를 공유할 수 있도록 한다.

도큐먼트에는 storage drivers를 이용하여 container layer에 데이터를 저장하는 건 container의 사이즈를 증가시키고 volume이나 bind mount보다 i/o 효율이 떨어지므로 지양하라고 돼있다.


About storage drivers
Persist the DB
docker volume create
Docker development best practices

profile
Hi!😁 I'm Soongle. Welcome to my Velog!!!

0개의 댓글