Docker修改空间大小
生活随笔
收集整理的這篇文章主要介紹了
Docker修改空间大小
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Docker默認空間大小分為兩個,一個是池空間大小,另一個是容器空間大小。
池空間大小默認為:100G
容器空間大小默認為是:10G
所以修改空間大小也分為兩個:
這里使用centos下的yum進行安裝的Docker。?
首先,修改空間大小,必需使Docker運行在daemon環境下,即先停止正在運行的docker服務:
service docker stop
然后使用命令使用daemon環境下運行docker:
docker -d
一、修改池空間大小方法:
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=1000
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1G count=0 seek=10
上面的1000為1TB大小,即為數據池空間大小為1TB,而10則為Metadata的空間大小,10GB
從運行完后,使用命令查看docker池空間大小:
docker info
可以看到池空間已經被設置為data=1TB和metadata=10GB
二、修改容器空間大小:
1、首先先進入目錄(使用yum安裝docker的默認目錄):
cd /dev/mapper/
?
2、使用命令查看容器是否正在運行。
docker ps -a
這里可以看到容器test正在運行。
?3、使用命令查看容器卷:
dmsetup table
可以看到20971520,這個是卷空間值,我們需要修改的就是這里。
其它的值要記下:253:7 11
?
4、使用ls或ll命令查看在/dev/mapper/目錄下的文件是否存在。(這步很重要,因為非正在運行的Container是不會有這個文件的)
5、使用命令修改容器空間大小:
echo 0?88080384?thin 253:7 11 | dmsetup load docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
這里的88080384會替換原20971520值,意思為:42GB。
計數公式為:42*1024*1024*1024/512
可以使用命令打印:
echo $((42*1024*1024*1024/512))
接著使用命令:
dmsetup resume docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
resize2fs /dev/mapper/docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
完成。
然后進入容器的終端,使用命令df -h即可看到修改后的容器空間:
寫了個shell腳本,用于修改池、容器空間使用:
1、resize_docker.sh
#!/bin/bash
DATA_SIZE=$1
METADATA_SIZE=$2
if [ "$DATA_SIZE" = "" ]; then
? ? DATA_SIZE=1000
fi
if [ "$METADATA_SIZE" = "" ]; then
? ? METADATA_SIZE=10
fi
# Stop docker service
systemctl stop docker
# Resize docker data space
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=$DATA_SIZE
# Resize docker metadata space
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1G count=0 seek=$METADATA_SIZE
# Start docker service
systemctl start docker
運行腳本方法:
sh resize_docker.sh 1000 10
將會把docker的池修改為data=1TB,metadata=10GB
2、resize_container.sh
#!/bin/bash
CID=$1
SIZE=$2
if [ "$CID" != "" ] && [ "$SIZE" != "" ]; then
? ? DEV=$(basename $(echo /dev/mapper/docker-*-$CID));
? ? dmsetup table $DEV | sed "s/0 [0-9]* thin/0 $(($SIZE*1024*1024*1024/512)) thin/" | dmsetup load $DEV;
? ? dmsetup resume $DEV;
? ? resize2fs /dev/mapper/$DEV;
? echo "Resize $CID completed."
else
? ? echo "Usage: sh resize_container 459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100";
fi
運行腳本方法:
sh resize_container.sh 459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100?
將容器459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771的空間修改為100GB
注:修改空間,必需是在docker的daemon模式下進行。
docker容器默認的空間是10G,如果想指定默認容器的大小(在啟動容器的時候指定),可以在docker配置文件里通過dm.basesize參數指定,比如
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
存儲引擎查看,可以使用docker info查看
15:25:49 # docker info?
Containers: 5?
Images: 62?
Storage Driver: devicemapper?
?Pool Name: docker-8:17-37748738-pool?
?Data file: /data1/docker/devicemapper/devicemapper/data
?Metadata file: /data1/docker/devicemapper/devicemapper/metadata
?Data Space Used: 21498.9 Mb?
?Data Space Total: 102400.0 Mb?
?Metadata Space Used: 13.7 Mb?
?Metadata Space Total: 2048.0 Mb?
Execution Driver: lxc-1.0.6?
Kernel Version: 3.10.0-123.el7.x86_64
從上面的Storage Driver可以看到我使用的引擎。
下面是動態擴展的例子:
1、新建立個test容器
15:23:48 #?docker run --privileged -d ?-p 22 --name='test' docker.ops-chukong.com:5000/CentOS6-http:new /usr/bin/supervisord?
1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7?
root@ip-10-10-27-221:/tmp
15:24:01 #?docker inspect test|grep -i add?
? ? ? ? "IPAddress": "172.17.0.18",?
root@ip-10-10-27-221:/tmp
15:24:08 # ssh 172.17.0.18?
The authenticity of host '172.17.0.18 (172.17.0.18)' can't be established.?
RSA key fingerprint is 39:7c:13:9f:d4:b0:d7:63:fc:ff:ae:e3:46:a4:bf:6b.?
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.18' (RSA) to the list of known hosts.?
root@172.17.0.18's password:?
Last login: Mon Nov 17 14:10:39 2014 from 172.17.42.1?
root@1716fe941926:~
?
15:24:13 # df -hT?
Filesystem ? ? ? ? ?Type ? ?Size ?Used Avail Use% Mounted on?
rootfs ? ? ? ? ? ? ?rootfs ?9.8G ?470M ?8.8G ?5% /?
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7?
? ? ? ? ? ? ? ? ? ? ext4 ? ?9.8G ?470M ?8.8G ?5% /?
shm ? ? ? ? ? ? ? ? ?tmpfs ? ?64M ? ?0 ?64M ?0% /dev/shm
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerinit?
/dev/sda3 ? ? ? ? ? ?ext4 ? ?518G ?30G ?462G ?6% /etc/resolv.conf?
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hostname
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hosts
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerenv
可以看到我運行test容器的根分區是ext4分區,容器是10G
2、使用我的腳本動態擴展容器空間
腳本內容
15:22:12 # cat dynamic_modify_docker_disk.sh?
#!/bin/bash?
#This script is dynamic modify docker container disk?
#Author Deng Lei?
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
container_id=`docker inspect -f '` `.`Id `' $1`?
now_disk=`dmsetup table /dev/mapper/docker-*-$container_id|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/docker-*-$container_id|sed "s/0 [0-9]* thin/0 $disk thin/"|dmsetup load /dev/mapper/docker-*-$container_id?
dmsetup resume /dev/mapper/docker-*-$container_id?
resize2fs /dev/mapper/docker-*-$container_id?
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空間
15:24:40 # sh dynamic_modify_docker_disk.sh test 20?
dynamic container test disk to 20G is success!?
root@ip-10-10-27-221:/tmp
15:24:46 # ssh 172.17.0.18?
root@172.17.0.18's password:?
Last login: Tue Jan 20 15:24:13 2015 from 172.17.42.1?
root@1716fe941926:~?
15:24:52 #?df -hT?
Filesystem ? ? ? ? ?Type ? ?Size ?Used Avail Use% Mounted on?
rootfs ? ? ? ? ? ? ?rootfs ?20G ?475M ?19G ?3% /?
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7?
? ? ? ? ? ? ? ? ? ? ext4 ? ?20G ?475M ?19G ?3% /?
shm ? ? ? ? ? ? ? ? ?tmpfs ? ?64M ? ?0 ?64M ?0% /dev/shm
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerinit?
/dev/sda3 ? ? ? ? ? ?ext4 ? ?518G ?30G ?462G ?6% /etc/resolv.conf?
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hostname
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hosts
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerenv
可以看到已經增加成功
下面在給test增加到50G
15:25:21 # sh dynamic_modify_docker_disk.sh test 50?
dynamic container test disk to 50G is success!?
root@ip-10-10-27-221:/tmp
15:25:24 # ssh 172.17.0.18?
root@172.17.0.18's password:?
Last login: Tue Jan 20 15:24:52 2015 from 172.17.42.1?
root@1716fe941926:~?
15:25:27 # df -hT?
Filesystem ? ? ? ? ?Type ? ?Size ?Used Avail Use% Mounted on?
rootfs ? ? ? ? ? ? ?rootfs ?50G ?480M ?47G ?1% /?
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7?
? ? ? ? ? ? ? ? ? ? ext4 ? ?50G ?480M ?47G ?1% /?
shm ? ? ? ? ? ? ? ? ?tmpfs ? ?64M ? ?0 ?64M ?0% /dev/shm
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerinit?
/dev/sda3 ? ? ? ? ? ?ext4 ? ?518G ?30G ?462G ?6% /etc/resolv.conf?
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hostname
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hosts
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerenv
也可以增加成功
但我要是像縮減到30G
15:25:45 # sh dynamic_modify_docker_disk.sh test 30?
I can't shink container test from 50G to 30G!I only modify contanier increase disk!
是無法進行縮減的,僅能進行增加操作。
至于動態增加的原理請參考http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/?
FAQ:
centos 7里使用docker的時候默認存儲引擎是devicemapper
在進行動態調整docker容器磁盤空間的時候,出現
resize2fs 1.42.9 (28-Dec-2013)?
resize2fs: Device or resource busy while trying to open /dev/mapper/docker-253:1-1270544-d2d2cef71c86910467c1afdeb79c1a008552f3f9ef9507bb1e04d77f2ad5eac4?
Couldn't find valid filesystem superblock.
原因是resize2fs僅能支持ext2、ext3、ext4,不支持xfs ? ,所以建議docker服務器的文件系統格式調整為ext4
通過命令可以觀察到/var/lib/Docker目錄很大,我的主機只有20G,這個目錄占了18G;原因是devicemapper的空間設的太大,通過docker info打印的Data Space Total參數可以看到,默認是107.4G。?
思路如下:
備份當前容器、鏡像;
刪除/var/lib/docker目錄;
使用dd命令重設大小;
恢復容器、鏡像;
工具:
需要額外空間保存備份文件,可以掛載一個u盤或者云盤。
docker save 可以導出鏡像 tar文件;
docker export 可以導出容器 tar文件;
備份好之后停止docker
# /etc/init.d/docker stop ?
刪除/var/lib/docker目錄;
#?mkdir -p /var/lib/docker/devicemapper/devicemapper/data ?
#?dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192 ?
建立的文件最大為 1M * 8192 = 8G
啟動docker
# /etc/init.d/docker start ?
使用docker info看看Data Space Total,檢查是否設置成功
docker load 可以導入鏡像tar文件為 鏡像
注意load用法為:docker load image1:new<image1.tar
docker import 可以導入容器tar文件為 鏡像
注意import用法為: cat container1.tar |docker import - container1:new
本文轉自 chengxuyonghu 51CTO博客,原文鏈接:http://blog.51cto.com/6226001001/1952804,如需轉載請自行聯系原作者
池空間大小默認為:100G
容器空間大小默認為是:10G
所以修改空間大小也分為兩個:
這里使用centos下的yum進行安裝的Docker。?
首先,修改空間大小,必需使Docker運行在daemon環境下,即先停止正在運行的docker服務:
service docker stop
然后使用命令使用daemon環境下運行docker:
docker -d
一、修改池空間大小方法:
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=1000
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1G count=0 seek=10
上面的1000為1TB大小,即為數據池空間大小為1TB,而10則為Metadata的空間大小,10GB
從運行完后,使用命令查看docker池空間大小:
docker info
可以看到池空間已經被設置為data=1TB和metadata=10GB
二、修改容器空間大小:
1、首先先進入目錄(使用yum安裝docker的默認目錄):
cd /dev/mapper/
?
2、使用命令查看容器是否正在運行。
docker ps -a
這里可以看到容器test正在運行。
?3、使用命令查看容器卷:
dmsetup table
可以看到20971520,這個是卷空間值,我們需要修改的就是這里。
其它的值要記下:253:7 11
?
4、使用ls或ll命令查看在/dev/mapper/目錄下的文件是否存在。(這步很重要,因為非正在運行的Container是不會有這個文件的)
5、使用命令修改容器空間大小:
echo 0?88080384?thin 253:7 11 | dmsetup load docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
這里的88080384會替換原20971520值,意思為:42GB。
計數公式為:42*1024*1024*1024/512
可以使用命令打印:
echo $((42*1024*1024*1024/512))
接著使用命令:
dmsetup resume docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
resize2fs /dev/mapper/docker-253:1-184549824-95f242e4fe2fef132ab1a706ebf8eecbb1c6db19547c3f12b34b76a5dee96c7e
完成。
然后進入容器的終端,使用命令df -h即可看到修改后的容器空間:
寫了個shell腳本,用于修改池、容器空間使用:
1、resize_docker.sh
#!/bin/bash
DATA_SIZE=$1
METADATA_SIZE=$2
if [ "$DATA_SIZE" = "" ]; then
? ? DATA_SIZE=1000
fi
if [ "$METADATA_SIZE" = "" ]; then
? ? METADATA_SIZE=10
fi
# Stop docker service
systemctl stop docker
# Resize docker data space
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=$DATA_SIZE
# Resize docker metadata space
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1G count=0 seek=$METADATA_SIZE
# Start docker service
systemctl start docker
運行腳本方法:
sh resize_docker.sh 1000 10
將會把docker的池修改為data=1TB,metadata=10GB
2、resize_container.sh
#!/bin/bash
CID=$1
SIZE=$2
if [ "$CID" != "" ] && [ "$SIZE" != "" ]; then
? ? DEV=$(basename $(echo /dev/mapper/docker-*-$CID));
? ? dmsetup table $DEV | sed "s/0 [0-9]* thin/0 $(($SIZE*1024*1024*1024/512)) thin/" | dmsetup load $DEV;
? ? dmsetup resume $DEV;
? ? resize2fs /dev/mapper/$DEV;
? echo "Resize $CID completed."
else
? ? echo "Usage: sh resize_container 459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100";
fi
運行腳本方法:
sh resize_container.sh 459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771 100?
將容器459fd505311ad364309940ac24dcdb2bdfc68e3c3b0f291c9153fb54fbd46771的空間修改為100GB
注:修改空間,必需是在docker的daemon模式下進行。
docker容器默認的空間是10G,如果想指定默認容器的大小(在啟動容器的時候指定),可以在docker配置文件里通過dm.basesize參數指定,比如
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
存儲引擎查看,可以使用docker info查看
15:25:49 # docker info?
Containers: 5?
Images: 62?
Storage Driver: devicemapper?
?Pool Name: docker-8:17-37748738-pool?
?Data file: /data1/docker/devicemapper/devicemapper/data
?Metadata file: /data1/docker/devicemapper/devicemapper/metadata
?Data Space Used: 21498.9 Mb?
?Data Space Total: 102400.0 Mb?
?Metadata Space Used: 13.7 Mb?
?Metadata Space Total: 2048.0 Mb?
Execution Driver: lxc-1.0.6?
Kernel Version: 3.10.0-123.el7.x86_64
從上面的Storage Driver可以看到我使用的引擎。
下面是動態擴展的例子:
1、新建立個test容器
15:23:48 #?docker run --privileged -d ?-p 22 --name='test' docker.ops-chukong.com:5000/CentOS6-http:new /usr/bin/supervisord?
1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7?
root@ip-10-10-27-221:/tmp
15:24:01 #?docker inspect test|grep -i add?
? ? ? ? "IPAddress": "172.17.0.18",?
root@ip-10-10-27-221:/tmp
15:24:08 # ssh 172.17.0.18?
The authenticity of host '172.17.0.18 (172.17.0.18)' can't be established.?
RSA key fingerprint is 39:7c:13:9f:d4:b0:d7:63:fc:ff:ae:e3:46:a4:bf:6b.?
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.18' (RSA) to the list of known hosts.?
root@172.17.0.18's password:?
Last login: Mon Nov 17 14:10:39 2014 from 172.17.42.1?
root@1716fe941926:~
?
15:24:13 # df -hT?
Filesystem ? ? ? ? ?Type ? ?Size ?Used Avail Use% Mounted on?
rootfs ? ? ? ? ? ? ?rootfs ?9.8G ?470M ?8.8G ?5% /?
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7?
? ? ? ? ? ? ? ? ? ? ext4 ? ?9.8G ?470M ?8.8G ?5% /?
shm ? ? ? ? ? ? ? ? ?tmpfs ? ?64M ? ?0 ?64M ?0% /dev/shm
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerinit?
/dev/sda3 ? ? ? ? ? ?ext4 ? ?518G ?30G ?462G ?6% /etc/resolv.conf?
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hostname
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hosts
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerenv
可以看到我運行test容器的根分區是ext4分區,容器是10G
2、使用我的腳本動態擴展容器空間
腳本內容
15:22:12 # cat dynamic_modify_docker_disk.sh?
#!/bin/bash?
#This script is dynamic modify docker container disk?
#Author Deng Lei?
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
container_id=`docker inspect -f '` `.`Id `' $1`?
now_disk=`dmsetup table /dev/mapper/docker-*-$container_id|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/docker-*-$container_id|sed "s/0 [0-9]* thin/0 $disk thin/"|dmsetup load /dev/mapper/docker-*-$container_id?
dmsetup resume /dev/mapper/docker-*-$container_id?
resize2fs /dev/mapper/docker-*-$container_id?
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空間
15:24:40 # sh dynamic_modify_docker_disk.sh test 20?
dynamic container test disk to 20G is success!?
root@ip-10-10-27-221:/tmp
15:24:46 # ssh 172.17.0.18?
root@172.17.0.18's password:?
Last login: Tue Jan 20 15:24:13 2015 from 172.17.42.1?
root@1716fe941926:~?
15:24:52 #?df -hT?
Filesystem ? ? ? ? ?Type ? ?Size ?Used Avail Use% Mounted on?
rootfs ? ? ? ? ? ? ?rootfs ?20G ?475M ?19G ?3% /?
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7?
? ? ? ? ? ? ? ? ? ? ext4 ? ?20G ?475M ?19G ?3% /?
shm ? ? ? ? ? ? ? ? ?tmpfs ? ?64M ? ?0 ?64M ?0% /dev/shm
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerinit?
/dev/sda3 ? ? ? ? ? ?ext4 ? ?518G ?30G ?462G ?6% /etc/resolv.conf?
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hostname
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hosts
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerenv
可以看到已經增加成功
下面在給test增加到50G
15:25:21 # sh dynamic_modify_docker_disk.sh test 50?
dynamic container test disk to 50G is success!?
root@ip-10-10-27-221:/tmp
15:25:24 # ssh 172.17.0.18?
root@172.17.0.18's password:?
Last login: Tue Jan 20 15:24:52 2015 from 172.17.42.1?
root@1716fe941926:~?
15:25:27 # df -hT?
Filesystem ? ? ? ? ?Type ? ?Size ?Used Avail Use% Mounted on?
rootfs ? ? ? ? ? ? ?rootfs ?50G ?480M ?47G ?1% /?
/dev/mapper/docker-8:17-37748738-1716fe941926dbd0b247b85d73e83b9465322a5005edc3c6182b59a6ac0939a7?
? ? ? ? ? ? ? ? ? ? ext4 ? ?50G ?480M ?47G ?1% /?
shm ? ? ? ? ? ? ? ? ?tmpfs ? ?64M ? ?0 ?64M ?0% /dev/shm
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerinit?
/dev/sda3 ? ? ? ? ? ?ext4 ? ?518G ?30G ?462G ?6% /etc/resolv.conf?
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hostname
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /etc/hosts
/dev/sdb1 ? ? ? ? ? ?ext4 ? ?1.8T ?30G ?1.7T ?2% /.dockerenv
也可以增加成功
但我要是像縮減到30G
15:25:45 # sh dynamic_modify_docker_disk.sh test 30?
I can't shink container test from 50G to 30G!I only modify contanier increase disk!
是無法進行縮減的,僅能進行增加操作。
至于動態增加的原理請參考http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/?
FAQ:
centos 7里使用docker的時候默認存儲引擎是devicemapper
在進行動態調整docker容器磁盤空間的時候,出現
resize2fs 1.42.9 (28-Dec-2013)?
resize2fs: Device or resource busy while trying to open /dev/mapper/docker-253:1-1270544-d2d2cef71c86910467c1afdeb79c1a008552f3f9ef9507bb1e04d77f2ad5eac4?
Couldn't find valid filesystem superblock.
原因是resize2fs僅能支持ext2、ext3、ext4,不支持xfs ? ,所以建議docker服務器的文件系統格式調整為ext4
通過命令可以觀察到/var/lib/Docker目錄很大,我的主機只有20G,這個目錄占了18G;原因是devicemapper的空間設的太大,通過docker info打印的Data Space Total參數可以看到,默認是107.4G。?
思路如下:
備份當前容器、鏡像;
刪除/var/lib/docker目錄;
使用dd命令重設大小;
恢復容器、鏡像;
工具:
需要額外空間保存備份文件,可以掛載一個u盤或者云盤。
docker save 可以導出鏡像 tar文件;
docker export 可以導出容器 tar文件;
備份好之后停止docker
# /etc/init.d/docker stop ?
刪除/var/lib/docker目錄;
#?mkdir -p /var/lib/docker/devicemapper/devicemapper/data ?
#?dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192 ?
建立的文件最大為 1M * 8192 = 8G
啟動docker
# /etc/init.d/docker start ?
使用docker info看看Data Space Total,檢查是否設置成功
docker load 可以導入鏡像tar文件為 鏡像
注意load用法為:docker load image1:new<image1.tar
docker import 可以導入容器tar文件為 鏡像
注意import用法為: cat container1.tar |docker import - container1:new
本文轉自 chengxuyonghu 51CTO博客,原文鏈接:http://blog.51cto.com/6226001001/1952804,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的Docker修改空间大小的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ganglia监控
- 下一篇: 互动交流:移动系统安全研究专题及用户关心