1. 程式人生 > >Docker容器學習梳理-容器硬碟熱擴容

Docker容器學習梳理-容器硬碟熱擴容

前面已介紹了docker很多知識點的操作記錄,今天這裡梳理下docker容器空間擴充套件的操作。預設情況下,物理機下建立的docker容器的空間是10G(虛擬機器下建立的docker容器空間就是虛擬機器的空間)。在實際生產環境下,對docker容器進行熱擴容(動態擴容)是非常重要的一個需求。

Docker容器動態擴充套件的優點:
1)不需要修改docker配置,不需要重啟docker服務;
2)可以直接對執行中的容器進行動態擴充套件(只能增,無法縮);

Docker容器動態擴充套件的條件:
1)docker所在宿主機分割槽的格式必須是ext2、ext3、ext4;
2)docker儲存引擎必須是devicemapper

下面的操作均是在centos6下操作的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

宿主機分割槽的格式是ext4

[[email protected] ~]# df -hT

Filesystem     Type   Size  Used Avail Use% Mounted on

/dev/sda3      ext4   193G  103G   80G  57% /

tmpfs          tmpfs   32G     0   32G   0% /dev/shm

/dev/sda1      ext4   194M   79M  106M  43% /boot

/dev/sda2      ext4   721G  136G  549G  20% /home

1)下載私有倉庫裡的映象(centos6和centos7下的docker命令和配置還是有所不同的)

[[email protected] ~]# vim /etc/sysconfig/docker

......

other_args='--insecure-registry=192.168.1.23:5000'

.....

[[email protected] ~]# service docker restart

Stopping docker:                                           [  OK  ]

Starting docker:                                           [  OK  ]

[[email protected] ~]# docker pull 192.168.1.23:5000/tomcat7

latest: Pulling from 192.168.1.23:5000/tomcat7

3690474eb5b4: Pull complete

0a444b299d5a: Pull complete

a04895de1996: Pull complete

08e1d80f2b80: Pull complete

fa7cc393f68b: Pull complete

Digest: sha256:b28f263bb8d5de3c93d64e85a5e9ee5cd6a1042f45ecbb951888d897d99e14e2

Status: Downloaded newer image for 192.168.1.23:5000/tomcat7:latest

[[email protected] ~]# docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

192.168.1.23:5000/tomcat7   latest              fa7cc393f68b        2 weeks ago         562.3 MB

2)建立容器

[[email protected] ~]# docker run -ti -d --name my-test -p 8998:8080 192.168.1.23:5000/tomcat7 /bin/bash

813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                    NAMES

813389572d7f        192.168.1.23:5000/tomcat7   "/bin/bash"         29 seconds ago      Up 28 seconds       0.0.0.0:8998->8080/tcp   my-test

[[email protected] ~]# docker exec -ti my-test /bin/bash

[[email protected] /]# df -HT

Filesystem                                                                                      Type   Size  Used Avail Use% Mounted on

/dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 ext4    9.9G  703M  8.7G   8% /

tmpfs                                                                                           tmpfs   34G     0   34G   0% /dev

shm                                                                                             tmpfs   68M     0   68M   0% /dev/shm

/dev/sda3                                                                                       ext4   207G  111G   86G  57% /etc/hosts

注意

容器my-test的大小為預設的10G。

上面命令結果中的/dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3檔案就是my-test容器儲存的檔名。

3)--------------下面開始進行容器空間的動態擴容------------------

使用dmsetup檢視該檔案扇區資訊.下面命令結果中的第二個數字(即20971520)是裝置的大小,表示有多少個 512-bytes 的扇區. 這個值略高於 10GB 的大小。

[[email protected] ~]# dmsetup table /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3

0 20971520 thin 253:0 13

計算20G所需扇區數目

[[email protected] ~]# echo $((20*1024*1024*1024/512))

41943040

精簡快照目標的一個神奇的特點是它不會限制卷的大小。當建立它的時候,一個精簡的卷使用0個塊,當開始往塊裡面寫入的時候,它們會從共用的塊池中進行分配。

