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

2019年9月3日

当サイトはPR広告を利用しています。

Dockerコンテナを作成するときに便利なオプションがあります。
それが"-v"。

普通コンテナ内で作成したファイルは、コンテナを削除すると同時に消えてしまいます。
しかしこの-vオプションを使うと、ホスト上の任意のディレクトリやファイルをコンテナと共有でき、コンテナ作成時にマウント先として指定したコンテナ内のディレクトリにディレクトリやファイルを置けば、そのディレクトリとファイルはコンテナを消してもホスト側に残り続けます。

そんな便利な-vオプションですが、使う時には注意が必要な点があるのでご紹介します。

マウント先ディレクトリは上書きされる

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

実際に動作を見てみましょう。

# ubuntuコンテナを作成してコンソールを起動
username@hostname:~$ docker run -it ubuntu:latest /bin/bash

# lsコマンドで/var/logの中を確認。マウントを行わない時には複数のファイルやディレクトリが/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:~$

Tips

ホスト側のマウント元もしくはコンテナ側のマウント先として指定したディレクトリが存在しない場合は、エラーは起きずコンテナ内に新たにディレクトリが作成されます。

# ホストの/tmp/dolphin/ディレクトリ内に何もないことを確認
username@hostname:~$ ls /tmp/dolphin/

# ホストに存在しないフォルダ/tmp/dolphin/irukaをマウント元として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:~$

上記の挙動からマウント元もマウント先もフォルダが存在しない時、以下の順で処理が走っていることが分かります。

  1. ホストにマウント元としているフォルダを中身が空の状態で作成(マウント元フォルダが存在しない場合)
  2. コンテナを作成
  3. コンテナ内のマウント先ディレクトリを作成
  4. ホストのマウント元ディレクトリをコンテナのマウント先ディレクトリにマウント

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

まとめ

dockerはどんどん利用されることが増えてきている技術です。

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

あると嬉しい中上級者向けDockerのバイブル↓

直近でおすすめの本

直近十数冊読んだ中で一番おすすめの本です。

ビジネスデザイナーという肩書きを持つイノベーションシンキングの世界的第一人者である濱口秀司さんの書かれた本です。肩書きだけだとどのようなことをしている人か分かりにくいかもしれませんが、USBメモリやマイナスイオンドライヤーなど誰もが知る有名商品の産みの親の方です。

アメリカのコンサルタントの中でも最高額のコンサルティングフィーを受け取っている方で、私の友人から聞いた話だとこの人のコンサルティングを受けるためには1時間でも7桁の額は準備する必要があるとのことでした。

濱口秀司さんは自分の中でイノベーションを起こすための型を持っており、その型について本の中でかなり詳しく教えてくれています。革新的なアイデアを出す方法をここで詳細にはお伝えしませんが、とてもざっくりとまとめると以下の手順になります。

バイアスの特定→バイアスの破壊

革新とは現状の破壊です。現在世の中にあるバイアスを認知するところからアイデアの創出は始まります。この本ではバイアスを認知する方法、そして破壊する方法を詳しく述べてくれています。個人開発をしようとしているけど何を作れば良いか思い浮かばない方やや会社を立ち上げようとしている方に特におすすめの本です。

過去におすすめした本は以下の記事にまとめています。

Docker

Posted by ラプラス