Docker로 설치한 Ubuntu의 데이터 증발 문제 질문 (마운트 관련)
안녕하세요.
이곳에서 늘 도움 많이 받고 있습니다. 편하게 물어볼 수 있는 유일한 곳인 것 같아요.
문제는 다음과 같습니다.
자동화를 위해 시놀로지 나스에 docker를 통해 ubuntu를 설치했습니다.
해당 ubuntu에 docker exec -it을 통해 접속하여 python, pip, nodejs, ffmpeg, pm2 등을 설치했고... 잘 굴러가고 있었는데요.
문제는 해당 컨테이너가 모종의 사유로 재시작되면 pip나 pm2 등 모든 명령어가 command not found라고 뜨면서 먹지 않습니다.
처음에는 단순 오류인 줄 알았는데, 계속 그래서 찾아보니 컨테이너가 재시작되면 마운트되지 않은 데이터는 날아가는 거 같더라고요.
결국 제 호스트와 마운트를 해야 문제를 해결할 수 있을 거 같은데...
문제는 마운트 방법은 대충 아는데 대체 어디를 마운트해야 할 지를 모르겠습니다.
-v /path/on/host:<여기>
아니면
volumes:
- "/path/on/host:<여기>"
이렇게...? 제가 궁금한 부분을 이렇게 설명하는 게 맞는 지 잘 모르겠지만...
대체 <여기>에 무엇을 집어넣어야 컨테이너가 재시작되어도 데이터가 날아가지 않을까요?
도움 부탁드립니다.
감사합니다!
그래서 pip 독커랑 pm2 독커랑 nodejs 독커랑 다 따로 설치해서 연동해서 쓰는거죠.
ubuntu 설치한 후에 앱을 설치할 거라면 lxd라는 것을 알아보세요.
하기는 할수 있겠지만.. 독커로 하기는 쉽지 않습니다.
굳이 하려고 한다면 pip, pm2, nodejs 설치되는 위치를 넣어주면 됩니다.
(전 그 세가지를 안써봐서 어디에 설치되는지 모르겠네요)
docker run 할 때 --rm 옵션 들어가면 컨테이너 종료 시 컨테이너 자체, 볼륨 마운팅 등 해당 컨테이너와 관련된 모든 리소스가 완전히 삭제됩니다(종료만 안되면 살아는 있죠). 그 뒤에 다시 docker run을 같은 명령어로 하시면 말씀하신 것처럼 설치한 내용이고 데이터고 싹 사라져있는 경우일 수는 있습니다.
그게 아니라면 쫌 이상한 케이스 같슴다... 컨테이너 deploy 하실 때 이용하신 docker run 커맨드 같은 걸 올려주시면 보다 더 조사해볼 수 있을 것 같네요. ~_~
사용한 docker-compose.yml은 아래와 같습니다.
version: "3.6"
services:
ubuntu:
command:
- "bash"
container_name: "app-name"
environment:
- "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
image: "ubuntu:latest"
network_mode: "host"
stdin_open: true
tty: true
volumes:
- "/volume2/video:/video"
감사합니다!!
올려주신 docker-compose.yml로 테스트해봤습니다. 제가 진행한 내용을 올려드릴테니 어떤 부분에서 차이가 있었을지 체크해보시면 좋을 것 같습니다.
그리고 올려주신 docker-compose.yml 내용에는 단계별 공백문자가 전혀 없는데 파일에는 공백이 제대로 되어있을 것 같습니다. 공백 넣은 파일은 첨부했으니 한번 확인해보세요. → 시놀로지오너_docker-compose.yml
-----------
1. DSM 파일 스테이션에서 docker-compose.yml 파일이 저장될 디렉토리 생성 및 파일 저장
- 저는 /volume1/docker/ubuntu 디렉토리를 생성하고 해당 디렉토리에 파일을 저장했습니다.
2. docker-compose를 통한 컨테이너 생성
FYI: DSM 7의 docker에는 compose 플러그인이 없어서 docker-compose라는 별도의 compose 바이너리를 사용해야합니다.
3. 컨테이너 생성 및 실행 여부 확인
- app-name이라는 컨테이너 이름으로 잘 실행되고 있습니다.
4. 컨테이너 cli 접속 및 정상적인 ubuntu인지 확인
5. apt update 및 테스트를 위한 curl 설치/실행 테스트
6. 컨테이너 exit
7. 컨테이너 cli 재접속 및 curl 실행 테스트
8. DSM 도커에서 컨테이너 재시작 및 컨테이너 cli 재접속, curl 실행 테스트
- root@tyDepot:/# 에서 바로 root@tyDepot:/volume1/docker/ubuntu# 이렇게 떨어지는 건 컨테이너 CLI로 접속해있는 중에 DSM 도커에서 컨테이너를 중지시켰기 때문에 호스트 서버의 콘솔로 빠져나온 것입니다.
도커 이미지는 RO(read only) 라서 도커 이미지로 ubuntu 컨테이너 올리고
ubuntu 컨테이너에 추가로 설치한 패키지나 셋팅은 컨테이너 재실행시 초기화 됩니다.
제가 예전에 블로그에 끄적여놨던 글 하나 소개 드립니다.
https://sonhc.tistory.com/m/855
1안. 링크에서 레벨2에 해당
도커에 ubuntu 이미지로 컨테이너 올려서 ubuntu 셋팅하고 이것저것 apt install 설치하신 다음에
docker 컨테이너를 docker commit 명령로 현재 컨테이너 상태를 새로운 docker image로 백업해보세요.
그럼 새롭게 백업된 docker image로 ubuntu 컨테이너를 다시 실행해 주면,
컨테이너 재실행하더라도 마지막 commit해둔 셋팅 그대로 사용할 수 있습니다.
2안. 링크에서 레벨3에 해당
1안처럼 docker commit 명령으로 수동으로 image 셋팅하지 않으려면 docker build 를 사용해야 합니다.
docker build는 dockerfile 이라는 스크립트를 통해 docker 환경을 자동으로 셋팅해서 docker image를 만들어줍니다.
이 docker build로 생성한 image로 ubuntu 컨테이너를 실행하면
ubuntu를 원하시는 셋팅 상태로 바로 사용할 수 있습니다.
결론은, 도커 환경은 기본적으로 RO 이고, -v 볼륨 맵핑한 경로만 host 쪽에 공유/남게 되니
도커로 ubuntu를 내 마음대로 셋팅해서 개발환경 같은걸 구성하시려면...
1안, 2안중에서 선택해 삽질해 보셔야 할듯 합니다.
cmt alert