시놀로지 나스의 도커에서 어플리케이션의 자동 실행을 동작하게 하는 방법

시놀로지 나스에서 구동중인 도커가 간혹 재부팅 되는 경우가 있었다

집에서 구동중인 나스는 파일 저장 외에 여러 용도로 현재까지 아주 잘 활용중입니다. 활용용도가 가장 높은 것 중에 하나는 “도커” 를 사용하여 리눅스 서버를 구동중인데요, 개인적인 개발 용도로 현재까지 잘 사용중이었습니다.

제가 구동중인 시놀로지 나스에서 도커로 우분투를 설치하는 과정에 대해 궁금하신 분들은 위 글을 참고하시면 될 거 같습니다.

설치를 한지 2년이 지났기 때문에 당시에 우분투 20.04 버전으로 설치하여 구동중이었습니다. 그런데 최근에 이유를 알 수 없는 재부팅을 몇번 하는 걸 목격해서 그때마다 돌고 있던 몇개의 데몬들을 다시 실행 시켜줘야 했던 번거로움(?)이 동반이 되네요.

개인적으로 만든 간단한 서비스(?)긴 하지만 제가 늘 재부팅 할때를 대비해서 다시 도커 터미널에 들어가서 데몬들을 일일이 실행을 시켜주는게 쉽지 않습니다.(특히 밖에서 활동을 할때는 더더욱…)

보통 일반적인 리눅스에서는 사용자가 원하는 데몬이나 서비스들을 부팅 시 자동으로 실행을 시켜주는 기능이 당연히 들어있습니다. 따라서 이들을 이용하면 손쉽게 부팅 시 실행하는게 가능합니다. (systemd 등등)

그동안 귀찮아서 사용중인 도커의 리눅스에서 자동 실행을 하지 않았었는데 막상 하려고 보니 현재 도커의 우분투 20.04 이미지 파일에서 systemd 가 지원을 하지 않는거 같았습니다.

그래서 알아보니 도커 리눅스에서의 자동 실행은 별도의 조치가 필요하더군요. 도커가 워낙 가볍고 사용하기 쉽지만 세세한 부분에서 미흡한 부분이 있다는 것도 알게 되었습니다. 이번에 자동 재실행을 추가하면서 이리저리 좀 헤맸는데 알게 된 팁을 공유해 보고자 합니다.

이번 글에서는 시놀로지 나스에서 도커 이미지에서 우분투(리눅스)를 사용할때 내가 원하는 데몬들을 부팅시 자동 실행하는 방법 및 팁에 대해 소개합니다.

시놀로지 나스의 도커에서 이미지를 복제

이번에 알아보니 도커의 리눅스 이미지에서는 systemd 를 사용할 수가 없는거 같습니다. 대안으로 .bashrc 등을 사용하는 방법이 있으나 이 방법에는 제게 있어서 큰 문제가 발생합니다.

.bashrc 는 각 리눅스 계정에 접속할때마다 자동으로 쉘 스크립트나 명령어, 데몬들을 실행을 해주는데 SSH로 도커에 접근할 경우 실행하려는 데몬들이 SSH 로 접속할때마다 실행이 되버리는 상황이 발생합니다. (데몬 프로세스가 SSH로 도커에 접근할때마다 늘어나버리는 현상)

따라서 .bashrc 에 원하는 데몬들을 실행시키는 방법은 좀 맞지 않더군요. 그래서 찾은 방법이 “rc.local” 을 이용하는 겁니다.

하지만 이 방법도 사용하려면 다시 한번 장벽이 발생합니다. 도커 컨터이너의 우분투 이미지에서는 rc.local 이 비 활성화 되어 있다는 점입니다.

따라서 rc.local 에 원하는 스크립트나 데몬을 실행시켜도 부팅시에 전혀 동작을 하지 못합니다. (도커는 왜 이렇게 만들어 놨는지….) 관련하여 검색을 해보고 이런 저런 것들을 찾아본 결과 현재 사용중인 도커의 이미지를 복제한 뒤에 rc.local 을 만들어서 복제한 이미지에 포함시켜서 rc.local 을 부팅시에 자동으로 실행시키는 방법을 써야 할거 같습니다.

약간 번거롭지만 도커 이미지에서 자동 실행을 깔끔하게 하는 방법은 요 방법이 최선이거 같아 보이네요. 차근차근 설명해 보겠습니다.

먼저 시놀로지 나스의 웹 설정 화면으로 들어갑니다. 여기서 내가 사용중인 도커 이미지를 복제하기 위해 시놀로지 나스의 SSH를 활성화 시켜줍니다.

제어판에서 “터미널 및 SNMP” 를 선택합니다.

여기서 “SSH 서비스 활성화” 를 클릭하여 활성화 시켜 주세요. 그런 다음에 “적용” 을 누릅니다.

그런 다음에 SSH 터미널 프로그램을 사용하여 시놀로지 나스에 SSH로 접속합니다. 또한 root 계정으로 접속을 해야 합니다(내 계정으로 접속한 다음 sudo -i 를 사용하여 root 에 접근)

그런 다음 “docker ps” 명령어로 현재 구동중인 도커의 컨테이너 ID 를 알아냅니다.

그럼 위와 같이 현재 구동중인 컨테이너 ID 를 확인하는게 가능합니다. 요걸 가지고 이미지를 복사할 수 있습니다.

docker commit [컨테이너 ID 또는 이름] my-custom-image

위와 같이 docker commit 명령어로 기존의 컨테이너 이미지를 다른 이름으로 먼저 복제합니다.

Dockerfile 과 rc.local 파일 생성하기

