도커 스웜은 볼륨 공유를 어떻게 구현합니까?
도커 스웜(Docker Swarm)은 다음과 같은 두 가지 유형의 스토리지를 관리할 수 있습니다.
volume
그리고.bind
하는 동안에bind
노드에 .volume
구현이 언급되지 않았는데, 작업 간에 볼륨이 공유되는 방식을 이해할 수 없습니까?
- 도커 스웜은 노드 간에 볼륨을 어떻게 공유합니까?
- 볼륨이 저장되는 위치(Manager)관리자가 둘 이상인 경우?)
- 서로 다른 네트워크의 서로 다른 기계에서 실행된다면 노드 간에 문제가 없습니까?
- VPN을 만들 수 있습니까?
스웜 모드 자체는 볼륨과 다른 작업을 수행하지 않으며, 컨테이너가 실행 중인 노드에서 제공하는 모든 볼륨 마운트 명령을 실행합니다.볼륨 마운트가 해당 노드에 로컬인 경우 데이터가 해당 노드에 로컬로 저장됩니다.노드 간에 데이터를 자동으로 이동할 수 있는 기능이 내장되어 있지 않습니다.
GlusterFS, Rook, Ceph 및 Longhorn과 같은 일부 소프트웨어 기반 분산 스토리지 솔루션이 있습니다.이 중 많은 부분이 쿠베르네테스와의 통합에 초점을 맞추고 있어 스웜에서는 도움이 되지 않습니다.
일반적인 결과는 애플리케이션 내의 스토리지 복제(예: etcd 및 기타 raft 기반 알고리즘)를 관리하거나 외부 스토리지 시스템에서 마운트를 수행해야 한다는 것입니다(원하는 바로는 고가용성).외부 스토리지 시스템을 마운트하는 방법에는 블록 또는 파일 기반의 두 가지 옵션이 있습니다.블록 기반 스토리지(예: EBS)는 일반적으로 더 높은 성능을 제공하지만, 단일 노드에만 탑재되도록 제한됩니다.이를 위해서는 일반적으로 도커 노드가 해당 블록 스토리지에 액세스할 수 있도록 타사 볼륨 플러그인 드라이버가 필요합니다.파일 기반 스토리지(예: EFS)는 성능이 낮지만 휴대성이 뛰어나며 여러 노드에 동시에 장착할 수 있어 복제 서비스에 유용합니다.
가장 일반적인 파일 기반 네트워크 스토리지는 NFS(EFS에서 사용되는 프로토콜과 동일함)입니다.타사 플러그인 드라이버 없이 마운트할 수 있습니다.도커와 함께 제공되는 유감스럽게도 이름이 붙은 "로컬" 볼륨 플러그인 드라이버는 드라이버 옵션과 함께 원하는 값을 마운트 명령에 전달할 수 있는 옵션을 제공하며, 옵션이 없으면 기본적으로 도커 디렉토리 /var/lib/docker/volums에 볼륨을 저장합니다.옵션을 사용하면 NFS 매개 변수를 전달하고 NFS 호스트 이름에 대한 DNS 조회도 수행할 수 있습니다(NFS에서는 정상적으로 사용할 수 없음).로컬 볼륨 드라이버를 사용하여 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"
...
마지막에 작성 파일 예제를 사용하는 경우 볼륨의 변경 사항(예: 서버 경로 또는 주소 업데이트)이 존재하는 한 기존 명명된 볼륨에는 반영되지 않습니다.볼륨 이름을 바꾸거나 삭제해야 스웜이 새 값으로 볼륨을 재생성할 수 있습니다.
대부분의 NFS 사용에서 볼 수 있는 또 다른 일반적인 문제는 서버에서 "루트 스쿼시"를 사용하도록 설정하는 것입니다.따라서 루트로 실행 중인 컨테이너가 볼륨에 파일을 쓰려 할 때 사용 권한 문제가 발생합니다.또한 컨테이너 UID/GID가 볼륨에 쓰기 위한 권한이 필요한 컨테이너 UID/GID인 경우 NFS 서버에서 디렉토리 소유권 및 권한을 조정해야 하는 유사한 UID/GID 권한 문제가 있습니다.
당신이 묻고 있는 것은 흔한 질문입니다.볼륨 데이터와 해당 볼륨이 수행할 수 있는 기능은 볼륨 드라이버에서 관리합니다.다른 네트워크 드라이버를 사용할 수 있는 것처럼overlay
,bridge
, 아니면host
드라이버를 할 수 , 를 할 할 를 .
와 은 과 만 됩니다 됩니다 만 와 과 은 만local
운전자가 상자에서 나왔습니다.스웜(Swarm)에 대한 인식이 없으며 서비스 작업이 예약된 노드에서 데이터에 대한 새 볼륨만 생성됩니다.이것은 보통 당신이 원하는 것이 아닙니다.
스웜(Swarm)을 인식하고 서비스 작업을 위해 생성한 볼륨을 적절한 시간에 올바른 노드에서 사용할 수 있도록 하는 타사 드라이버 플러그인을 원합니다.옵션으로는 "Docker for AWS/Azure"와 포함된 CloudStor 드라이버 또는 인기 있는 오픈 소스 REX-Ray 솔루션을 사용할 수 있습니다.
서드파티 볼륨 드라이버는 도커 스토어에서 찾을 수 있습니다.
로컬에서 호스팅되는 스웜(swarm)을 위한 솔루션으로, 모든 워커 노드는 의 파일 서버에서 제공하는 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
이 솔루션을 사용하면 도커는 모든 노드에서 볼륨을 생성하고 서비스를 배포하며, 다른 노드의 볼륨에서 사용했던 동일한 경로이기 때문에 이미 데이터가 있습니다.
system을 , system 에 가 에 을 되는 을 되는 /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
AWS EFS를 위한 제 솔루션은 다음과 같습니다.
- EFS 생성(보안 그룹에서 NFS 포트 2049를 여는 것도 잊지 마십시오)
nfs-common 패키지 설치:
sudo apt-get install -y nfs-common
efs가 작동하는지 확인합니다.
mkdirfs-검정점suchmod go+schefs-test-point
sudo mount -tnfs -ofnfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,timeo=2,noresvport [YOUR_EFS_DNS]:/efs-test-point
터치 efs-test-point/1.txtsudumount efs-test-point/ls -lafes-test-point/
디렉터리가 비어 있어야 합니다.
sudo mount -tnfs -ofnfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,timeo=2,noresvport [YOUR_EFS_DNS]:/efs-test-point
ls -la efs-test-point/
파일 1.txt가 있어야 합니다.
docker-compose.yml 파일 구성:
서비스:sidekiq:볼륨:- upload_tmp_graphics:/home/응용프로그램/공개/공개/tmp... 볼륨:upload_tmp_load:드라이버: 로컬driver_opts:유형: nfso: addr=[YOUR_EFS_DNS],nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2장치: [YOUR_EFS_DNS]:/
기본적으로 스웜은 항상 로컬 볼륨 드라이버를 찾을 것입니다. 그래서 가장 좋은 방법은
- nfs 공유를 만듭니다.
yum -y install nfs-utils
- 아래와 같이 /etc/metc/metc로 내보냅니다.
/root/nfshare 192.168.1.0/24(rw,sync,no_root_squash)
- 필요한 포트를 열어봅니다. 제 경우에는 아래와 같이 했습니다.
firewall-cmd --permanent --add-service mountd ; firewall-cmd --permanent --add-service rpc-bind ; firewall-cmd --permanent --add-service nfs ; firewall-cmd --zone=public --permanent --add-port 2049/tcp
- 새로 생성된 공유를 도커 워커 노드에 마운트한 다음
docker service create --name my-web --replicas 3 -p 80:80 --mount 'type=volume,source=nfshare,target=/usr/share/nginx/html/,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/root/nfshare,"volume-opt=o=addr=192.168.1.8,rw"' nginx:latest
- 위의 예에서 나는 192.168.1.8 호스트에 nfshare를 생성하고 /etc/message 파일을 사용하여 내보냈습니다.
- 시작된 데몬
systemctl start nfs-server rpcbind & systemctl enable nfs-server rpcbind
- exportfs -r 변경사항이 적용됩니다.
- /root/marketshare have my index.hot 10.볼륨 드라이브 항목을 주의 깊게 확인합니다. 외부에서도 사용할 수 있습니다.
- 더 많은 참고를 위해 https://docs.docker.com/storage/volumes/
언급URL : https://stackoverflow.com/questions/47756029/how-does-docker-swarm-implement-volume-sharing
'programing' 카테고리의 다른 글
프로토콜 기능이 Self를 반환합니다. (0) | 2023.09.14 |
---|---|
MySQL의 계층 데이터에서 깊이 기반 트리 생성(CTE 없음) (0) | 2023.09.14 |
SQL: Oracle - 쿼리 중인 매개 변수 (0) | 2023.09.14 |
MySQL에서 보기를 만들려면 어떻게 해야 합니까? (0) | 2023.09.14 |
웹 및 모바일용 ASP.NET 웹 API 소셜 인증 (0) | 2023.09.14 |