【docker】マウントするときに知らないとまずい注意点と余談

dockerが人気だ。

そんなdockerにはコンテナを作成するときに便利なコマンドがある。
それが「-v (–volume)」。

普通コンテナ内で作成したファイルは、コンテナを削除した時点で消えてしまう。
しかしこの-vオプションを使うと、ホスト上の任意のディレクトリをコンテナと共有できる。

コンテナ作成時にマウント先として指定したコンテナ内の
任意のディレクトリにディレクトリ・ファイルを置けば、
そのディレクトリ・ファイルはコンテナを消してもホスト内に残る。

そんな便利な-vオプションであるが、注意点があるので紹介する。

注意点:マウント先のコンテナ内ディレクトリはマウント元ディレクトリで上書きされる。

マウントされるコンテナ側のディレクトリはマウントするホスト側のディレクトリで”上書き”されてコンテナが作成される。
コンテナ内の重要なファイルやディレクトリが存在するディレクトリをマウント先に指定してはならない。

実行例は以下

# ubuntuコンテナを作成してコンソールを起動
username@hostname:~$ docker run -it ubuntu:latest /bin/bash
# /var/logの中を確認してみると複数のファイルやディレクトリがある。
root@82e3e4047971:/# ls /var/log/
alternatives.log  bootstrap.log  dpkg.log  lastlog   wtmp
apt               btmp           faillog   tallylog
# コンテナを抜ける
root@82e3e4047971:/# exit
# ホストに空のディレクトリ/tmp/irukaがある
username@hostname:~$ ls /tmp/iruka
# /tmp/irukaを、先ほど複数のファイルやディレクトリが存在することが確認できた/var/logにマウント
username@hostname:~$ docker run -v /tmp/iruka:/var/log -it ubuntu:latest /bin/bash
# /var/log/内を確認してみるが何も無い←ホストの/tmp/iruka/で上書きされたため
root@d6a41462b745:/# ls /var/log/
root@d6a41462b745:/# exit
username@hostname:~$

知ってると便利なこと

余談だが、マウント元もしくは先として指定したディレクトリが存在しない場合は、
エラーにはならず、新たにそのディレクトリが作成される。

# ホストの/tmp/dolphin/ディレクトリ内に何もないことを確認
username@hostname:~$ ls /tmp/dolphin/
# ubuntuコンテナを作成
username@hostname:~$ docker run -v /tmp/dolphin/iruka:/tmp/shachi --rm -it ubuntu:latest /bin/bash
## 以下はコンテナ内
# /tmpディレクトリの下にもともとイメージ内に存在していないshachiディレクトリができていることを確認
root@8623a289cfdf:/# ls /tmp/
shachi
root@8623a289cfdf:/# exit
## 以下はホスト内
# もともとは何もなかった/tmp/dolphin/内にirukaディレクトリが出来上がっていることを確認
sername@hostname:~$ ls /tmp/dolphin/
iruka
username@hostname:~$

このような仕様になっているため、
あえてディレクトリ作ってからマウントさせる必要はない。

まとめ

以上。

Dockerは多くのところで使われている技術。

使い方は知っているけど、この記事で紹介したような細かな知識を持っていないエンジニアは多い。
マニアックだけど持っていると便利な知識をどんどん身につけ、
周りのエンジニアと差をつけよう!