โหมด Swarm เองไม่ได้ทำอะไรที่แตกต่างกับไดรฟ์ข้อมูลโดยจะรันคำสั่งการเมานต์ไดรฟ์ข้อมูลใด ๆ ที่คุณระบุบนโหนดที่คอนเทนเนอร์กำลังทำงานอยู่ หากการเมานต์โวลุ่มของคุณอยู่ภายในโหนดนั้นข้อมูลของคุณจะถูกบันทึกไว้ในโหนดนั้น ไม่มีฟังก์ชันในตัวที่จะย้ายข้อมูลระหว่างโหนดโดยอัตโนมัติ
มีซอฟต์แวร์ที่ใช้โซลูชันการจัดเก็บข้อมูลแบบกระจายเช่น GlusterFS และ Docker มีหนึ่งที่เรียกว่า Infinit ซึ่งยังไม่ใช่ GA และการพัฒนาที่นำเบาะหลังไปสู่การรวม Kubernetes ใน EE
ผลลัพธ์โดยทั่วไปคือคุณต้องจัดการการจำลองแบบของพื้นที่จัดเก็บภายในแอปพลิเคชันของคุณ (เช่น etcd และอัลกอริทึมที่ใช้แพอื่น ๆ ) หรือคุณทำการเมาท์บนระบบจัดเก็บข้อมูลภายนอก (หวังว่าจะมี HA ของตัวเอง) การติดตั้งระบบจัดเก็บข้อมูลภายนอกมีสองตัวเลือกบล็อกหรือไฟล์ตาม ที่เก็บข้อมูลแบบบล็อก (เช่น EBS) มักจะมาพร้อมกับประสิทธิภาพที่สูงขึ้น แต่ถูก จำกัด ให้ติดตั้งบนโหนดเดียวเท่านั้น สำหรับสิ่งนี้โดยทั่วไปคุณจะต้องมีไดรเวอร์ปลั๊กอินโวลุ่มของบุคคลที่สามเพื่อให้โหนดนักเทียบท่าของคุณเข้าถึงที่เก็บข้อมูลบล็อกนั้น ที่เก็บข้อมูลตามไฟล์ (เช่น EFS) มีประสิทธิภาพต่ำกว่า แต่พกพาสะดวกกว่าและสามารถติดตั้งพร้อมกันบนหลายโหนดซึ่งเป็นประโยชน์สำหรับบริการที่จำลองแบบ
ที่เก็บข้อมูลบนเครือข่ายที่ใช้ไฟล์ทั่วไปคือ NFS (เป็นโปรโตคอลเดียวกับที่ใช้โดย EFS) และคุณสามารถเมานต์ได้โดยไม่ต้องมีไดรเวอร์ปลั๊กอินของบุคคลที่สาม น่าเสียดายที่ไดรเวอร์ปลั๊กอินไดรฟ์ข้อมูลที่มีชื่อว่า "local" ที่นักเทียบท่ามาพร้อมกับคุณมีตัวเลือกในการส่งผ่านค่าใด ๆ ที่คุณต้องการไปยังคำสั่งเมานต์พร้อมตัวเลือกไดรเวอร์และไม่มีตัวเลือกใด ๆ จะเริ่มต้นที่การจัดเก็บไดรฟ์ข้อมูลในไดเร็กทอรี docker / var / lib / นักเทียบท่า / ไดรฟ์ข้อมูล ด้วยตัวเลือกคุณสามารถส่งผ่านพารามิเตอร์ NFS และจะทำการค้นหา DNS บนชื่อโฮสต์ NFS (สิ่งที่คุณไม่มีใน 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"
...
หากคุณใช้ตัวอย่างไฟล์เขียนในตอนท้ายโปรดทราบว่าการเปลี่ยนแปลงไดรฟ์ข้อมูล (เช่นการอัปเดตเส้นทางเซิร์ฟเวอร์หรือที่อยู่) จะไม่แสดงในไดรฟ์ข้อมูลที่มีชื่อที่มีอยู่ตราบเท่าที่มีอยู่ คุณต้องเปลี่ยนชื่อวอลลุ่มของคุณหรือลบออกเพื่อให้ swarm สร้างมันขึ้นมาใหม่ด้วยค่าใหม่
ปัญหาทั่วไปอื่น ๆ ที่ฉันเห็นในการใช้งาน NFS ส่วนใหญ่คือ "รูทสควอช" ถูกเปิดใช้งานบนเซิร์ฟเวอร์ ส่งผลให้เกิดปัญหาการอนุญาตเมื่อคอนเทนเนอร์ที่รันในฐานะรูทพยายามเขียนไฟล์ไปยังไดรฟ์ข้อมูล นอกจากนี้คุณยังมีปัญหาเกี่ยวกับสิทธิ์ UID / GID ที่คล้ายกันโดยที่คอนเทนเนอร์ UID / GID เป็นสิ่งที่ต้องการสิทธิ์ในการเขียนไปยังไดรฟ์ข้อมูลซึ่งอาจต้องใช้การเป็นเจ้าของไดเร็กทอรีและสิทธิ์ในการปรับบนเซิร์ฟเวอร์ NFS