이제 복제한 도커 이미지에 자동으로 실행시킬 구문을 넣기 위한 rc.local 파일을 작성합니다. 또한 rc.local 을 포함시키기 위해 Dockerfile 이라는 스크립트 파일을 하나 작성해 줍니다.

저도 도커의 세세한 기능을 다 써보지 않았었는데 도커 이미지를 이렇게 쉽게 복제하고 빌드를 하는게 가능한지 몰았었네요. 도커를 많이 사용하는 이유를 알거 같습니다.

먼저 Dockerfile 과 rc.local 을 작성할 디렉토리를 하나 만듭니다.

저는 “docker_project” 라는 디렉토리를 하나 만들었네요. 여기에 Dockerfile 과 rc.local 파일을 임의로 하나씩 만들어 줍니다.

FROM custom_ubuntu

COPY rc.local /etc/rc.local

RUN chmod +x /etc/rc.local

CMD ["/bin/bash", "-c", "/etc/rc.local; exec bash"]

위 파일은 Dockerfile 의 예시입니다. FROM 은 도커 이미지를 빌드할 소스 도커 이미지의 이름을 의미합니다. 다음으로 COPY 는 rc.local 파일을 복사할 경로를 써줍니다. RUN 은 /etc/rc.local 파일을 실행권한을 주는 것이고 마지막으로 CMD는 /etc/rc.local 파일을 부팅시 실행해주는 명령어입니다. 이 정도만 작성해주면 rc.local 파일이 부팅 시 자동으로 실행됩니다.

#!/bin/bash

# SSH 실행
/etc/init.d/ssh start
# cron 실행
/etc/init.d/cron start
# SSH와 cron 은 미리 설치 되어 있어야 함.

/root/run_service.sh

exit 0

위 구문은 rc.local 을 예제입니다. 저는 자동으로 SSH와 cron 이 실행되게 하였습니다. 저와 같이 시놀로지 나스의 도커에서 우분투 사용시에 자동으로 SSH와 cron 을 실행시키려면 위와 같이 하면 될꺼 같네요.

이 외에 자동으로 실행시킬 데몬들을 추가해 주면 됩니다. 위와 같이 쉘 스크립트를 사용하면 더 편리합니다. 마지막으로 “exit 0” 를 넣어줍니다.

도커 커스텀 이미지 빌드 및 재 구동하기

여기까지 했으면 도커 이미지를 재 빌드할 준비가 끝난겁니다. Dockerfile 과 rc.local 이 있는 위치에서 다음과 같이 명령어를 사용하여 커스텀 도커 이미지를 빌드해 주세요.

docker build -t my-custom-last-image .

이렇게 하면 해당 디렉토리의 Dockerfile 과 rc.local 파일을 참고하여 이미지를 새로 빌드하여 생성합니다. 시간이 약간 소요되므로 느긋하게 기다립니다.

root@codedosa_nas:/volume1/docker_project# docker build -t my-custom-last-image .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM custom_ubuntu
 ---> e89fd2361b3b
Step 2/4 : COPY rc.local /etc/rc.local
 ---> 35b2d9be2adc
Step 3/4 : RUN chmod +x /etc/rc.local
 ---> Running in db0f5f2f3c65
Removing intermediate container db0f5f2f3c65
 ---> d0a24b1428b6
Step 4/4 : CMD ["/bin/bash", "-c", "/etc/rc.local; exec bash"]
 ---> Running in d39c6b0350f1
Removing intermediate container d39c6b0350f1
 ---> 105e8d96d45f
Successfully built 105e8d96d45f
Successfully tagged my-custom-last-image:latest
root@codedosa_nas:/volume1/docker_project#

위와 같이 메시지가 나오면 rc.local 파일이 추가된 이미지를 새로 빌드하는게 완료된겁니다. 이제 시놀로지 나스의 도커 관리자 화면으로 이동하여 새 이미지를 추가합니다.

컨테이너 메뉴에서 “생성” 을 클릭합니다.

그럼 좀전에 생성한 이미지들이 나타납니다. 여기서 rc.local 파일을 넣은 커스텀 이미지를 선택해 주면 됩니다.

다음으로 다른 건 다 제쳐두고라도 “자동 재시작 활성화” 는 꼭 체크해 주세요. 그래야 해당 도커 컨테이너가 자동 재 부팅이 됩니다.

포트는 필요한 만큼 설정해 줍니다. 저는 SSH 가 필요해서 위와 같이 설정했습니다. (다음에 공유 폴더는 생략합니다. 적절히 설정해 주세요)

그럼 위와 같이 최종 컨테이너 생성전 요약 내용이 나타납니다. 여기서 위의 빨간 네모와 같이 명령에 위와 같이 들어가 있는지 반드시 확인합니다. 확인 한 다음 맞으면 컨터이너를 생성 및 실행하면 됩니다.

확인 해보니 좀전에 생성한 컨테이너가 잘 구동중이군요. 실제로 재부팅시 자동으로 원하는 서비스들이 실행되는지 확인해 보면 됩니다. 저는 잘 동작하는군요 ㅎ

설정이 끝났으면 나스의 SSH를 비활성화 해주는게 좋습니다.

이상으로 시놀로지 나스의 도커에서 내가 원하는 서비스나 데몬의 자동 실행 방법에 대해 알아봤습니다. 이번에 저도 처음 알게 된 내용인데 도움이 되실꺼 같아 공유해 봅니다.

'코드도사(codedosa.com)'에는 쿠팡파트너스 등의 제휴링크가 포함되어 있으며 수수료를 제공받을 수 있습니다.