Docker Swarm은 볼륨 공유를 어떻게 구현합니까?


93

Docker Swarm은 두 가지 유형의 스토리지를 관리 할 수 ​​있습니다.

volumebind

하지만 bind그것이 작업에 (각 떼 노드에서) 로컬 디렉토리 사이의 바인딩 작성하기 도커 문서에 의해 제안되지는 volume내가 볼륨이 작업 사이에 공유하는 방법을 이해하지 않도록 구현은 언급되지 않는 이유는 무엇입니까?

  • Docker Swarm은 노드간에 볼륨을 어떻게 공유합니까?
  • 볼륨은 어디에 저장됩니까 (관리자에 있습니까? 관리자가 두 명 이상인 경우)?
  • 다른 네트워크의 다른 컴퓨터에서 실행되는 경우 노드간에 문제가 없습니까?
  • VPN을 생성합니까?

1
Swarm은 볼륨을 공유합니까? 도커 스웜을 다룬 것은 약 1 년 전이지만 스웜은 노드 간의 볼륨 공유에 대한 책임이 없다고 생각합니다. 노드가 동일한 볼륨을 공유하도록하려면 azure volumedriver와 같은 볼륨 플러그인을 사용해야합니다.
Munchkin

답변:


66

당신이 묻는 것은 일반적인 질문입니다. 볼륨 데이터와 해당 볼륨이 수행 할 수있는 기능은 볼륨 드라이버에서 관리합니다. 당신이 같은 다른 네트워크 드라이버를 사용할 수있는 것처럼 overlay, bridge또는 host, 당신은 다른 볼륨 드라이버를 사용할 수 있습니다.

Docker 및 Swarm은 기본 local드라이버 와 함께 제공됩니다 . Swarm을 인식하지 못하며 서비스 작업이 예약 된 노드에 데이터에 대한 새 볼륨을 생성합니다. 이것은 일반적으로 원하는 것이 아닙니다.

Swarm을 인식하고 서비스 작업을 위해 생성 한 볼륨을 적시에 올바른 노드에서 사용할 수있는 타사 드라이버 플러그인을 원합니다. 옵션에는 "Docker for AWS / Azure"및 포함 된 CloudStor 드라이버 또는 인기있는 오픈 소스 REX-Ray 솔루션 사용이 포함됩니다.

Docker Store 에서 찾을 수있는 타사 볼륨 드라이버가 많이 있습니다 .


hadoop이 그러한 공유 볼륨으로 작동 할 수 있습니까?
stackit

55

Swarm 모드 자체는 볼륨에 대해 다른 작업을 수행하지 않으며 컨테이너가 실행중인 노드에서 제공하는 모든 볼륨 마운트 명령을 실행합니다. 볼륨 마운트가 해당 노드에 로컬이면 데이터가 해당 노드에 로컬로 저장됩니다. 노드간에 데이터를 자동으로 이동하는 기본 제공 기능이 없습니다.

GlusterFS와 같은 일부 소프트웨어 기반 분산 스토리지 솔루션이 있으며 Docker에는 아직 GA되지 않은 Infinit이라는 솔루션이 있으며 EE의 Kubernetes 통합으로 뒷자리를 차지한 개발이 있습니다.

일반적인 결과는 애플리케이션 내에서 스토리지 복제를 관리해야하거나 (예 : etcd 및 기타 뗏목 기반 알고리즘) 외부 스토리지 시스템에서 마운트를 수행해야합니다 (자신의 HA를 사용하여). 외부 스토리지 시스템 마운트에는 블록 또는 파일 기반의 두 가지 옵션이 있습니다. 블록 기반 스토리지 (예 : EBS)는 일반적으로 더 높은 성능을 제공하지만 단일 노드에만 마운트되도록 제한됩니다. 이를 위해 일반적으로 도커 노드에 해당 블록 스토리지에 대한 액세스 권한을 부여하기 위해 타사 볼륨 플러그인 드라이버가 필요합니다. 파일 기반 저장소 (예 : EFS)는 성능이 낮지 만 이식성이 더 뛰어나고 여러 노드에 동시에 마운트 할 수 있으므로 복제 된 서비스에 유용합니다.

