ホストとコンテナでディレクトリを共有する

コンテナを作成するときに、コンテナのディレクトリをホストと共有することが出来るそうです。

コンテナに永続データを保存するのはオススメされていないらしいので、基本的にはホストとハードディスクを共有する形などを取る。

目次

  1. 概要
    1. データ・ボリューム (data volume)
    2. コンテナ削除時の注意
  2. 実行
    1. 場所を指定する
    2. 確認

概要

データ・ボリューム(data volume)

ホストのディスクと共有することをデータボリュームというらしい。

データ・ボリュームで作成されたボリュームはコンテナを削除をしたとしても残り続けるメリットがあるそうです。逆にボリュームを使わずにコンテナ内に作られたファイルはコンテナ削除時に一緒に消えてしまうので気を付ける(; ・`д・´)

そのため、MySQLのデータやソースコードなどはデータ・ボリュームで共有したディレクトリに配置させておいた方が良い。

下記は公式からの抜粋になります。

データ・ボリューム (data volume) とは、1つまたは複数のコンテナ内で、特別に設計されたディレクトリであり、 ユニオン・ファイルシステム (Union File System) をバイパス(迂回)するものです。データ・ボリュームは、データの保持や共有のために、複数の便利な機能を提供します。
ボリュームはコンテナ作成時に初期化されます。コンテナのベース・イメージ上で、特定のマウント・ポイント上のデータが指定されている場合、初期化されたボリューム上に既存のデータをコピーします。
データ・ボリュームはコンテナ間で共有・再利用できます。
データ・ボリュームに対する変更を直接行えます。
イメージを更新しても、データ・ボリューム上には影響ありません。
コンテナ自身を削除しても、データ・ボリュームは残り続けます。
データ・ボリュームは、データ保持のために設計されており、コンテナのライフサイクルとは独立しています。そのため、コンテナの削除時、Docker は 決して 自動的にボリュームを消さないだけでなく、コンテナから参照されなくなっても”後片付け”をせず、ボリュームはそのままです。

http://docs.docker.jp/v1.10/engine/userguide/containers/dockervolumes.html

コンテナ削除時の注意

コンテナ削除時、-v オプションでボリュームを消そうとしなくても、Docker は何ら警告を表示しません。コンテナを -v オプションに使わず削除してしまうと、最終的にボリュームは、どのコンテナからも参照されない “宙づり”(dangling) ボリュームになってしまいます。宙づりボリュームは除去が大変であり、多くのディスク容量を使用する場合もあります。このボリューム管理の改善については、現在 プルリクエスト#14214 において議論中です。

http://docs.docker.jp/v1.10/engine/userguide/containers/dockervolumes.html?highlight=%E6%B0%B8%E7%B6%9A

実行

データボリュームの場所を指定する

データボリュームを利用する場合には-vオプションを利用します。

-v ホストのパス:コンテナ内のパス

#作業ディレクトリ作成
mkdir -p /tmp/data-volume

#作業ディレクトリへ移動
cd /tmp/data-volume/

#マウントするディレクトリとファイルを作成
mkdir -p source
#空ファイル作成
touch source/test.txt

#コンテナ作成。データボリュームとして直下のディレクトリにホストの/tmp/と
#コンテナ内の/tmp/testをマウントする
sudo docker run -it -d \
--name centos7 \
-v /tmp/data-volume/source:/tmp/test \
centos:centos7

現在の位置にマウントする場合にはpwdコマンドを利用すると楽になる。
下記は同じ意味合いになる

sudo docker run -it -d \
--name centos7 \
-v `pwd`/source:/tmp/test \
centos:centos7

確認

作成したコンテナに正しくマウントされているか確認します。

#コンテナ起動の確認
sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e88d2d592450        centos:centos7      "/bin/bash"         7 minutes ago       Up 7 minutes                            centos7

#コンテナへ接続
sudo docker exec -it centos7 bash

#ホスト側で作成したファイルがあるか確認
ls -alt /tmp/test/
total 8
drwxrwxrwt 1 root root  4096 Aug 23 02:31 ..
drwxr-xr-x 2 1001 users 4096 Aug 23 02:30 .
-rw-r--r-- 1 1001 users    0 Aug 23 02:30 test.txt

キタ━━━━(゚∀゚)━━━━!!

当たり前ですがデータボリュームで指定されたディレクトリ内にファイルを作ったり、内容を変更したりするとリアルタイムでコンテナ内にも反映されています(´・∀・`)ヘー

#ファイルの中身を出力
cat source/test.txt

#aaaを書き込む
echo "aaa" > source/test.txt

#test2.txtファイルを作成してbbbを書き込む
echo "bbb" > source/test2.txt

#コンテナへ接続
sudo docker exec -it centos7 bash

#マウントされているディレクトリを確認
ls -alt /tmp/test/
total 16
drwxr-xr-x 2 1001 users 4096 Aug 23 02:53 .
-rw-r--r-- 1 1001 users    4 Aug 23 02:53 test2.txt
-rw-r--r-- 1 1001 users    4 Aug 23 02:52 test.txt
drwxrwxrwt 1 root root  4096 Aug 23 02:31 ..

#test.txtの中身を出力
cat /tmp/test/test.txt
aaa

#test2.txtの中身を出力
cat /tmp/test/test2.txt
bbb

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です