Home | Back


การขยาย Storage ของ Docker Container

Thursday, 11 September 2014



ในการใช้งาน OS-Level Virtualization อย่าง Docker นั้น เมื่อเราสร้าง Container แล้ว ตัว Container จะมีขนาดของ Storage ตั้งต้นที่ 10G ซึ่งพอเพียงกับการใช้งานปกติ แต่หากมีความต้องการใช้ Storage ที่มากกว่านั้น เราสามารถขยายขนาดของ Container ได้ดังนี้ครับ

1. ตรวจสอบ Mapper Pool ของ Container

ในการทำงานของ Container นั้นจะมีการ Map Storage ของ Container ที่กำลังทำงานเข้าไปที่ /dev/mapper/docker* ให้เราตรวจสอบว่า Container ที่เราต้องการขยายนั้น ใช้ mapper อันไหน โดยให้เข้าไปที่ Container ที่กำลังทำงาน แล้วใช้คำสั่งดังนี้ครับ

$ df -h
Filesystem                                                                                       Size  Used Avail Use% Mounted on
/dev/mapper/docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e  9.8G  365M  8.9G   4% /
tmpfs                                                                                            3.9G     0  3.9G   0% /dev
shm                                                                                               64M     0   64M   0% /dev/shm
/dev/sda2                                                                                        443G   93G  328G  23% /etc/hosts

จะเห็นว่าที่ / นั้นจะ mount กับ /dev/mapper/docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e จะเป็นรหัสของ storage ของ Container ที่เราจะขยายครับ

ต่อไปให้เรากลับไปที่ Host เราจะทำการตรวจสอบพารามิเตอร์ของ Mapper ของเราด้วยคำสั่งดังนี้ครับ

$ dmsetup table docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e
0 20971520 thin 254:0 50

เราจะเห็นตัวเลข 20971520 ซึ่งเป็นขนาดของ Storage ของ Container ของเราในหน่วยของ 512 bytes เพราะฉะนั้นจะเห็นว่า Storage นี้จะมีขนาด 20971520 * 512 = 10737418240 bytes ซึ่งก็คือ 10G นั่นเอง

2. ปรับขนาดของ Mapper Pool ของ Container

ขั้นตอนต่อไปเราจะทำการปรับขนาดของ Storage โดยสมมุติว่าเราต้องการขนาด 20G ให้แปลงจำนวน 20G นี้ให้อยู่ในรูปของหน่วย 512 bytes ดังนี้ครับ 20G = 20 * 1024 * 1024 * 1024 / 512 = 41943040 และทำการปรับค่าพารามิเตอร์ของ Mapper โดยให้เปลี่ยนเฉพาะขนาดเท่านั้น ค่าพารามิเตอร์อื่นให้คงเดิมไว้ดังนี้ครับ

$ echo 0 41943040 thin 254:0 50 | dmsetup load docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e

$ dmsetup resume docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e

จากนั้นปรับขนาดของ File System ดังนี้ครับ

$ resize2fs /dev/mapper/docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e
resize2fs 1.42.11 (09-Jul-2014)
Filesystem at /dev/mapper/docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e is mounted on /var/lib/docker/devicemapper/mnt/25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/mapper/docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e is now 5242880 blocks long.

เท่านี้ขนาดของ Container ก็จะขยายเป็น 20G แล้วครับ เมื่อเราเข้าไปใน Container และตรวจสอบขนาดของ / แล้วจะพบว่าขยายเป็น 20G แล้วครับ ดังนี้

$ df -h
Filesystem                                                                                       Size  Used Avail Use% Mounted on
/dev/mapper/docker-8:2-2885995-25bff42b4813b6f3e0f94dc4ec24d5bea3d356d4febaec63aa0d6dd66130421e   20G  370M   19G   2% /
tmpfs                                                                                            3.9G     0  3.9G   0% /dev
shm                                                                                               64M     0   64M   0% /dev/shm
/dev/sda2                                                                                        443G   93G  328G  23% /etc/hosts

เรียบร้อยโรงเรียนไทยครับ :)



Home | Back