[Container] 도커없이 컨테이너 만들기 2
패키징과 루트 격리는 잘할 수 있다. 이제 문제는 중복된 파일들이다.
나는 데이터베이스가 필요하고, 너는 데이터베이스랑 웹서버가 필요하면
- 내꺼: 우분투, 데이터베이스
- 너꺼: 우분투, 데이터베이스, 웹서버
이런 식으로 우분투와 데이터베이스가 두 번 중복돼서 같은 호스트 머신에 저장되어야 한다. 우리의 패키징 방식을 생각하면 필요한 것들을 한 디렉토리에 몰아서 cp 해뒀으니, 각자 필요한 것들을 cp해서 패키징해 보면 중복된 것들이 나오게 된다.
중복을 해결하기 위해 overlay filesystem을 사용한다. 도커에서 다운받는 걸 기준으로 설명해 보자면, 도커에서 이미지를 받으면 Lower layer를 받는다. 컨테이너를 실행하면 Lower layer 위에 Upper layer를 얹어서 실행한다. 그리고 컨테이너에 실제로 마운트되는 건 모든 게 합쳐진 Merged View다. Lower layer는 Read-only이고, 뭔가 수정하게 되면 Upper layer에 수정 기록이 남는다.
myroot 위에 얹을 tools를 하나 만들었다. rm과 which를 옮겨뒀다.
overlay를 할 디렉토리를 만든다.
container는 upper layer 역할merge는 실제 mount point가 될 곳work는container에 atomic한 write를 하기 위해 존재한다.
myroot와 rootfs/merge를 비교해 보면 usr/bin/{which,rm}이 차이 나는 것을 확인할 수 있다.
merge에서 escape_chroot를 삭제했더니 merge에서는 없어졌지만 myroot에는 그대로 남아 있었다. 대신 container에 escape_chroot가 삭제되었다는 마킹이 남았다.
지금까지 정리하자면, 컨테이너의 루트 파일시스템을 격리시켜서 호스트와 관계없이 사용할 수 있었고, 중복되는 파일들은 오버레이 파일시스템을 사용해서 해결할 수 있었다. 도커에서 pull 받으면 레이어를 하나씩 받는 게 보인다.
탈옥과 중복은 해결했다.