可以寫0個塊,或者是10億個塊,這個和精簡快照目標沒關係。檔案系統的大小隻和Device Mapper表有關係。

只需要裝載一個新的表,這個完全和之前的是一樣的,但是有更多的扇區。僅此而已。

將新的扇區大小寫入,注意只是改變舊錶中的第二個數字20971520的數字,其他數字不變!

[[email protected] ~]# echo 0 41943040 thin 253:0 13 | dmsetup load /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3

將修改後的容器儲存檔案啟用

[[email protected] ~]# dmsetup resume /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3

重新檢視檔案資訊

[[email protected] ~]# dmsetup table /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3

0 41943040 thin 253:0 13

更改檔案系統大小,使變更生。

[[email protected] ~]# resize2fs /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3

resize2fs 1.41.12 (17-May-2010)

Filesystem at /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 is mounted on /var/lib/docker/devicemapper/mnt/813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3; on-line resizing required

old desc_blocks = 1, new_desc_blocks = 2

Performing an on-line resize of /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 to 5242880 (4k) blocks.

The filesystem on /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 is now 5242880 blocks long.

------------------------------------------------------------------------------------------------------------------

如果這一步出現下面報錯:

resize2fs 1.42.9 (28-Dec-2013)

resize2fs: 裝置或資源忙 當嘗試開啟 /dev/mapper/docker-253:0-268868570-2163383f446357876b301fb3942b706436b5eea111c06a3acba0006ec5272372 時找不到有效的檔案系統超級塊.

原因是resize2fs僅能支援ext2、ext3、ext4,不支援xfs。將docker伺服器的檔案系統格式調整為ext4即可。

本文操作機是centos6系統,分割槽都是ext4格式,故不會出現這個報錯

------------------------------------------------------------------------------------------------------------

再次登入my-test容器,發現容器大小已經更新為20G!

[[email protected] ~]# docker exec -ti my-test /bin/bash

[[email protected] /]# df -hT

Filesystem                                                                                      Type   Size  Used Avail Use% Mounted on

/dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 ext4    20G  708M   18G   4% /

tmpfs                                                                                           tmpfs   32G     0   32G   0% /dev

shm                                                                                             tmpfs   64M     0   64M   0% /dev/shm

/dev/sda3                                                                                       ext4   193G  103G   80G  57% /etc/hosts

--------------------------------------------------------------------------------------------

擴容後可能出現的問題:停止該容器後,無法重新啟動-

當容器擴容之後,由於dm認為裝置塊大小仍然為之前設定的初始大小,所以會發生無法起啟動的情況,這時只要重新操作即可。

必須要先啟動一下,讓其生成dm檔案才能修改

[[email protected] ~]# docker start my-test

#此時會報錯,不要理會,執行以下操作即可

[[email protected] ~]# echo 0 41943040 thin 253:3 725 | dmsetup load /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3

[[email protected] ~]# dmsetup resume /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3

--------------------------------------------------------------------------------------------

為了方便後續容器動態擴容,可以採用下面的Dynamic_Modify_Docker_Disk.sh指令碼(經測試可以使用)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#!/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

比如給my-test容器動態擴容到30G

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

[[email protected] ~]# chmod 755 Dynamic_Modify_Docker_Disk.sh

[[email protected] ~]# sh Dynamic_Modify_Docker_Disk.sh my-test 30

resize2fs 1.41.12 (17-May-2010)

Filesystem at /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 is mounted on /var/lib/docker/devicemapper/mnt/813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3; on-line resizing required

old desc_blocks = 2, new_desc_blocks = 2

Performing an on-line resize of /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 to 7864320 (4k) blocks.

The filesystem on /dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 is now 7864320 blocks long.

dynamic container my-test disk to 30G is success!

登陸容器檢視,已擴容至30G!

[[email protected] ~]# docker exec -ti my-test /bin/bash

[[email protected] /]# df -hT

