서론

개인용 자작 NAS같은걸 만들면서 대부분 가장 처음 설치하는게 NAS4Free 같은것부터 시작해서 여러가지 있겠지만 아마 그중에는 OwnCloud같은것도 존재할 것이다.

이유야 여러가지 있겠지만 일단 가장 많이쓰고 사용해보면 편한것 때문이라 생각된다.

하지만 설치과정은?

우분투의 경우 apt install owncloud 같은걸로 한방 끝낼수 있다고 공식홈페이지에 적혀있지만

그도 그렇지 않은게 일단 순수 우분투에서도 설정해야될게 산더미같이 많고 그렇게 설정했다 하더레도 기존에 사용중이던 다른 http서버나 DB같은게 모두 꼬여버려 결국 시스템 전체를 망친다는것을 어제 깨달았다. (이걸 복구하는건 불가능하다 판단되어 결국 시스템 전체를 초기화 하고 처음부터 다시 만들었다 ㅜㅠ...)

그래도 한번 써보고는 싶고.... 기존 시스템도 유지는 하고싶고.... 뭐 그런기분에서 생각난게 "가상화"이다.

물론 KVM이나 Xen같은 거창한게 아니고 좀더 소규모로, 실용적이게 사용가능한 Docker가 이번에 사용할 방법이다.

Docker는 리눅스 컨테이너기술과 chroot같은 개념은 쉬워도 복잡복잡한 기술들을 사용한놈인데
저 둘과 다른점을 뽑자면 위 둘은 가상화를 위해 운영체체 그 자체를 Emulate 하는 반면 이놈은 결국 프로세서는 리눅스 커널 위에서 실행되는 놈이니 프로세서는 실행하되 Docker를 활용해 커널에서 나오는 응답을 속여서 컨테이너 안과 밖을 고립시켜보자~ 같은 낌이다.

자세한건 다음기회에 다루도록 하고 지금은 OwnCloud가 실행되도록 하는 핵심만 적겠다.

본론

시작하기전에 이 강의는 x86, 정확히는 x86_64아키텍쳐에서만 실행가능하다. ARM에서 Docker사용이 불가능한건 아니나 공식적으로 ARM용 OwnCloud이미지는 나온적 없다. 참고하도록 하자. (이 서버는 Intel Cherrytrail기반 x86이라서 된다.)

일단 도커가 필요하다.

apt-get install docker.io

그 다음은 pull먼저 하라고는 하지만 보통 docker가 알아서 처리해 줌으로

docker run -d -p 8080:80 -v /home/somewhere:/var/www/html/data --name="data" owncloud

하면 알아서 도커가 owncloud이미지를 받고 실행하고 owncloud 설치는 완료된다. (참 쉽죠?)

각각 옵션을 설명하자면

-d : 백그라운드로 실행. (Foreground옵션은 -i로 기억)

-p : 컨테이너 외부 8080포트랑 컨테이너 내부 80번 포트를 연결해준다. 위 명령어대로 실행할 경우 http://mydomain.com:8080 으로 접속해야 owncloud에 접속 가능하다. 실행중인 http서버가 없다면 80:80으로 맞추면 바로 사용 가능하다.

-v : 도커 내부의 /var/www/html/data와 도커 외부의 /home/somewhere을 연결한다. /var/www/html/data는 owncloud에 업로드된 모든 데이터가 저장되는 곳이다.

--name : 이 컨테이너의 이름을 정해준다. 안정하면 자동으로 결정되는데 da2894j31d1 같은 이름이 되며 컨테이너를 백업하거나 삭제할때 치기 힘들다.... 위 명령어를 실행하면 data로 된다.

이렇게 하면 도커로 OwnCloud 완성이다. 각자 상황에 맞게 옵션을 수정해서 입력하고 나머지는 들어가서 ID랑 PW만 입력하면 된다.

무척이나 쉽다는 장점이 있지만 단점도 없진 않은데 일단 용량을 200MB정도 더 먹으며 네트워크 성능은 2%하락, 기존 http서버와 별개로 apache서버가 새로 돌아가기 때문에 램점유율이 100MB정도 올라간다. (=별로 어찌되든 상관없는정도의 단점)

이 명령어를 실행할경우 data란 이름의 컨테이너가 생성되는것이며 이는 docker ps명령어로 확인 가능하다. (컨테이너가 실행중이 아닐경우에는 docker ps -a로 확인가능)

앞으로 이 컨테이너를 끌때는 docker stop data 킬때는 docker start data같이 하면 기존 설정이 유지된체로 진행이 된다.

서버를 끄면 도커도 꺼짐으로 rc.localdocker start data만 추가시켜 부팅시 자동실행되게 하는법을 추천한다.

외전

본인, 즉 이 서버의 경우 이미 nginx가 설치되어 있어 docker는 다른 포트로 개방하고 리버스 프록시로 XXX.iwanhae.ga와 연결시켜 두었다. (XXX는 비밀)

단 이경우 한가지 문제가 발생했는데, 파일을 업로드 할때 nginx의 제약을 받게된다. (이걸 모르고 한참 해멧...)

원인은 nginx에서 받아들이는 데이터의 양이 기본설정으로 1.5mb로 한정되어있기때문......

다음설정을 추가해주면 해결된다.

client_max_body_size 0m;

예시

    location /{
            proxy_set_header    X-Real-IP $remote_addr;
            proxy_set_header    Host      $http_host;
            proxy_pass          http://127.0.0.1:2368;
            client_max_body_size 0m;
   }

apache에도 비슷한 설정이 있는걸로 알고있는데 그건 각자 알아서.

외전 #2

기본적으로 위와같은 설정을 해 프록시서버의 용량제한을 해제해도 최대 사용업로드 가능용량이 513MB정도밖에 안된다. 더 큰 용량을 업로드하기위해서는 컨테이너 속 .htaccess파일을 건드려야 하는데 컨테이너 외부와 내부가 독립되어있다보니 건들기 힘들다.....

본인이 행한 방법은 다음과 같다.

  1. docker exec data cp .htaccess ./data
  2. 이제 /home/somewhere.htaccess파일이 복사된다. 이걸 수정한다.
  3. docker exec data mv ./data/.htaccess .htaccess

이런식으로 위 -v옵션으로 컨테이너 내부와 외부가 연결된 지점으로 파일을 복사한뒤 수정하고 다시 원위치에 복귀시키는 방법이다.

정석적인 방법은 아니라 생각되며 더 좋은 방안이 있으면 댓글로....

후기

사실 도커 재미난건 알고있어도 어따쓰나? 라 생각하며 안쓰고 있었다. 근데 이번에 도커의 편리성독립성에 반하게 될것 같다. 그만큼 도커는 쉽고도 안정적인 시스템을 구축할수 있게 도와준다. (물론 자원상의 낭비가 조금 있지만 요즘컴퓨터에서는 별 의미 없는정도이다.)

또한 전혀 다른 컴퓨터에서도 (아키텍쳐만 같다면) 도커 이미지 공유를 통해 같은 경험을 선사하는게 가능하다.

물론 이것까지는 기존의 가상화 솔루션들도 가능한 수준이지만 사용자 입장으로서 도커는 기존 체계보다 훨씬 가벼워 저사양의 컴퓨터 (이 서버의 경우 ATOM CPU의 제일 보급형기종인데도 잘 돌아간다. Raspberry Pi2 에서도 잘 돌아갔다.)에도 전혀 무리없이 돌아간다는 장점이 있다.

앞으로 이 도커를 좀더 적극적으로 활용할 방안을 구상해 봐야겠다.