擴容容器
docker容器默認的空間是10G,如果想指定默認容器的大小(在啟動容器的時候指定),可以在docker配置文件里通過dm.basesize參數指定,比如
|
1
|
docker -d --storage-opt dm.basesize=20G
|
是指定默認的大小為20G,具體參數可以參考https://github.com/docker/docker/tree/master/daemon/graphdriver/devmapper
上面方法只是真的生成容器的時候進行的,並且修改后需要重啟docker,無法做到動態給運行容器指定大小,下面我介紹一下如何動態的擴展容器空間大小。
動態擴展的優點:
1、不需要修改docker配置,並且重啟docker服務;
2、可以直接對運行中的容器進行動態擴展(只能增,無法縮);
缺點:
1、docker所在宿主機分區的格式必須是ext2、ext3、ext4;
2、docker存儲引擎必須是devicemapper
首先,我們來創建容器。我們不需要在這個容器里運行任何東西,只需要這個文件(或者關聯的文件系統)存在。為了演示,我們會在這個容器里運行 df ,來看一下根文件系統的大小。
$ docker run -d ubuntu df -h /
4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
由於需要修改 Device Mapper 管理中的一些卷的信息,我們現在用 root 的身份來運行一些命令。所有以#開頭的命令都必須以 root 身份來執行。只要能訪問 Docker 的 Socket 服務,你也可以用普通用戶的身份來執行其他的命令(以$開頭)。
讓我們看一下 /dev/mapper ,那里應該有一個對應容器文件系統的符號鏈接,以 docker-X:Y-Z- 開頭:
# ls -l /dev/mapper/docker-*-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
lrwxrwxrwx 1 root root 7 Jan 31 21:04 /dev/mapper/docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603 -> ../dm-8
注意記住那個全名,我們未來會用到。
開始擴容:
1、首先讓我們來看一下當前卷的信息表:
# dmsetup table docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603 0 20971520 thin 254:0 7

第二個數字是設備的大小,表示有多少個 512-bytes 的扇區. 這個值略高於 10GB 的大小。
2、我們來計算一下一個 20GB 的卷需要多少扇區,
$ echo $((20*1024*1024*1024/512))
41943040
精簡快照目標的一個神奇的特點是它不會限制卷的大小。當你創建它的時候,一個精簡的卷使用0個塊,當你開始往塊里面寫入的時候,它們會從共用的塊池中進行分配。你可以寫0個塊,或者是10億個塊,這個和精簡快照目標沒關系。文件系統的大小只和 Device Mapper 表有關系。
覺得困惑?不要擔心。我們只是需要裝載一個新的表,這個完全和之前的是一樣的,但是有更多的扇區。僅此而已。
3、舊表是 0 20971520 thin 254:0 7 。我們會改變第二個數字,要非常小心保持其他的值不變。你的卷可能不是 7 ,所以要使用正確的值!
這樣操作:
# echo 0 41943040 thin 254:0 7 | dmsetup load docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
4、現在如果我們再次檢查表的信息,步驟和前面一樣。首先使用下面的命令激活新表:
# dmsetup resume docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
執行完命令后,再次檢查一下表的信息,發現它會使用新的扇區數量。
5、我們已經調整了塊設備的大小,但是我們仍然需要調整文件系統的大小,我們使用 xfs_growfs 來操作:
(網上很多說到的resize2fs后來看到xfs方式的使用dumpe2fs,該命令在16.04下可能出現文件正在使用或者找不到超級塊的錯誤,)
# xfs_growfs docker-0:37-1471009-4ab0bdde0a0dd663d35993e401055ee0a66c63892ba960680b3386938bda3603
![]()
至此,docker動態容器擴容成功。
6、停止該容器后,無法重新啟動
當容器擴容之后,由於dm認為設備塊大小仍然為之前設置的初始大小,所以會發生無法起啟動的情況,這時只要重新進行擴容操作即可。
$ docker start test#必須要先啟動一下,讓其生成dm文件才能修改。 即生成 /dev/mapper/docker-* --> /dev/dm-* #此時會報錯,不要理會,執行以下操作即可 $ echo 0 41943040 thin 252:0 9 | dmsetup load docker-253:1-131179-a835d492b6864a13eb11eddd17c3cabf5226f20bc01fbfe90964d80112a0df69 $ dmsetup resume docker-253:1-131179-a835d492b6864a13eb11eddd17c3cabf5226f20bc01fbfe90964d80112a0df69
-----------------------------------------------------------------------------------------------------------------------------
已經測試的腳本如下:
#!/bin/bash
#This script is dynamic modify docker container disk
if [ -z $1 ] || [ -z $2 ]; then
echo "Usage: container_name increase_capacity"
echo "Example: I want increase 11G to test"
echo "The command is: sh `basename $0` test 11"
exit 1
fi
if [ `docker inspect $1 &>>/dev/null && echo 0 || echo 1` -eq 1 ];then
echo "The container $1 is no exist!"
exit 1
fi
devicename=`docker inspect -f '{{ .GraphDriver.Data.DeviceName }}' $1`
now_disk=`dmsetup table /dev/mapper/$devicename|awk '{print $2}'`
disk=$(($2*1024*1024*1024/512))
if [ $disk -lt $now_disk ];then
echo "I can't shink container $1 from $(($now_disk*512/1024/1024/1024))G to ${2}G!I only modify contanier increase disk!"
exit 1
fi
dmsetup table /dev/mapper/$devicename|sed "s/0 [0-9]* thin/0 $disk thin/"|dmsetup load /dev/mapper/$devicename
dmsetup resume /dev/mapper/$devicename
xfs_growfs /dev/mapper/$devicename
if [ $? -eq 0 ];then
echo "dynamic container $1 disk to ${2}G is success!"
else
echo "dynamic container $1 disk to ${2}G is fail!"
fi
例如給test容器進行動態增加到20G空間
# sh dynamic_modify_docker_disk.sh wjoyxt 20
容器重啟后,會發生報錯,此時再運行一次該腳本進行重新擴容(空間大小要等於或大於之前的設置,出現報錯不用管),再啟動容器即可。
參考資料:http://dl528888.blog.51cto.com/2382721/1606170
