13. docker 매뉴얼 파괴 Volumes

  • by

볼륨

전장에 말했듯이 스토리지 디스크라고 생각하면 된다.

실행할 이미지와 별도로 저장되므로 데이터가 별도로 공유되어 사라지지 않습니다.

그리고, 도커의 내부로부터 돌기 때문에, 바인드 마운트보다 빠른 성능을 제공한다고 한다.


다만 이것이 또 하나 있는 것은 Windows에서 보면


요란식

그럼 사용법을 배우자.

1. volume

 docker run -d \
  --name devtest \ <-- 이건 볼필요없음 컨테이너 이름 정하는거
  -v myvol2:/app \
  nginx:latest

-v 와 같이 볼륨(myvol2)을 선택해 /app 라고 하는 폴더를 이미지로 해 공유한다고 하는 예상 그 이미지는 nginx:latest(nginx 마즈맥 버젼)

-v 대신 –volume도 가능하다고 한다

 docker run -d \
  --name devtest \ <-- 이건 볼필요없음 컨테이너 이름 정하는거
  --volume myvol2:/app \
  nginx:latest

같은 일

2. mount

이것은 더 다양한 형식을 가져올 수 있도록하는 것 같습니다.

그리고 옵션의 종류도 많다.

docker service create \
    --mount 
    'type=volume,
      src=<VOLUME-NAME>,
      dst=<CONTAINER-PATH>,
      volume-driver=local,
      volume-opt=type=nfs,
      volume-opt=device=<nfs-server>:<nfs-path>,
      "volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"
    '
    --name myservice \
    <IMAGE>

보면

‘,’로 옵션 분류

‘type=설정값’ (volume, bind, tmpfs) 3개를 결정하여 사용할 수 있다

‘src=볼륨 이름(source)’ 별칭?

‘dst(destination or target)=컨테이너의 폴더 이름’

‘volume-driver=옵션(local, ???)’ 뭔가 옵션이 있다고 생각합니다.

‘volume-opt=옵션=옵션2’ 여기는 단지 전문가의 부분인 것 같다.

“”이 큰 따옴표는 뭔가 bash처럼<単語> 이러한 형식을 값으로 변환하여주고 실행하는 bash처럼?

“readonly(ro)” 여기에 빠진 readonly도 있는데 이것은 콤마다 소리 그대로 치면 좋다

글쎄, 옵션이나 그런 것은 아래에서 보면 더 쉬울 것입니다.

도커의 예에는 이렇게 쓰여 있다.

docker volume create my-vol

흠.

하면

docker volume ls

목록 보기

docker volume inspect my-vol

볼륨에 정보 보기

docker volume rm my-vol

삭제합니다.

이걸로 끝~

그럼 이미지를 실행할 때 볼륨처럼 실행해 보겠습니다 (나는 mac입니다 ~)

==== -v ====
docker run -d \
    --name devtest \
    -v myvol2:/app \
    nginx:latest
  
==== -mount ====
docker run -d \
    --name devtest \
    --mount source=myvol2,target=/app \
    nginx:latest

위의 예입니다.

이제 앱에 볼륨이 공유되나요?라고 생각하는 나

그리고 사용중인 볼륨을 먼저 삭제할 수 없습니다.

사용된 위치를 지우고 삭제

docker container stop devtest
docker container rm devtest
docker volume rm myvol2

지금 조금 중요한 docker compose로 사용

나중에 compose에서 할 것이기 때문에 이것이 중요합니다.

services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:
    external: true

해석하면

service=서비스 시작~

frontend = 그냥 이름입니다.

image = 회전 image

volumes myapp: /home/… = 볼륨 설정 myapp 가져오고 home/…에 공유

volumes=볼륨 만들기

myapp = 볼륨 이름

external = 볼륨 옵션

true 일 때 docker network ls 라는 점을 보면 네트워크가 있다.

새롭게 추가해 접속하는 것이 아니라, 기존의 네트워크에 접속한다고 생각하면 좋다.

docker service create -d \
  --replicas=4 \
  --name devtest-service \
  --mount source=myvol2,target=/app \
  nginx:latest

-d 백그라운드 실행

-replicas=이것은 여러 실행입니다.

mount 를 이미 하고 있는 것에 계속할 수가 있다.

지금 네 가지로 myvol2를 함께 쓰고 있습니다.

==== -v ====
docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html \
  nginx:latest
  
==== -mount ====
docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html \
  nginx:latest

예는 조금 이상하다.

도커를 만드는데 다른 경로에 무언가 만들어진다면 그것을 가진 달인가? 볼륨에없는 것을 넣어주는 느낌?

nginx는 독자적으로 그 html 파일을 가지고 있어 공유하면 볼륨에도 들어가는 것 같다.

docker container stop nginxtest
docker container rm nginxtest
docker volume rm nginx-vol

지금 대망의 옵션

음… … 조금 이해할 수 없는 경우도 있으므로 참고해 주세요

ssh를 사용하기 위해 docker에 vieux/sshfs 플러그인

docker plugin install --grant-all-permissions vieux/sshfs

이제 볼륨을 만드는 옵션을 제공해 봅시다.

docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume

간단히 살펴보면 sshcmd, 즉 명령에이를 입력 한 다음 다음 비밀번호를 입력하는 것처럼 보입니다.

로그인하면 /home/test에 무언가가 발생하는 것보다

 docker run -d \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest

아니요…… 지금 사용자는 비밀번호가 없지만

https://github.com/vieux/docker-volume-sshfs/issues/72

docker plugin ls
docker plugin disable <id>
docker plugin rm <id>

잘 설치되어 있는지 확인합니다.

음 .. 추가 옵션은 그냥 경로

모든 것을 삭제하면 실행 중입니다.

볼륨 삭제

docker run --rm -v /foo -v awesome:/bar busybox top

이것은 실행했을 때 컨테이너를 종료하면 자연스럽게 볼륨을 삭제하는 명령이다.

아마?컨테이너도 삭제된다는 것을 알고 있습니다 –rm 명령 참고

docker volume prune

처음으로 모두 삭제해준다는

https://docs.docker.com/storage/volumes/