가장 일반적인 파일 기반 네트워크 저장소는 NFS (EFS에서 사용하는 것과 동일한 프로토콜)입니다. 타사 플러그인 드라이버 없이도 마운트 할 수 있습니다. 유감스럽게도 docker와 함께 제공되는 "local"볼륨 플러그인 드라이버는 드라이버 옵션을 사용하여 mount 명령에 원하는 값을 전달할 수있는 옵션을 제공하며 옵션없이 기본적으로 docker 디렉토리 / var / lib /에 볼륨을 저장합니다. 도커 / 볼륨. 옵션을 사용하면 NFS 매개 변수를 전달할 수 있으며 NFS 호스트 이름 (일반적으로 NFS에는없는 것)에 대한 DNS 조회도 수행합니다. 다음은 로컬 볼륨 드라이버를 사용하여 NFS 파일 시스템을 마운트하는 다양한 방법의 예입니다.

  # create a reusable volume
  $ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=192.168.1.1,rw \
      --opt device=:/path/to/dir \
      foo

  # or from the docker run command
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # or to create a service
  $ docker service create \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # inside a docker-compose file
  ...
  volumes:
    nfs-data:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,addr=192.168.1.1,rw
        device: ":/path/to/dir"
  ...

마지막에 compose 파일 예제를 사용하는 경우 볼륨 변경 (예 : 서버 경로 또는 주소 업데이트)이 존재하는 한 기존의 명명 된 볼륨에 반영되지 않습니다. swarm이 새 값으로 다시 만들 수 있도록 볼륨의 이름을 바꾸거나 삭제해야합니다.

대부분의 NFS 사용에서 볼 수있는 또 다른 일반적인 문제는 서버에서 "루트 스쿼시"를 활성화하는 것입니다. 이로 인해 루트로 실행되는 컨테이너가 볼륨에 파일을 쓰려고 할 때 권한 문제가 발생합니다. 또한 컨테이너 UID / GID가 볼륨에 쓰기위한 권한이 필요한 경우 유사한 UID / GID 권한 문제가 있습니다.이 경우 NFS 서버에서 디렉토리 소유권 및 권한을 조정해야 할 수 있습니다.


9

작동하는 AWS EFS 용 솔루션 :

  1. EFS 생성 (보안 그룹에서 NFS 포트 2049를 여는 것을 잊지 마십시오)
  2. nfs-common 패키지를 설치합니다.

    sudo apt-get install -y nfs-common

  3. efs가 작동하는지 확인하십시오.

    mkdir efs- 테스트 포인트
    sudo chmod go + rw efs-test-point
    sudo 마운트 -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, hard, timeo = 600, retrans = 2, noresvport [YOUR_EFS_DNS] : / efs-test-point
    터치 efs-test-point / 1.txt
    sudo umount efs-test-point /
    ls -la efs-test-point /

    디렉토리는 비어 있어야합니다.

    sudo 마운트 -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, hard, timeo = 600, retrans = 2, noresvport [YOUR_EFS_DNS] : / efs-test-point

    ls -la efs-test-point/

    1.txt 파일이 있어야합니다.

  4. docker-compose.yml 파일 구성 :

    서비스:
      sidekiq :
        볼륨 :
          -uploads_tmp_efs : / home / application / public / uploads / tmp
      ...
    볼륨 :
      uploads_tmp_efs :
        드라이버 : 로컬
        driver_opts :
          유형 : nfs
          o : addr = [YOUR_EFS_DNS], nfsvers = 4.1, rsize = 1048576, wsize = 1048576, hard, timeo = 600, retrans = 2
          기기 : [YOUR_EFS_DNS] : /


6

로컬에서 호스팅되는 떼에 대한 내 솔루션 : 모든 작업자 노드가 .NET의 파일 서버에서 제공하는 nfs-share를 마운트했습니다 /mnt/docker-data. 내 서비스에서 볼륨을 구성하는 파일을 정의 할 때 장치를에서 일부 경로로 설정했습니다 /mnt/docker-data. 예를 들면 다음과 같습니다.

volumes:
  traefik-logs:
    driver: local
    driver_opts:
      o: bind
      device: /mnt/docker-data/services/traefik/logs
      type: none

이 솔루션을 사용하면 docker는 모든 노드에 볼륨을 만들고 서비스가 배포되고 놀랍게도 다른 노드의 볼륨에서 사용했던 동일한 경로이기 때문에 이미 데이터가 있습니다.

노드 파일 시스템을 자세히 살펴보면 내 파일 서버 마운트에 대한 마운트가에서 생성 된 /var/lib/docker/volumes것을 볼 수 있습니다. 여기를 참조하세요.

root@node-3:~# df -h
Dateisystem                                                                                                   Größe Benutzt Verf. Verw% Eingehängt auf
[...]
fs.mydomain.com:/srv/shares/docker-data/services/traefik/logs                                 194G    141G   53G   73% /var/lib/docker/volumes/traefik_traefik-logs/_data
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.