【Docker】CentOS8でコンテナ仮想ボリューム拡張手順(ESXi7.0環境)


Dockerでコンテナを構築して使用し続けるとコンテナもデータを書き込むボリュームがあるためそのうちコンテナないのボリュームが逼迫してしまいます。

今回は、Dockerコンテナの仮想ボリューム拡張手順についてまとめました。

また、本環境は「VMware vSphere ESXi7.0」、「CentOS8」でdockerを構築した環境となります。

# cat /etc/redhat-release 
CentOS Linux release 8.3.2011

「Docker」コンテナの仮想ボリュームを拡張する手順

CentOS8において、Dockerコンテナはデフォルトで「/dev/mapper/cl-root」のボリューム領域を仮想ボリュームとして使用します。
なのでこの「/dev/mapper/cl-root」のボリュームを拡張することでDockerの仮想ボリュームが自動的に拡張されます。

今回のDockerボリュームの拡張は「150GB」>「200GB」に拡張した例となります。

ボリューム拡張対象の仮想マシン(CentOS8)を停止しボリューム拡張

まずは、ボリューム拡張対象の仮想マシン(CentOS8)を仮想環境で停止し、「設定の編集」からボリュームを変更します。
今回は「150GB」>「200GB」への変更となります。

変更後、仮想マシンを起動させます。


Dockerコンテナのボリューム事前確認

仮想マシン起動後、以下のようにDockerコンテナを起動します。

# docker ps
CONTAINER ID   IMAGE           COMMAND        CREATED      STATUS         PORTS                                   NAMES
6fb891e567c3   centos:latest   "/sbin/init"   4 days ago   Up 3 seconds   0.0.0.0:2222->22/tcp, :::2222->22/tcp   centos8

コンテナのボリュームはボリューム先を指定しない場合はデフォルトで「overlay」配下に作成されます。
また、この仮想ボリュームは「/dev/mapper/cl-root」のボリュームの領域を参照しています。

# df -hT
ファイルシス        タイプ   サイズ  使用  残り 使用% マウント位置
devtmpfs            devtmpfs   3.8G     0  3.8G    0% /dev
tmpfs               tmpfs      3.8G     0  3.8G    0% /dev/shm
tmpfs               tmpfs      3.8G  8.7M  3.8G    1% /run
tmpfs               tmpfs      3.8G     0  3.8G    0% /sys/fs/cgroup
/dev/mapper/cl-root xfs        100G  3.2G   97G    4% /
/dev/sda2           ext4       976M  202M  708M   23% /boot
/dev/sda1           vfat       599M  6.9M  592M    2% /boot/efi
/dev/mapper/cl-home xfs         41G  322M   41G    1% /home
tmpfs               tmpfs      777M     0  777M    0% /run/user/0
overlay             overlay    100G  3.2G   97G    4% /var/lib/docker/overlay2/2eee25975e134d7b737be2773fb7394765e1eedbd6ca89362db5744372125134/merged

「fdisk」コマンドで現状のラベルを確認

次に「fdisk -l」で現状のラベルを確認します。
今回拡張するラベルは「/dev/sda3」となります。
「/dev/sda4」は前回拡張分のラベルとなります。

今回は新規で作成しないといけないので、「/dev/sda5」を作成することになります。

また、2行目で、「サイズが合致しません」という警告が発生しています。
これは、上記で仮想マシンのボリュームを拡張した影響であり、後の「fdisk」コマンドで修正できます。

[root@centos8-test ~]# fdisk -l
GPT PMBR のサイズが合致していません (314572799 != 419430399) が、w (書き込み) コマンドで修正されます。
The backup GPT table is not on the end of the device. This problem will be corrected by write.
ディスク /dev/sda: 200 GiB, 214748364800 バイト, 419430400 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 99C8BEE2-291F-4AD1-881F-8AC428E9A2E1

デバイス    開始位置  終了位置    セクタ サイズ タイプ
/dev/sda1       2048   1230847   1228800   600M EFI システム
/dev/sda2    1230848   3327999   2097152     1G Linux ファイルシステム
/dev/sda3    3328000 209713151 206385152  98.4G Linux LVM
/dev/sda4  209713152 314572766 104859615    50G Linux LVM