Filesystem                                                                                      Type   Size  Used Avail Use% Mounted on

/dev/mapper/docker-8:3-4850707-813389572d7f569e7b3705070033b43cf9e42ed9d304e03662c92533838ddec3 ext4    30G  708M   28G   3% /

tmpfs                                                                                           tmpfs   32G     0   32G   0% /dev

shm                                                                                             tmpfs   64M     0   64M   0% /dev/shm

/dev/sda3

動態擴容後,對容器進行重啟,會發生報錯,此時再執行一次該指令碼進行重新擴容(空間大小要等於或大於之前的設定,出現報錯不用管),再啟動容器即可注意:docker容器目前是無法進行動態縮減的,僅能進行增加操作)。 

================================================================================
這裡需要注意一下:
上面的操作在centos6下進行docker容器的硬碟擴容可以順利完成,但在centos7下進行這些操作可能有點問題。
雖然centos 7裡使用docker的時候預設儲存引擎是devicemapper,但是在docker容器硬碟擴容的resize2fs這一步會出現類似下面報錯:
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,而xfs是CentOS7的預設檔案系統型別
所以建議docker伺服器的檔案系統格式調整為ext4(在centos7系統安裝時可以手動指定所在分割槽為ext4格式)。

======================下面說下Docker映象和容器存放目錄修改方法======================

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

這裡為了測試效果,將xfs格式的home分割槽盤解除安裝,格式化為ext4後重新掛載(當然也可以再用之前的xfs格式)。然後將Docker的映象、容器存放目錄由之前預設的/var/lib/docker修改為home分割槽下的路徑。

(當然,也可以另外新建一個分割槽,格式化,然後直接掛載到/var/lib/docker目錄下)

[[email protected] ~]# df -hT

檔案系統                型別      容量  已用  可用 已用% 掛載點

/dev/mapper/centos-root xfs       150G  5.7G  145G    4% /

devtmpfs                devtmpfs   32G     0   32G    0% /dev

tmpfs                   tmpfs      32G     0   32G    0% /dev/shm

tmpfs                   tmpfs      32G  474M   31G    2% /run

tmpfs                   tmpfs      32G     0   32G    0% /sys/fs/cgroup

/dev/mapper/centos-home xfs          774G   33M  774G    1% /home

/dev/sda2               xfs       397M  120M  278M   31% /boot

tmpfs                   tmpfs     6.3G     0  6.3G    0% /run/user/0

[[email protected] ~]# umount /home/         //解除安裝home分割槽盤

[[email protected] ~]# mkfs.ext4 /dev/mapper/centos-home        //格式化home盤為ext4檔案格式

[[email protected] ~]# mount /dev/mapper/centos-home /home      //重新掛載

[[email protected] ~]# df -hT

檔案系統                型別      容量  已用  可用 已用% 掛載點

/dev/mapper/centos-root xfs       150G  5.7G  145G    4% /

devtmpfs                devtmpfs   32G     0   32G    0% /dev

tmpfs                   tmpfs      32G     0   32G    0% /dev/shm

tmpfs                   tmpfs      32G  474M   31G    2% /run

tmpfs                   tmpfs      32G     0   32G    0% /sys/fs/cgroup

/dev/sda2               xfs       397M  120M  278M   31% /boot

tmpfs                   tmpfs     6.3G     0  6.3G    0% /run/user/0

/dev/mapper/centos-home ext4      762G   73M  723G    1% /home

接著就可以移動Docker的資料到ext4格式的home磁碟上了:

先停止docker服務,保證移動的時候資料完整

[[email protected] ~]# service docker stop

移動Docker的目錄到一個備份的目錄(可以mv改目錄名,docker重啟後會自動生成這個目錄;也可以將目錄下內容全部拷貝到別處,屆時要想恢復docker資料,只需要將備份內容拷貝回來,然後重啟docker服務即可)

[[email protected] ~]# mv /var/lib/docker /var/lib/docker_bak    //這樣,再次啟動docker服務後,映象及容器資料都不在了。只有將拷貝內容移回來,資料才會恢復。

