データボリュームコンテナ
ボリュームマウントの方法の1つとして
「マウント用に【データボリュームコンテナ】を作成する」
というものがあります。
データボリューム自体は外部から直接アクセスできないという特徴がありますが、
データボリュームコンテナを作成することで間接的にアクセスすることができます。
データボリュームはそのコンテナ特有のデータを扱う場合に使い、データボリュームコンテナは複数のコンテナから参照されるデータを収める場合に使うとよい、とされているようです。
データボリュームコンテナとして使用するイメージは任意ですが、
「busybox
(標準UNIXコマンドの主要なものをまとめて1つの実行ファイル化した、軽量なツール)」
がよいとされています。
データボリュームコンテナの作成
以下のコマンドで、データボリュームコンテナを作成します。
docker run -it -v /usr/local/apache2/htdocs --name datavol busybox
DockerリポジトリからイメージをPullする記述を省略していますが、所有していないイメージをRunしようとした場合、自動的にPull→Runと動いてくれます。
vオプションで、busyboxの
「/usr/local/apache2/htdocs」ディレクトリをボリュームマウント指定しています。
(ホスト上の実体は「/var/lib/docker/volumes/[ボリュームID]/_data」となります)
このマウントのパスはhttpdコンテナで使用するリソースを共有する想定としています。
次に、busyboxのマウントのパス上に、複数コンテナで共有したいリソースとしてindex.htmlを作成しておきます。(以下はbusybox内部での実行コマンド)
# cd /usr/local/apache2/htdocs
# touch index.html
# vi index.html
<html><body><h1>volume-mount of busybox!</h1></body></html>
ファイルの作成が終わったら、「exit」でbusyboxコンテナから抜け出します。
作成した「datavol」コンテナをボリュームコンテナとしてマウントする別コンテナを起動します。「--volumes-from [ボリュームコンテナ名]」としてオプション指定します。
docker run -d -p 8080:80 --volumes-from datavol --name=httpd_datavol httpd
ブラウザで「http://localhost:8080」を確認すると、編集したindex.htmlの内容が表示されていると思います。ボリュームコンテナをマウントできていることが確認できました。
※ボリュームコンテナを別コンテナからマウントする際、ボリュームコンテナ自体は起動している必要はありません。ステータスが「Stop」であっても、他コンテナからのマウントは実行できます。
さらに別のコンテナからも、ボリュームコンテナをマウントして起動してみます。
一度「httpd_datavol」コンテナは停止し、「httpd_datavol2」という別のコンテナとして起動してみます。
docker stop httpd_datavol docker run -d -p 8080:80 --volumes-from datavol --name=httpd_datavol2 httpd
こちらでも、ブラウザで「volume-mount of busybox!」が表示できていることを確認できました。
では、この状態から、データボリュームコンテナのindex.htmlを編集してみます。データボリュームコンテナをStartで起動し、Attachで中に入ります。
docker start datavol docker attach datavol # vi /usr/local/apache2/htdocs/index.html
index.htmlを以下の様に編集してみました。
<html><body><h1>volume-mount of busybox!</h1>
<ul><li>using httpd_datavol container</li>
<li>using httpd_datavol2 container</li></ul>
</body></html>
exitでコンテナから抜け、ブラウザをリロードしてみます。以下の様に表示されていることが確認できると思います。
volume-mount of busybox! •using httpd_datavol container •using httpd_datavol2 container
今回の様に例えば
「開発したリソースのデプロイ先にはデータボリュームコンテナを指定し、個別のコンテナはそのデータボリュームコンテナをマウントする」
という構成にすることで、デプロイの省力化・デプロイ漏れの防止といったメリットを受けることができます。
ボリュームのバックアップとリストア
ボリュームのバックアップとリストアの方法についても見ていきます。
仕組みとしては
「データボリュームコンテナをマウントしたバックアップ/リストア用のコンテナを作成し、そのコンテナ上からマウントしたデータの圧縮/解凍を行う」
というものになります。
まず任意のバックアップ保管場所(今回はユーザーディレクトリ直下に「docker_bkup」ディレクトリを用意しました)をカレントとして、以下コマンド実行してバックアップファイルを作成します。
docker run --name datavol_bkup --volumes-from datavol -v $(pwd):/backup busybox tar cvf /backup/backup.tar /usr/local/apache2/htdocs
各パラメータの説明は以下となります。
--name datavol_bkup:バックアップ作業用コンテナの名称(任意)
--volumes-from datavol:バックアップ対象のデータボリュームコンテナ名
-v $(pwd):/backup:ホストのカレント「$(pwd)」と、データボリュームコンテナの「/backup」をマウント
busybox:バックアップ作業用コンテナのイメージ
tar cvf /backup/backup.tar /usr/local/apache2/htdocs:リソースを圧縮しバックアップファイルを生成します
これで、マウント先の「ホストのカレント」上に「backup.tar」が生成されます。
続けて、データボリュームコンテナ側のデータを破棄してみます。以下操作でindex.htmlを削除しました。
docker start datavol docker attach datavol rm /usr/local/apache2/htdocs/index.html
削除完了したら、先ほどのバックアップからの復元を試みてみます。
docker run --name datavol_restore --volumes-from datavol -v $(pwd):/backup busybox tar xvf /backup/backup.tar
各パラメータの説明は以下となります。
--name datavol_restore:リストア作業用コンテナの名称(任意)
--volumes-from datavol:バックアップ対象のデータボリュームコンテナ名
-v $(pwd):/backup:ホストのカレント「$(pwd)」と、データボリュームコンテナの「/backup」をマウント
busybox:バックアップ作業用コンテナのイメージ
tar xvf /backup/backup.tar:バックアップファイルを解凍します
ホスト上でバックアップからファイルが復元され、データボリュームコンテナはその復元ファイルをマウントしています。
これにより、ブラウザ上の表示をバックアップ時点の内容に戻すことができました。
今回はボリュームコンテナの使い方と、ボリュームのバックアップ・リストア方法を確認しました。
次回はDockerComposeについて触れていきたいと思います。
株式会社 パブリックリレーションズ 〒064-0807 北海道札幌市中央区南7条西1丁目13番地 弘安ビル5階 011-520-1800 011-520-1802