------ 中略 ------

増設したディスクへラベルを割り当てる

次に増設した分のディスク容量(50GB)にラベルを割り当てます。
コマンドは「fdisk /dev/sda」となります。

次に以下手順を実行します。

  1. 10行目:「p」コマンドで現在のパーティションの状況を確認
  2. 25行目:「n」コマンドを実行します。
  3. 26行目:パーティションタイプの選択で「既定値」の「5」を選択します。
  4. 27-28行目:そのままエンターキーを押します。
  5. 30行目:新しいパーティション「/dev/sda5」が作成されます。
  6. 32行目:「t」コマンドを実行し、「l」コマンドで確認した「/dev/sda3」と同じタイプ「Linux LVM」の「31」を入力します。
  7. 31行目:「w」コマンドでラベルの書き込みをし、fdiskコマンドを終了します。
[root@centos8-test ~]# fdisk /dev/sda

fdisk (util-linux 2.32.1) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。

GPT PMBR のサイズが合致していません (314572799 != 419430399) が、w (書き込み) コマンドで修正されます。
The backup GPT table is not on the end of the device. This problem will be corrected by write.

コマンド (m でヘルプ): p

ディスク /dev/sda: 200 GiB, 214748364800 バイト, 419430400 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 99C8BEE2-291F-4AD1-881F-8AC428E9A2E1

デバイス    開始位置  終了位置    セクタ サイズ タイプ
/dev/sda1       2048   1230847   1228800   600M EFI システム
/dev/sda2    1230848   3327999   2097152     1G Linux ファイルシステム
/dev/sda3    3328000 209713151 206385152  98.4G Linux LVM
/dev/sda4  209713152 314572766 104859615    50G Linux LVM

コマンド (m でヘルプ): n
パーティション番号 (5-128, 既定値 5): 5
最初のセクタ (314572767-419430366, 既定値 314572800):
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (314572800-419430366, 既定値 419430366):

新しいパーティション 5 をタイプ Linux filesystem、サイズ 50 GiB で作成しました。

コマンド (m でヘルプ): t
パーティション番号 (1-5, 既定値 5): 5
パーティションのタイプ (L で利用可能なタイプを一覧表示します): 31

パーティションのタイプを 'Linux filesystem' から 'Linux LVM' に変更しました。

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ディスクを同期しています。

上記設定完了後、「fdisk -l」コマンドで新たに「/dev/sda5」が作成されたことが確認できます。

[root@centos8-test ~]# fdisk -l
ディスク /dev/sda: 200 GiB, 214748364800 バイト, 419430400 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 99C8BEE2-291F-4AD1-881F-8AC428E9A2E1

デバイス    開始位置  終了位置    セクタ サイズ タイプ
/dev/sda1       2048   1230847   1228800   600M EFI システム
/dev/sda2    1230848   3327999   2097152     1G Linux ファイルシステム
/dev/sda3    3328000 209713151 206385152  98.4G Linux LVM
/dev/sda4  209713152 314572766 104859615    50G Linux LVM
/dev/sda5  314572800 419430366 104857567    50G Linux LVM

------中略------

拡張用のボリュームを物理ボリューム(PV)に反映

次に物理ボリューム(PV)に追加したボリュームを反映させます。
「pvdisplay」コマンドで、現在のPVの状態を確認します。

[root@centos8-test ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               cl
  PV Size               98.41 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              25193
  Free PE               0
  Allocated PE          25193
  PV UUID               Fczg2W-Uzuy-xsQH-rFhM-b4ap-0NaQ-eIOTZn

  --- Physical volume ---
  PV Name               /dev/sda4
  VG Name               cl
  PV Size               50.00 GiB / not usable 4.98 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              12799
  Free PE               0
  Allocated PE          12799
  PV UUID               rDnmSz-jUAe-5w7g-C3wN-KmnW-JaRx-f2NlLp

pvdisplayでは拡張先の「/dev/sda3」と、前回拡張分の「/dev/sda4」が表示されます。
新規ラベルで作成した「/dev/sda5」は表示されていません。

以下コマンドで新規物理ボリューム「/dev/sda5」を作成します。

[root@centos8-test ~]# pvcreate /dev/sda5
  Physical volume "/dev/sda5" successfully created.

上記で「successfully created.」と出力されれば正常に新規ボリュームが作成されます。
再度「pvdisplay」を実行すると、上記で作成した「/dev/sda5」が表示されます。

[root@centos8-test ~]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               cl
  PV Size               98.41 GiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              25193
  Free PE               0
  Allocated PE          25193
  PV UUID               Fczg2W-Uzuy-xsQH-rFhM-b4ap-0NaQ-eIOTZn

  --- Physical volume ---
  PV Name               /dev/sda4
  VG Name               cl
  PV Size               50.00 GiB / not usable 4.98 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              12799
  Free PE               0
  Allocated PE          12799
  PV UUID               rDnmSz-jUAe-5w7g-C3wN-KmnW-JaRx-f2NlLp

  "/dev/sda5" is a new physical volume of "<50.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda5
  VG Name
  PV Size               <50.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               cHejvC-CQOz-3toM-6ROT-4R1Z-tTec-kuWqVu

ボリュームグループ(VG)拡張

次にボリュームグループを拡張します。
「vgdisplay」コマンドでVGのサイズを確認します。
現状は「148.41 GiB」となっています。

[root@centos8-test ~]# vgdisplay
  --- Volume group ---
  VG Name               cl
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <148.41 GiB
  PE Size               4.00 MiB
  Total PE              37992
  Alloc PE / Size       37992 / <148.41 GiB
  Free  PE / Size       0 / 0
  VG UUID               S0Wbgt-3buq-1w0t-f8dg-oGna-fULe-Px4FcX

このVGに追加分の50GBを拡張します。
VG Nameが「cl」となるので、以下のコマンドを実行し、VGのボリュームを拡張します。

[root@centos8-test ~]# vgextend cl /dev/sda5
  Volume group "cl" successfully extended

再度、「vgdisplay」を実行すると「VG Size」が「198.41 GiB」と「50GiB」分拡張されたことが確認できます。

[root@centos8-test ~]# vgdisplay
  --- Volume group ---
  VG Name               cl
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  7
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               198.40 GiB
  PE Size               4.00 MiB
  Total PE              50791
  Alloc PE / Size       37992 / <148.41 GiB
  Free  PE / Size       12799 / <50.00 GiB
  VG UUID               S0Wbgt-3buq-1w0t-f8dg-oGna-fULe-Px4FcX

論理ボリューム(LV)拡張

次に論理ボリューム(LV)の拡張を実施します。

今回対象はDockerコンテナの仮想ボリューム「overlay」となるため、参照先のファイルパス「/dev/mapper/cl-root」を拡張します。
現状では、現状拡張されていないので100GBとなります。

[root@centos8-test ~]# df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
devtmpfs              3.8G     0  3.8G    0% /dev
tmpfs                 3.8G     0  3.8G    0% /dev/shm
tmpfs                 3.8G  8.7M  3.8G    1% /run
tmpfs                 3.8G     0  3.8G    0% /sys/fs/cgroup
/dev/mapper/cl-root   100G  3.2G   97G    4% /
/dev/mapper/cl-home    41G  322M   41G    1% /home
/dev/sda2             976M  202M  708M   23% /boot
/dev/sda1             599M  6.9M  592M    2% /boot/efi
tmpfs                 777M     0  777M    0% /run/user/0
overlay               100G  3.2G   97G    4% /var/lib/docker/overlay2/2eee25975e134d7b737be2773fb7394765e1eedbd6ca89362db5744372125134/merged

「lvdisplay」コマンドで「LV Size」を確認すると「100GiB」となっています。

[root@centos8-test ~]# lvdisplay
 
------中略------
 
  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                UAVzab-ABpi-5XzZ-iXyE-fl5B-xbA1-Ncdd2R
  LV Write Access        read/write
  LV Creation host, time centos8-test, 2021-04-15 15:03:16 +0900
  LV Status              available
  # open                 1
  LV Size                <100.00 GiB
  Current LE             25599
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

「/dev/mapper/cl-root 」の拡張サイズは、今回追加した50GBすべての空き領域を割り当てます。
以下コマンドを実行します。

[root@centos8-test ~]# lvextend  -l +100%FREE /dev/mapper/cl-root
  Size of logical volume cl/root changed from <100.00 GiB (25599 extents) to 149.99 GiB (38398 extents).
  Logical volume cl/root successfully resized.

上記で、「successfully resized.」となると拡張は成功します。
再度「lvdisplay」コマンドで「LV Size」を確認すると「LV Size」が拡張されたことが確認できます。

[root@centos8-test ~]# lvdisplay
 
------中略------

  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                UAVzab-ABpi-5XzZ-iXyE-fl5B-xbA1-Ncdd2R
  LV Write Access        read/write
  LV Creation host, time centos8-test, 2021-04-15 15:03:16 +0900
  LV Status              available
  # open                 1
  LV Size                149.99 GiB
  Current LE             38398
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

ファイルシステムでのDockerコンテナのボリュームサイズ拡張を反映

上記で「LV Size」のボリュームサイズは拡張されましたが、以下コマンドでファイルシステムでのサイズは拡張されていません。
「/dev/mapper/cl-root」が拡張されておらず、Dockerコンテナの仮想ボリューム「overlay」のボリュームサイズも拡張されていません。

[root@centos8-test ~]# df -hT
ファイルシス        タイプ   サイズ  使用  残り 使用% マウント位置
devtmpfs            devtmpfs   3.8G     0  3.8G    0% /dev
tmpfs               tmpfs      3.8G     0  3.8G    0% /dev/shm
tmpfs               tmpfs      3.8G  8.7M  3.8G    1% /run
tmpfs               tmpfs      3.8G     0  3.8G    0% /sys/fs/cgroup
/dev/mapper/cl-root xfs        100G  3.2G   97G    4% /
/dev/mapper/cl-home xfs         41G  322M   41G    1% /home
/dev/sda2           ext4       976M  202M  708M   23% /boot
/dev/sda1           vfat       599M  6.9M  592M    2% /boot/efi
tmpfs               tmpfs      777M     0  777M    0% /run/user/0
overlay             overlay    100G  3.2G   97G    4% /var/lib/docker/overlay2/2eee25975e134d7b737be2773fb7394765e1eedbd6ca89362db5744372125134/merged

ファイルシステム側に増設した論理ボリューム(LV)を認識させないといけないので「xfs_growfs」コマンドを実行し認識させます。

[root@centos8-test ~]# xfs_growfs /
meta-data=/dev/mapper/cl-root    isize=512    agcount=8, agsize=3276800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=26213376, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 26213376 to 39319552

「xfs_growfs」コマンドを実行後、再度ファイルシステムのボリュームサイズを確認すると「/dev/mapper/cl-root」のボリュームが拡張され、Dockerコンテナのボリューム「overlay」も同じサイズに拡張されていることが確認できます。

[root@centos8-test ~]# df -hT
ファイルシス        タイプ   サイズ  使用  残り 使用% マウント位置
devtmpfs            devtmpfs   3.8G     0  3.8G    0% /dev
tmpfs               tmpfs      3.8G     0  3.8G    0% /dev/shm
tmpfs               tmpfs      3.8G  8.7M  3.8G    1% /run
tmpfs               tmpfs      3.8G     0  3.8G    0% /sys/fs/cgroup
/dev/mapper/cl-root xfs        150G  3.6G  147G    3% /
/dev/mapper/cl-home xfs         41G  322M   41G    1% /home
/dev/sda2           ext4       976M  202M  708M   23% /boot
/dev/sda1           vfat       599M  6.9M  592M    2% /boot/efi
tmpfs               tmpfs      777M     0  777M    0% /run/user/0
overlay             overlay    150G  3.6G  147G    3% /var/lib/docker/overlay2/2eee25975e134d7b737be2773fb7394765e1eedbd6ca89362db5744372125134/merged

これで、Dockerコンテナのボリューム拡張は完了です。

CentOS8のボリューム拡張手順は以下の記事も参考にしてください。

【CentOS8】ボリューム拡張手順(/dev/mapper/cl-root)ESXi7.0環境

2021年4月18日

ESXi7.0、CentOS8で構築したDockerコンテナの仮想ボリュームを拡張する手順は以上となります。


関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUTこの記事をかいた人

blank

インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!