본문 바로가기
개발/DevOps

Docker docs 따라하기 - 3. DB를 고정하기(named volume 사용)

by ny0011 2021. 2. 9.
반응형

docs.docker.com/get-started/05_persisting_data/

 

Persist the DB

 

docs.docker.com

링크는 데이터를 고정한다고 되어있다

 

1. container의 파일시스템을 알아보자

container마다 파일을 CRUD할 수 있는 "scratch space"를 갖게 됨(백업 불가능한 임시 사용자 공간)

 

연습) ubuntu 컨테이너를 실행시켜보자

ubuntu 컨테이너에서 실행할 명령어는 bash -c 다음의 "" 안에 있는 것임

1) 1~10000 중 하나를 뽑아서 /data.txt 파일에 저장한다

2) tail -f /dev/null : /dev/null의 마지막 내용을 확인하는 건데 container가 계속 떠 있게 유지하려고 한거라는 구만

$ sudo  docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
83ee3a23efb7: Pull complete
db98fc6f11f0: Pull complete
f611acd52c6c: Pull complete
Digest: sha256:703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715
Status: Downloaded newer image for ubuntu:latest
0d1189f6c2ab009d3ccf80c2055ef3c5117b4ae92382b418d0922dd035aa3d15

container 내의 /data.txt 를 확인해보면 뭔가 있음!

$ sudo docker exec 0d1189f6c2ab cat /data.txt
6490

근데 새로 ubuntu container를 실행하면 없다

run -it ubuntu ls / : ubuntu container를 새로 만들어 실행하는데 pseudo-TTY에 docker를 할당해서 container의 stdin과 연결함

-> 로컬에서 container에 명령할 수 있는 bash shell을 만들어줌

-> 새 ubuntu container에는 data.txt 파일을 만들라고 안했으니까 파일이 없음

-> tail -f /dev/null 명령이 없어서 ls /을 실행하고 바로 container가 종료됨

$ sudo docker run -it ubuntu ls /
bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
boot  etc  lib   lib64  media   opt  root  sbin  sys  usr

$ sudo docker exec 0d1189f6c2ab ls /
data.txt

run -it ubuntu 해서 shell로 들어간 뒤에 종료되면 어떻게 되는지 궁금해서 여러번 해봄

ls는 Up 상태인 container만 보여줘서 ls -a를 했더니 종료된 container도 같이 보여줌! 싱기싱기

$ sudo docker run -it ubuntu
root@529413f2e0ab:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@529413f2e0ab:/# exit
exit

$ sudo docker run -it ubuntu
root@d60f63d62a45:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@d60f63d62a45:/# exit
exit

$ sudo docker container ls -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS                      PORTS                    NAMES
d60f63d62a45   ubuntu                   "/bin/bash"              33 seconds ago   Exited (0) 29 seconds ago                            blissful_spence
529413f2e0ab   ubuntu                   "/bin/bash"              46 seconds ago   Exited (0) 38 seconds ago                            strange_rhodes
20b1848ba865   ubuntu                   "ls /"                   53 seconds ago   Exited (0) 50 seconds ago                            recursing_hofstadter
206c023b11c3   ubuntu                   "ls /"                   8 minutes ago    Exited (0) 8 minutes ago                             dreamy_jones

 

💫 container마다 저장 공간이 분리되어 있어서 container를 없애면 container 내부에 작업한 것들은 다 사라진다

volume을 사용하면 데이터가 사라지지 않고 남아 있게 됨!

-> host(내 컴퓨터)의 filesystem에 docker 영역을 만듦

-> container에 host 폴더를 마운트해 두면 host 폴더가 공유 폴더가 됨

-> 다른 container에서 host 폴더를 마운트해서 시작하면 container 간 데이터 공유가 가능해짐!

 

volume에 두가지 메인 타입이 있는데 일단 named volume을 사용해 볼 것임

 

2. todo 데이터를 고정하기 

named volume : volume을 생성할 때 이름을 지정해주는 것.

volume의 이름만 알면 docker에서 접근할 수 있다!

$ sudo docker volume create todo-db
todo-db

$ sudo docker volume ls
DRIVER    VOLUME NAME
local     todo-db

$ sudo docker volume inspect todo-db
[
    {
        "CreatedAt": "2021-02-09T12:01:08+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

기존에 돌고 있는 container는 지워주고 volume을 지정해서 container를 생성한다

$ sudo docker rm -f 49dd2e644745
49dd2e644745

$ sudo docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

로컬의 mount point와 container의 /etc/todos가 연결되어 데이터가 저장되어 있는 걸 아래처럼 확인 할 수 있다

$ sudo docker exec a4182f1cdfbf ls /etc/todos
todo.db

$ sudo ls /var/lib/docker/volumes/todo-db/_data
todo.db

todo.db는 todo app에서 만든 SQLite DB 파일로 todo app에서 /etc/todos에 todo.db를 만들게 했기 때문에

저 파일이 생긴 것.

요 container를 지우고 새로 container를 만들어도 todo.db는 살아있다!

$ sudo docker rm -f a4182f1cdfbf
a4182f1cdfbf

$ sudo  docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
1badc8fb656c508b7fbcb75b05883bfc0d043bd95df59f8a501c9791fe36025a

$ sudo docker exec 1badc8fb656c ls /etc/todos
todo.db

댓글