배우다가 드디어 Storage File System을 바꾸는 방법에 대해 배우게 되었다.
그전에 왜 파일 시스템을 바꾸는 것인가?
먼저 이 세상 모든 파일 시스템들은 장, 단점이 있다.
어떤 것은 PaaS(Platform-as-a-Service)에 좋은데 어떤 건 그렇지 않고 어떤건 스냅샷 기능이 지원되는데 어떤 것은 안되고(HFS, HFS+ 라고 하여 Apple이 만든 것이 있는데 리누스 토발스가 최악이라고 했던 것이 대표적) 이런 장, 단점들이 분명하게 나뉘기 때문에 사람들은 파일 시스템을 바꾸게 된 것이다.
지금도 충분히 연구가 되고 있고 개발이 되어가고 있다. 대표적으로 Apple이 2016년에 새로이 APFS(APple File System )라는 것을 개발한 것.
이렇듯 파일 시스템을 뭐로 하느냐에 따라 특정 작업에 극한의 최적화가 될수도 있고 최악이 될수도 있다. 특히 기업 이라면 이 면에서 충분한 검토가 있어야 하는건 필수.
이제 왜 파일 시스템을 바꾸는 지 대략 이해 했으면 직접 해보는 것이다.
오늘 써볼 파일 시스템은 Sun에서 만들어지고 Oracle에서 인수한 ZFS이다.
역사를 보면 원래 Solaris라는 유닉스 운영체제에서만 이용 가능했던 것이 Linux용으로 포팅이 된 것이다.
여기서는 ZFS에 대한 특징을 보지 않고 바로 Docker에서 사용하는 방법을 볼터이니 ZFS는 Oracle 공식 문서를 참조하거나 인터네에서 자세하고 친절하게 알려주니 거기서 검색을 권한다.
작업 준비
먼저 나의 환경은 Ubuntu Linux 16.04.1 LTS에서 작업을 할것이다.
Host: Ubuntu Linux 16.04.1 LTS
Guest: Ubuntu Linux 16.04.1 LTS Server + LXDE GUI환경 On Vmware WorkStation 12.1 Pro
GUI 가상 서버에서 작업을 하는 것을 권한다.
아무래도 보기 편하고 익숙하고 무엇보다 이제 부터 하게될 작업들이 Docker에서 지금까지 쓰던 Container 및 Images들을 전부 없에버리게 될 것이기 때문이다.
GUI환경 구축은 그냥
sudo apt install lxde 하면 된다. 그리고 재부팅.
우리가 이제 준비할 것은 먼저 ZFS관련 작업들을 해줄 도구들을 다운로드 하여 쓰는 것이다.
먼저
여기서 zfs를 검색해 보면 zfs-fuse 라는 것도 있는데 이건 또 다른 기능들이 있고 Docker 공식 강좌에서도 안 쓰므로 넘긴다. 안 쓰라는게 아니라
ZFS에 대해 잘 알면 써도 좋다. 성능 관련 해서는 링크를 남긴다 --> https://docs.docker.com/engine/userguide/storagedriver/selectadriver/#/future-proofing
이제 다운로드가 끝나면 ZFS Pool을 만드는 방법에 대해 익힐 시간이다.
나는 IBM에서 준 Guide를 따랐다.
출처 --> https://developer.ibm.com/recipes/tutorials/use-zfs-with-docker-on-ubuntu/
요약하면 다음과 같다.
먼저 ZFS Pool을 만든다. 근데 충분한 디스크가 없거나 파티션 만들기 귀찮고 실험을 위해 한다면 img 파일을 만들어서 ZFS Pool로 쓰게하라고 한다.
명령어는 아래에 있다.
요약하면 for loop를 돌려 file1, 2, 3, 4 순으로 zfsdevs 폴더에 img 파일들을 만든 후에 zpool-docker 라는 이름의 Pool을 생성.
그 다음으로
확인후에는 이제 그 다음으로 Docker를 환경 설정할 시간이다.
먼저 Docker service 를 종료한다.
그 다음으로
이제 이해가 될 것이다. 왜 가상머신에서 작업을 해줘야 하는지. 컨테이너 이미지 모두 없어져 버린다. 하지만 이유는 더 있지만 조금 있다 예기하겠다.
그 다음으로
허나 아직은 백엔드(Back-End) 단에서만 ZFS를 쓰는 것이다. 이 말은 Docker에서 ZFS 저장소를 쓰긴 쓰나 이미지나 컨테이너들을 저장할 파일 시스템은 아직 바뀌지 않는다는 뜻이다.
이대로 서비스를 시작하면 실제로 Backing File System은 ZFS인데 Storage Driver는 AUFS 그대로 인 것을 알 수 있다.
그러므로 우리는
자신이 원하는 편집기를 관리자 권한으로 실행하고 (필자는
거기에 DOCKER_OPTS="--storage-driver=zfs" 를 넣으면 된다.
그리고 저장후에 마지막으로 Docker service를 시작 시키면 된다.
그러면 ZFS 가 Storage Driver로 사용되는게 보여야 한다.
근데 필자는 이 단계에서 이상이 보였다. 원래라면 되야 하는데 Docker 공식 문서에서도 된다고 하지만 실제로는 되지 않았다.
클린 설치를 하였건만 이건 아무리 생각해도 Docker 기능 자체의 문제인듯 하다.
설명하자면 Backing File System은 ZFS인데 여전히 Storage Driver는 AUFS를 쓴다.
결국 또 다른 방법으로 터미널 하나를 열고
이렇게 해서 Storage Driver가 ZFS로 쓰이는 것을 확인 했었다. 실제로
근데 Guest 운영체제를 종료하고 다시 돌려보니 또 다른 문제가 생겼다.
Docker가 자신이 쓸 Storage Driver를 고르지 못해 Docker Service가 시작을 못한 것이다.
이쯤에서 욕을 해도 좋을 것이다. 분명 Ubuntu 배포판에서는 Docker가 직접 공식 문서 내애서 /etc/default/docker 를 편집해서 하라고 했건만 되먹지를 않는다.
이해가 안되는 순간이다.
결국 나는 sudo dockerd --storage-driver=zfs &로 일일이 해줘야 하는 상황에 이르럿다.
일단 원인을 분석해 보자니 systemd에서 /etc/default/docker 에서 준 명령을 듣지 않는 것이다.
다른 배포판에서는 systemd 기반의 것들은 따로 가이드가 있는데 아직 다른 배포판은 써보지 않았다. 허나될 가능성은 크다.
일단 최종 정리를 해보겠다.
먼저 Docker에서 ZFS를 쓰려면 ZFS가 Backing File System으로 설정 되어야만 쓸수 있다.
공식 문서를 읽고 재대로 번역해 보니 그러하다...
ZFS Pool을 생성한다.
그리고 ZFS Storage를 마운트 하기 위해 /var/lib/docker 에서 모든 것들을 없엔다.
그 다음 ZFS Storage를 마운트 시킨다.
그리고 /etc/default/docker 를 편집한다. 넣을 내용은 위에 있다.
마지막으로 Docker Service를 시작한다. 필자는 이렇게 해도 되지 않았기에 dockerd를 관리자 권한으로 실행해 옵션으로 지정하여 주어서 실행 했다.
긴 후기및 정리를 읽어 주셔서 감사합니다.
그리고 제 Docker는 1.12를 씁니다. API version 1.24
현 시점으로 최신인데 되먹지를 않으니 답답할 따름 입니다. 현재 이 문제를 Github에 보고 하였고 확인중 입니다.
sudo apt install zfsutils-linux 로 관련 도구들을 다운로드 한다.여기서 zfs를 검색해 보면 zfs-fuse 라는 것도 있는데 이건 또 다른 기능들이 있고 Docker 공식 강좌에서도 안 쓰므로 넘긴다. 안 쓰라는게 아니라
zfsuitls-linux로 먼저 시작하니 그런 것이다.ZFS에 대해 잘 알면 써도 좋다. 성능 관련 해서는 링크를 남긴다 --> https://docs.docker.com/engine/userguide/storagedriver/selectadriver/#/future-proofing
이제 다운로드가 끝나면 ZFS Pool을 만드는 방법에 대해 익힐 시간이다.
나는 IBM에서 준 Guide를 따랐다.
출처 --> https://developer.ibm.com/recipes/tutorials/use-zfs-with-docker-on-ubuntu/
요약하면 다음과 같다.
먼저 ZFS Pool을 만든다. 근데 충분한 디스크가 없거나 파티션 만들기 귀찮고 실험을 위해 한다면 img 파일을 만들어서 ZFS Pool로 쓰게하라고 한다.
명령어는 아래에 있다.
mkdir /zfsdevs
for i in {1..4}; do dd if=/dev/zero of=/zfsdevs/file$i bs=1G count=1 &> /dev/null; done
zpool create -f zpool-docker /zfsdevs/file1 /zfsdevs/file2 /zfsdevs/file3 /zfsdevs/file4
요약하면 for loop를 돌려 file1, 2, 3, 4 순으로 zfsdevs 폴더에 img 파일들을 만든 후에 zpool-docker 라는 이름의 Pool을 생성.
그 다음으로
zpool list로 만들어진 Pool이 재대로 생성되고 만들어 졌는지 본다.확인후에는 이제 그 다음으로 Docker를 환경 설정할 시간이다.
먼저 Docker service 를 종료한다.
sudo service docker stop 을 하면 된다.그 다음으로
sudo rm -rf /var/lib/docker/*를 써서 해당 디랙토리에 있는 모든 것들을 날려버린다.이제 이해가 될 것이다. 왜 가상머신에서 작업을 해줘야 하는지. 컨테이너 이미지 모두 없어져 버린다. 하지만 이유는 더 있지만 조금 있다 예기하겠다.
그 다음으로
zfs create -o mountpoint=/var/lib/docker zpool-docker/docker를 써서 /var/lib/docker 를 mount 시켜 zfs 저장소를 쓰게 한다. 이렇게 하면 Docker에서는 ZFS 파일 시스템을 써야 한다는 것을 이해하고 쓸 준비를 한다.허나 아직은 백엔드(Back-End) 단에서만 ZFS를 쓰는 것이다. 이 말은 Docker에서 ZFS 저장소를 쓰긴 쓰나 이미지나 컨테이너들을 저장할 파일 시스템은 아직 바뀌지 않는다는 뜻이다.
이대로 서비스를 시작하면 실제로 Backing File System은 ZFS인데 Storage Driver는 AUFS 그대로 인 것을 알 수 있다.
그러므로 우리는
/etc/default/docker 를 편집해야 하는 시점에 다다른다.자신이 원하는 편집기를 관리자 권한으로 실행하고 (필자는
sudo leafpad /etc/default/docker 를 썼다.)거기에 DOCKER_OPTS="--storage-driver=zfs" 를 넣으면 된다.
그리고 저장후에 마지막으로 Docker service를 시작 시키면 된다.
그러면 ZFS 가 Storage Driver로 사용되는게 보여야 한다.
근데 필자는 이 단계에서 이상이 보였다. 원래라면 되야 하는데 Docker 공식 문서에서도 된다고 하지만 실제로는 되지 않았다.
클린 설치를 하였건만 이건 아무리 생각해도 Docker 기능 자체의 문제인듯 하다.
설명하자면 Backing File System은 ZFS인데 여전히 Storage Driver는 AUFS를 쓴다.
결국 또 다른 방법으로 터미널 하나를 열고
sudo dockerd --storage-driver=zfs & 를 써서 Docker Daemon에 이걸 쓰겠다고 한 것이다. 그전에 Docker Service가 종료되어 있는 상태 이여야 한다.이렇게 해서 Storage Driver가 ZFS로 쓰이는 것을 확인 했었다. 실제로
docker run hello-world를 쓰니 재대로 출력이 되었다.근데 Guest 운영체제를 종료하고 다시 돌려보니 또 다른 문제가 생겼다.
Docker가 자신이 쓸 Storage Driver를 고르지 못해 Docker Service가 시작을 못한 것이다.
이쯤에서 욕을 해도 좋을 것이다. 분명 Ubuntu 배포판에서는 Docker가 직접 공식 문서 내애서 /etc/default/docker 를 편집해서 하라고 했건만 되먹지를 않는다.
이해가 안되는 순간이다.
결국 나는 sudo dockerd --storage-driver=zfs &로 일일이 해줘야 하는 상황에 이르럿다.
일단 원인을 분석해 보자니 systemd에서 /etc/default/docker 에서 준 명령을 듣지 않는 것이다.
다른 배포판에서는 systemd 기반의 것들은 따로 가이드가 있는데 아직 다른 배포판은 써보지 않았다. 허나될 가능성은 크다.
일단 최종 정리를 해보겠다.
먼저 Docker에서 ZFS를 쓰려면 ZFS가 Backing File System으로 설정 되어야만 쓸수 있다.
공식 문서를 읽고 재대로 번역해 보니 그러하다...
ZFS Pool을 생성한다.
그리고 ZFS Storage를 마운트 하기 위해 /var/lib/docker 에서 모든 것들을 없엔다.
그 다음 ZFS Storage를 마운트 시킨다.
그리고 /etc/default/docker 를 편집한다. 넣을 내용은 위에 있다.
마지막으로 Docker Service를 시작한다. 필자는 이렇게 해도 되지 않았기에 dockerd를 관리자 권한으로 실행해 옵션으로 지정하여 주어서 실행 했다.
긴 후기및 정리를 읽어 주셔서 감사합니다.
그리고 제 Docker는 1.12를 씁니다. API version 1.24
현 시점으로 최신인데 되먹지를 않으니 답답할 따름 입니다. 현재 이 문제를 Github에 보고 하였고 확인중 입니다.
댓글
댓글 쓰기