LoginSignup
44
46

More than 5 years have passed since last update.

Dockerの/var/lib/dockerを移動する

Posted at

今使っているクラウドのルートディスクが15GBしかないのでDocker Composeで複数のコンテナを起動して開発しているとすぐに容量不足になります。開発中はよくゴミが出るので定期的に/var/lib/dockerは再作成していますが、もう少し大きなディスクを追加して移動しようと思います。最初は/etc/fstabの記述を間違えてリカバリーモードで起動することになりました。しかもrootのパスワードを忘れてしまいシングルモードで起動する必要があったりと、作業には十分注意が必要です。

以下のサイトを参考にしました。最初に読んでいたサイトはmountのbindオプションの使い方が間違っていて混乱してしまいました。

環境のバージョン

最初に作業環境のDockerやOSのバージョンを確認します。

Dockerのバージョン

$ docker version
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 7c8fca2
OS/Arch (client): linux/amd64
Server version: 1.6.2
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): 7c8fca2
OS/Arch (server): linux/amd64

カーネル

$ cat /proc/version
Linux version 3.13.0-33-generic (buildd@tipua) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #58-Ubuntu SMP Tue Jul 29 16:45:05 UTC 2014

Ubuntu 14.04.2

$ cat /etc/lsb-release
NAME="Ubuntu"
VERSION="14.04.2 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.2 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

ディスクの追加

作業前のディスクの使用状況です。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        15G  4.1G  9.9G  29% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            2.0G  4.0K  2.0G   1% /dev
tmpfs           395M  816K  394M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G  476K  2.0G   1% /run/shm
none            100M     0  100M   0% /run/user

40GBのディスクを追加した状態です。今回はクラウド上ですがfdiskでデバイスが認識されたことがわかります。まだパーティションありません。

$ sudo fdisk -l

Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders, total 31457280 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000db9c4

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    31455231    15726592   83  Linux

Disk /dev/sdb: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders, total 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

パーティションの作成

fdiskでパーティションを作成します。コマンドとしてはn、p、[Enter]x3回、wをキーを入力します。

$ sudo fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xef0c9f8a.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-83886079, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-83886079, default 83886079):
Using default value 83886079

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

パーティション作成の確認をします。/dev/sdb1が作成されました。

$ sudo fdisk -l


Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders, total 31457280 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000db9c4

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    31455231    15726592   83  Linux

Disk /dev/sdb: 42.9 GB, 42949672960 bytes
171 heads, 5 sectors/track, 98112 cylinders, total 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xef0c9f8a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    83886079    41942016   83  Linux

ファイルシステムの作成

既存ファイルシステムはext4なので同じタイプで作成します。

$ df -T
Filesystem     Type     1K-blocks    Used Available Use% Mounted on
/dev/sda1      ext4      15348720 4212380  10333628  29% /
none           tmpfs            4       0         4   0% /sys/fs/cgroup
udev           devtmpfs   2009748       4   2009744   1% /dev
tmpfs          tmpfs       404100     820    403280   1% /run
none           tmpfs         5120       0      5120   0% /run/lock
none           tmpfs      2020484     476   2020008   1% /run/shm
none           tmpfs       102400       0    102400   0% /run/user

ext4のファイルシステムを作成します。

$ sudo mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
2621440 inodes, 10485504 blocks
524275 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
320 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

パーティションのマウント

新しくパーティションをマウントしてDockerの/var/lib/dockerを移動していきます。まずDockerを停止します。

$ sudo service docker stop
docker stop/waiting

パーティションをマウントするディレクトリを作成します。Ubuntuは/mediaに作ることが多いです。

$ sudo mkdir /media/data

/etc/fstabの編集は危険なので必ずパックアップをとります。

$ sudo cp -ip /etc/fstab{,.`date +%Y%m%d`}

パーティションの UUID をblkidコマンドで確認します。

$ sudo  blkid | grep sdb1
/dev/sdb1: UUID="d45eaaab-e223-4162-96b3-fefea9392cad" TYPE="ext4"}}}

/etc/fstabに新しいパーティションのUUIDを追加します。

/etc/fstab
UUID=ed7bdb81-136d-458b-8121-2c4e5d3f569f /               ext4    errors=remount-ro 0       1
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0

UUID=d45eaaab-e223-4162-96b3-fefea9392cad /media/data ext4 defaults 0  2

いつも忘れるのですが、4,5,6列目は以下のように設定しました。

  • 4列目: デフォルト
  • 5列目: 0: dumpする
  • 6列目: 2: fsckする

/etc/fstabの設定を再マウントします。

$ sudo mount -a

/dev/sdb1のデバイスがマウントされました。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        15G  4.1G  9.9G  29% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            2.0G  8.0K  2.0G   1% /dev
tmpfs           395M  792K  394M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/sdb1        40G   48M   38G   1% /media/data

/var/lib/dockerの移動

rsyncでディレクトリをコピー

rsync/var/lib/dockerのファイルを新しいディレクトリにコピーします。

$ sudo mkdir /media/data/docker
$ sudo rsync -aXS /var/lib/docker/. /media/data/docker/

rsyncが終了して、/var/lib/docker/media/data/docker/が同じ内容になりました。

$ sudo du -sch /var/lib/docker/*
2.1G    /var/lib/docker/aufs
140K    /var/lib/docker/containers
808K    /var/lib/docker/graph
15M /var/lib/docker/init
12K /var/lib/docker/linkgraph.db
4.0K    /var/lib/docker/repositories-aufs
4.0K    /var/lib/docker/tmp
8.0K    /var/lib/docker/trust
44K /var/lib/docker/volumes
2.2G    total
$ sudo du -sch /media/data/docker/*
2.1G    /media/data/docker/aufs
140K    /media/data/docker/containers
808K    /media/data/docker/graph
15M /media/data/docker/init
12K /media/data/docker/linkgraph.db
4.0K    /media/data/docker/repositories-aufs
4.0K    /media/data/docker/tmp
8.0K    /media/data/docker/trust
44K /media/data/docker/volumes
2.1G    total

ディレクトリのマウント

オリジナルの/var/lib/dockerを念のためリネームしてバックアップします。その後ディレクトリを空にして作り直します。

$ sudo mv /var/lib/docker /var/lib/docker.bak
$ sudo mkdir /var/lib/docker

/var/lib/dockerは空のディレクトリの状態です。

$ ls /media/data/docker/
aufs        graph  linkgraph.db       tmp    volumes
containers  init   repositories-aufs  trust
$ ls /var/lib/docker

/media/data/docker/var/lib/dockerにbindオプションを付けてマウントします。BINDオプションでのmountに詳しく解説してくれています。mountのbindオプションを使うと任意のディレクトリを独自のファイルシステムとしてアタッチすることができます。ディレクトリのあるデバイスのパーティションがマウントされている必要があります。

$ sudo mount -o bind  /media/data/docker /var/lib/docker
$ sudo du -sch /var/lib/docker/*
2.1G    /var/lib/docker/aufs
140K    /var/lib/docker/containers
808K    /var/lib/docker/graph
15M /var/lib/docker/init
12K /var/lib/docker/linkgraph.db
4.0K    /var/lib/docker/repositories-aufs
4.0K    /var/lib/docker/tmp
8.0K    /var/lib/docker/trust
44K /var/lib/docker/volumes
2.1G    total

/media/data/dockerディレクトリが/var/lib/dockerにマウントされました。最初はこれをfstabに逆で書いてしてしまい起動しなくなってしまいました。

$ df -ha
Filesystem       Size  Used Avail Use% Mounted on
/dev/sda1            15G  4.1G  9.9G  29% /
...
/dev/sdb1            40G  2.2G   36G   6% /media/data
/media/data/docker   40G  2.2G   36G   6% /var/lib/docker

/etc/fstabを編集して再起動後も有効にします。

/etc/fstab
/media/data/docker /var/lib/docker  none bind 0 0

mountをリロードします。

$ sudo mount -a

移動先からDockerを起動して確認

aufsだけ古いディレクトリで増加してしまう

Dockerを起動します。

$ sudo service docker start
docker start/running, process 4276

/var/lib/docker/aufsだけ4.3Gに増加してしまいました。 /media/data/docker/aufsは変化していません。aufsは以前の場所のままのようです。この状態で新しいイメージをdocker pullしても/var/lib/dockerは増加しません。

$ sudo du -sch /var/lib/docker/*
4.3G    /var/lib/docker/aufs
168K    /var/lib/docker/containers
808K    /var/lib/docker/graph
15M /var/lib/docker/init
12K /var/lib/docker/linkgraph.db
4.0K    /var/lib/docker/repositories-aufs
4.0K    /var/lib/docker/tmp
8.0K    /var/lib/docker/trust
44K /var/lib/docker/volumes
4.3G    total
$ sudo du -sch /media/data/docker/*
2.1G    /media/data/docker/aufs
168K    /media/data/docker/containers
808K    /media/data/docker/graph
15M /media/data/docker/init
12K /media/data/docker/linkgraph.db
4.0K    /media/data/docker/repositories-aufs
4.0K    /media/data/docker/tmp
8.0K    /media/data/docker/trust
44K /media/data/docker/volumes
2.1G    total

aufsが増えた原因は、docker-compose.ymlのサービスをrestart: alwaysにしているのでDockerの起動時に開始したためです。すでに作成済みのコンテナはmountのbindオプションだけではうまく移動できないみたいです。

$ docker-compose ps
      Name             Command             State              Ports
-------------------------------------------------------------------------
meshblucompose_m   npm start          Up                 0.0.0.0:1883->18
eshblu_1                                                 83/tcp, 9000/tcp
meshblucompose_m   /entrypoint.sh     Up                 27017/tcp
ongo_1             mongod
meshblucompose_o   nginx -c /etc/ng   Up
penresty_run_1     inx/nginx. ...
meshblucompose_r   /entrypoint.sh     Up                 6379/tcp
edis_1             redis-server

DOCKER_OPTSに追加する

Dockerのオプションに新しい/var/lib/dockerのディレクトリを指定する必要がありました。Dockerを停止してから設定ファイルに追記します。

/etc/default/docker
DOCKER_OPTS="-g /media/data/docker"

Dockerを起動します。

$ sudo service docker start
docker start/running, process 5786

ようやく/var/lib/dockerが増加せず、/media/data/docker/のディレクトリのaufsが増加しました。/var/lib/dockerの移動ができました。

$ sudo du -sch /var/lib/docker/*
2.1G    /var/lib/docker/aufs
180K    /var/lib/docker/containers
808K    /var/lib/docker/graph
15M /var/lib/docker/init
12K /var/lib/docker/linkgraph.db
4.0K    /var/lib/docker/repositories-aufs
4.0K    /var/lib/docker/tmp
8.0K    /var/lib/docker/trust
44K /var/lib/docker/volumes
2.1G    total
$ sudo du -sch /media/data/docker/*
4.3G    /media/data/docker/aufs
180K    /media/data/docker/containers
808K    /media/data/docker/graph
15M /media/data/docker/init
12K /media/data/docker/linkgraph.db
4.0K    /media/data/docker/repositories-aufs
4.0K    /media/data/docker/tmp
8.0K    /media/data/docker/trust
44K /media/data/docker/volumes
4.3G    total
44
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
46