修改開啟自掛載配置,將home分割槽由之前的xfs改為ext4.

[[email protected] ~]# cat /etc/fstab

#

# /etc/fstab

# Created by anaconda on Wed Oct 19 15:16:20 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

/dev/mapper/centos-root /                        xfs      defaults        0 0

UUID=349c9816-43e9-4c46-991a-e34e2370ab3f /boot  xfs      defaults        0 0

/dev/mapper/centos-home /home                    ext4     defaults        0 0

/dev/mapper/centos-swap swap                     swap     defaults        0 0

[[email protected] ~]# mount -a    //這條命令是重新載入/etc/fstab檔案,沒有檔案裡定義的分割槽掛載沒有掛,這條命令就會自動掛載上。

[[email protected] ~]# mount |grep home

/dev/mapper/centos-home on /home type ext4 (rw,relatime,seclabel,data=ordered)

最後修改docker的映象和容器存放路徑,比如修改為/home/var/docker

[[email protected] ~]# mkdir -p /home/var/docker

[[email protected] ~]# vim /etc/sysconfig/docker

......

OPTIONS='--selinux-enabled --log-driver=journald --graph=/home/var/docker'    //新增--graph=/home/var/docker引數

然後啟動docker服務,發現在新指定的目錄/home/var/docker下產生了新資料

[[email protected] ~]# service docker start

[[email protected] ~]# ls /home/var/docker/

containers  devicemapper  image  network  tmp  trust  volumes

接著恢復之前的映象資料

[[email protected] ~]# service docker stop

[[email protected] ~]# rm -rf /home/var/docker/*

[[email protected] ~]# mv /var/lib/docker_bak/* /home/var/docker/

[[email protected] ~]# service docker start

[[email protected] ~]# docker images         //發現映象資料已恢復到新目錄/home/var/docker下了

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE

192.168.1.23:5000/tomcat7      latest              47c5123914a1        8 days ago          562.3 MB

docker.io/redis                latest              83d6014ac5c8        13 days ago         183.6 MB

docker.io/ubuntu               latest              0ef2e08ed3fa        5 weeks ago         130 MB

docker.io/centos               latest              67591570dd29        3 months ago        191.8 MB

docker.io/tomcat               latest              ebb17717bed4        5 months ago        355.4 MB

================================溫馨提示================================

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

1)無法解除安裝分割槽

[[email protected] ~]# umount /home/

umount/home: device is busy.

(In some cases useful info about processes that use

the device is found by lsof(8) or fuser(1))

如上,解除安裝分割槽時提示無法解除安裝,則是有程序佔用/home

可以使用下面命令來終止佔用程序:

[[email protected] ~]# fuser -m -k /home

/home: 1409 1519ce 1531e 1532e 1533e 1534e 1535e 1536e 1537e 1538e 1539e 1541e 1543e 1544e 1545e 1546e 1547e 1548e 1549e 1550e 1601m

再次解除安裝home分割槽就成功了。

[[email protected] ~]# umount /home/

-k 表示自動把霸佔home分割槽的程序kill掉!

如果你不是很明確是否要殺死所有霸佔裝置的程式,還可以加一個-i 引數,這樣每殺死一個程式前,都會詢問!(即fuser -m -v -i -k /home

2)如按照上面步驟,將docker的存放目錄更換到/home/var/docker下。

如果後續再對home分割槽進行強制解除安裝,然後再重新掛載或格式化的時候,會發現有報錯:

[[email protected] ~]# fuser -m -k /home

[[email protected] ~]# mkfs.ext4 /dev/mapper/centos-home

mkfs.ext4: /dev/mapper/centos-home contains a mounted filesystem

[[email protected] ~]# mount/dev/mapper/centos-home

mount/dev/mapper/centos-home is already mounted or /home busy

這是因為docker資料還佔用著home分割槽,需要將docker服務停了才可以。

***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************