概要

私がdocker-composeで、Dockerのコンテナを複数起動しようした際に、「Updating permissions…」と表示されたままかなりの時間が経ち、起動できないということがありました。

色々と調べながらこれを解決したのでその解決方法を紹介します。

環境

  • Ubuntu
  • Docker CE

原因

そもそもの原因は、ホストのファイルをDockerと共有するときにファイルの権限(permission)を変更しているので、その権限の変更に時間がかかっているということです。

なので、変更するファイルが少なければこの処理に時間がかかることもないのですが、私の場合ファイルを減らすことはできないので、別の方法で解決する方法があります。

調べてみると、Dockerの利用しているストレージドライバに問題があるということが分かりました。

解決方法

Dockerでは、デフォルトのストレージドライバとして、「OverlayFS」というものを使用しています。

このOverlayFSは、一部の環境ではパフォーマンスが悪く書き込みに時間がかかリます。

実際に私がDockerを使っていたUbuntuでは、書き込みに時間がかかるという事が報告されています。

そこで、Ubuntuでは「AUFS」というストレージドライバを使う事でパフォーマンスがよくなるという事が報告されているようなので、それを使用するように変更します。

ちなみに、Dockerの古いバージョンではAUFSの方が標準で使われていたのですが、次で説明するようにDockerとは別にインストールする必要があるということもあり、現在は標準で使えるOverlayFSが使われています(古いバージョンではインストール時にAUFSを使えるようにしていたようです)。

現在のストレージドライバ

Dockerの現在のストレージドライバを知るには、次のコマンドを実行します。

docker info

そうすると、Storage Driver:という項目があるはずなので、そこに現在のストレージドライバが表示されます。

OverlayFSの場合、「overlay」または「overlay2」と、表示されると思います。

ストレージドライバの変更

では、ストレージドライバの変更をしましょう。

AUFSを使うには、LinuxカーネルがAUFSを使えるようにする必要があります。それは次のコマンドでできます。

sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual

次に、AUFSのモジュールを読み込むようにします。

sudo modprobe aufs

DockerでAUFSを使うように/etc/docker/daemon.jsonに次の内容を書きます。

{
  "storage-driver": "aufs"
}

最後に、LinuxカーネルからAUFSのモジュールを読み込むように変更したので、システムの再起動をします。

実際にストレージドライバが変更されたかは、docker infoを実行して確認しましょう。

まとめ

最初は、ストレージドライバを変えるだけでこの問題が解決するとは思っていなかったのですが、本当に解決しました。

CentOSではAUFSよりOverlayFSの方がよいという書き込みを見たので、ストレージドライバ周りは面倒に見えます。