Open cjmling opened 7 years ago
Docker Volume อธิบายไว้ดีมากที่ ( อ่านแค่ช่วงแรกๆ หลังๆเริ่มงง 55 ) : http://container-solutions.com/understanding-volumes-docker/
Quite simply, volumes are directories (or files) that are outside of the default Union File System and exist as normal directories and files on the host filesystem.
คือมันจะสร้าง directory ในเครื่องคอมของเรานั่นเองแล้ว container ก็จะเก็บข้อมูลต่างๆในตำแหน่งนั้น ซึ่งแปลว่าถ้า container ถูกลบ หรือ หยุด volumes นั้นก็ยังอยู่
ใน linux จริงๆเราสามารถเข้าถึง directory นั่นได้ แบบ cd เข้าไปได้ แต่ใน windows มันทำงานซับซ้อนกว่า ( ใน Mac/Windows มันจะเหมือนสร้าง Linux VM .. ซึ่ง files/folder นี้มันอยู่ใน vm ) ซึ่งทำให้เราไม่สามารถ cd เข้าถึง folder นั่นได้ขริงๆ
ถ้าเรา docker container inspect <containerName>
เพื่อดูข้อมูลอื่นๆของ container นั้น เราจะเห็นค่าในส่วนของ Mounts ตามในรูป
container จะเห็นว่า(คิดว่า)เราเก็บข้อมูลที่ destination แต่ในเบื้องหลัง ข้อมูลถูกเก็บจริงไว้ใน Source..
ก็จะเข้าใจได้ประมาณว่า destination เป็นแค่ชื่ออ้างอิง แต่ไม่ได้เก็บจริง ??
เราสามารถสร้าง Name Volumes ได้หลายวิธี และวิธีนึงคือเราสามารถสร้าง volumes ตั้งแต่ตอนที่เราสร้าง container นั่นเอง สมมุติเราจะสร้าง container mysql จาก mysql image docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql
ส่วนที่เป็น mysql-db
นำหน้า :
คือเรากำลังสร้าง named volumes ให้นั่นเอง
และเวลาเราลอง docker volumes ls
ก็จะเห็น ชื่อตัวนี้แทนที่จะเห็นเป็น volume name ที่เป็น string ยาวๆๆ
ความหมายของ :
https://docs.docker.com/engine/admin/volumes/volumes/#differences-between--v-and---mount-behavior
-v หรือ --volume : Consists of three fields, separated by colon characters (:
). The fields must be in the correct order, and the meaning of each field is not immediately obvious.
เราสามารถสร้าง container หลายๆอันได้ โดยให้มันใช้ volumes อันเดียวกันได้
ปกติ container เราสร้างขึ้นมา เราสามารถลบ หรือ หยุด มันได้ใช่ไหมครับ ซึ่งเวลา dev กันจริงๆก็คงได้หยุดหรือลบ หรือ สร้างใหม่บ่อยๆ ตราวนี้ก็จะเห็นปัญหาว่าแล้ว พวกฐานข้อมูลหล่ะ จะทำไง บางทีเราก็ไม่อยากลบฐานข้อมูลเพราะฐานช้อมูลอาจจะใหญ่ ขี้เกียจรอ seed ขึ้นไปใหม่
เพราะเหตุนี้ docker ก็มีทางออกให้คือเก็บพวก data นี้ที่อื่น ซึ่งทำได้ 2 วิธี
ตวามแตกต่างของ 2 อันนี้เท่าที่เข้าใจตอนนี้คือ
Data Volumes : เราสั่งให้ docker สร้างพื้นที่เพื่อเก็บข้อมูลให้เรา ซึ่งมันก็จะสร้างและเก็บไว้ในที่ๆของมันประมาณว่า relative path กับมัน มันจะรู้ว่าเก็บไว้ใหน ... พอเราสร้าง container ตัวนี้ในเครื่องคอมพ์ที่ใหนก็ตามมันก็สร้างที่เก็บข้อมูลตำแหน่งเดิมเมื่อเทียบกับตัวมัน ก็จะสามารถเข้าถึงได้โดยไม่มีปัญหา
ส่วน
Bind Mounts : คือเราสร้างพื้นที่เก็บข้อมูลในคอมพ์เราก่อน เป็น folder ไรก็ตาม แล้วสั่ง docker ว่านายเก็บข้อมูลที่จะต้องเก็บไว้ในตรงนี้น่ะ
ปัญหา: ที่จะเกิดขึ้นคือคราวนี้พอเราจะไป run เพื่อสร้าง container หรือ ทดสอบบนเครื่องอื่นๆ เช่นเครื่องที่เป็น windows บ้างหรือ Mac บ้าง คราวนี้ตำแหน่ง location ของ folder ที่เราระบุไว้มันก็ไม่เหมือนกันชะ เพราะ windows ใช้ path คนหล่ะแบบกับ Mac มันก็อาจจจะสร้างปัญหาได้... ตัวอย่างเราอาจจะเก็บไว้ใน C://folder/folder แต่ใน Mac ดันไม่มีไดร C: คราวนี้ก็เกิดปัญหาได้
น่าจะประมาณนี้น่ะ ไว้ค่อยมาอัปเดต
อันนี้ก๊อปมาจาก Docs .. ข้อดีของ volume เหนืออื่นจาก bind mounts (https://docs.docker.com/compose/compose-file/#volumes) Volumes have several advantages over bind mounts: