dockerダウンタイム拡張pool空間
4413 ワード
私はここでdockerの容器を使ってテスト機を作って開発して使って、使っても大丈夫ですが、プロジェクトが増えるにつれて、もっと大きなハードディスクが必要なプロジェクトもあります.http://dl528888.blog.51cto.com/2382721/1606170)を使用してコンテナのスペースを動的に拡張しますが、現在設定しているdockerは poolは不足しています(デフォルトのpoolは100 gで、各コンテナに10 gの空間が与えられています)、poolがいっぱいになると新しいコンテナを作成することができず、データを削除してクリーンアップすることができません(ddを使用してテストします)、この問題を解決するために、私は準備します:
1、現在のコンテナとimagesをバックアップする.
2、dockerサービスを停止する;
3、拡張poolのサイズ(100 gからカスタムサイズに拡大);
4、dockerを起動し、コンテナとimagesを回復する.
バックアップ前のdockerの情報を次に示します
dockerは1.1.2バージョン、poolは100 g、現在は95 Gを使用していることがわかります
次は私の具体的なバックアップ操作手順です.
1、すべての容器に対応するipとファイアウォールの策略を記録する
私は現在dockerホストがデフォルトのdocker 0をブリッジしています.コンテナが再起動するとipが変更されます.ファイアウォールポリシーを変更しやすいように、dockerホストのipとファイアウォールポリシーをすべて記録します.
レコードdockerホストipは使用コマンドを参照できます
バックアップファイアウォールポリシー
2、すべてのdockerをバックアップするcontainer
poolを拡張するとデフォルトのimagesもコンテナもクリアされるのでバックアップしなければなりません
3、すべてのimagesをパッケージバックアップする
4、現在のdockerのすべてのcontainerを停止する
5、dockerサービスを停止する
6、古いdockerデータのバックアップ
データのバックアップは、失敗したロールバックのためです.
7、古いdockerデータベースを削除する
8、pool容量の増大
2つの方法で、1つはddを使用し、1つはdocker daemonコマンドを使用します.
ddを使用して、poolを600 Gに増やします
seekの後ろはサイズです
docker daemonの
9、dockerを起動する
10、imagesの復元
docker loadを使って1つずつ回復しましょう
11、回復容器
12、容器を起動してipを記録する
前回のリカバリでは、バックアップのコンテナをimagesにして、起動したいならdocker runを行います.例えば、私にはtest 1:newというimagesがあります.
13、ファイアウォールの調整
新しいコンテナipを覚え、最初のバックアップのファイアウォールポリシーに従って変更します.
心得:
コンテナがデフォルトの10 g空間を使用している場合、移行に問題はありませんが、デフォルトの10 g空間などのコンテナが動的に拡張されている場合、30 g以上に拡張されている場合は、リカバリコンテナをバックアップするときに、次のエラーが発生します.
このエラーはgoogleで2つの方法で解決されていますが、私はテストしましたが、解決していません.
1つ目の方法は物理メモリが不足していること、2つ目の方法はdockerテンポラリディレクトリを使用することです.
詳細issueリファレンスhttps://github.com/coreos/coreos-vagrant/issues/49
コンテナのディスク領域を動的に拡張しないで、できるだけvolumeを使ってマウントすることをお勧めします.
また1.3以上は容器を動的に拡張することができず、公式にissueを提出しても誰も答えていません.住所はhttps://github.com/docker/docker/issues/11153
1、現在のコンテナとimagesをバックアップする.
2、dockerサービスを停止する;
3、拡張poolのサイズ(100 gからカスタムサイズに拡大);
4、dockerを起動し、コンテナとimagesを回復する.
バックアップ前のdockerの情報を次に示します
09:54:52 # docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.2
Git commit (client): d84a070/1.1.2
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.2
Git commit (server): d84a070/1.1.2
root@ip-10-10-29-224:~
09:54:56 # docker info
Containers: 15
Images: 10
Storage Driver: devicemapper
Pool Name: docker-8:3-22676231-pool
Data file: /var/lib/docker/devicemapper/devicemapper/data
Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
Data Space Used: 95999.2 Mb
Data Space Total: 102400.0 Mb
Metadata Space Used: 51.4 Mb
Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 2.6.32-431.29.2.el6.x86_64
dockerは1.1.2バージョン、poolは100 g、現在は95 Gを使用していることがわかります
次は私の具体的なバックアップ操作手順です.
1、すべての容器に対応するipとファイアウォールの策略を記録する
私は現在dockerホストがデフォルトのdocker 0をブリッジしています.コンテナが再起動するとipが変更されます.ファイアウォールポリシーを変更しやすいように、dockerホストのipとファイアウォールポリシーをすべて記録します.
レコードdockerホストipは使用コマンドを参照できます
docker ps -a|grep -v "NAMES"|awk '{print $NF}'|xargs -I {} sh -c "docker inspect {}|grep -i add"
バックアップファイアウォールポリシー
cp /etc/sysconfig/iptables /tmp/iptables_backup
2、すべてのdockerをバックアップするcontainer
poolを拡張するとデフォルトのimagesもコンテナもクリアされるのでバックアップしなければなりません
docker ps -a|grep -v "NAMES"|awk '{print $NF}'|xargs -I {} sh -c "docker export {} >/tmp/docker_backup/containers/docker_{}.tar"
3、すべてのimagesをパッケージバックアップする
docker images|grep -v "REPOSITORY"|awk '{print $1":"$2}' >docker_images.txt && docker save -o /tmp/docker_backup/images/`cat docker_images.txt|cut -d/ -f2`.tar `cat docker_images.txt` && rm -rf docker_images.txt
4、現在のdockerのすべてのcontainerを停止する
docker stop `docker ps -a -q`
5、dockerサービスを停止する
/etc/init.d/docker stop
6、古いdockerデータのバックアップ
cp -a /var/lib/docker /tmp/docker_backup/data_backup
データのバックアップは、失敗したロールバックのためです.
7、古いdockerデータベースを削除する
rm -rf /var/lib/docker
8、pool容量の増大
2つの方法で、1つはddを使用し、1つはdocker daemonコマンドを使用します.
ddを使用して、poolを600 Gに増やします
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=600
seekの後ろはサイズです
docker daemonの
--storage-opt dm.loopdatasize=600G --storage-opt dm.loopmetadatasize=8G
9、dockerを起動する
/etc/init.d/docker start
10、imagesの復元
cd /tmp/docker_backup/images/
docker load test1:new<test1.tar
docker loadを使って1つずつ回復しましょう
11、回復容器
cd /tmp/docker_backup/containers/
cat test1.tar |docker import - test1:new
12、容器を起動してipを記録する
前回のリカバリでは、バックアップのコンテナをimagesにして、起動したいならdocker runを行います.例えば、私にはtest 1:newというimagesがあります.
docker run --privileged -d --name="test1" test1:new /usr/sbin/sshd -D
13、ファイアウォールの調整
新しいコンテナipを覚え、最初のバックアップのファイアウォールポリシーに従って変更します.
心得:
コンテナがデフォルトの10 g空間を使用している場合、移行に問題はありませんが、デフォルトの10 g空間などのコンテナが動的に拡張されている場合、30 g以上に拡張されている場合は、リカバリコンテナをバックアップするときに、次のエラーが発生します.
[c3c929fe] +job import(-, cocos-play, )
write /var/lib/docker/devicemapper/mnt/19b84c235a7ed914871c0f10b5b17af9fc89955b077ad85afe0ec6e4b253c92b/rootfs/home/www/cocosplay/uploads/neatgame/ah2ssp/r_scene_20.cpk: no space left on device
このエラーはgoogleで2つの方法で解決されていますが、私はテストしましたが、解決していません.
1つ目の方法は物理メモリが不足していること、2つ目の方法はdockerテンポラリディレクトリを使用することです.
詳細issueリファレンスhttps://github.com/coreos/coreos-vagrant/issues/49
コンテナのディスク領域を動的に拡張しないで、できるだけvolumeを使ってマウントすることをお勧めします.
また1.3以上は容器を動的に拡張することができず、公式にissueを提出しても誰も答えていません.住所はhttps://github.com/docker/docker/issues/11153