🐳

Dockerコンテナとホスト間のファイル共有・バックアップガイド

に公開

dockerのファイル共有やマウントに関しての備忘録メモです。
(ホスト側 /Users/user-name/ 部分は適宜自身の環境に変更下さい)

目次

1. コンテナとホスト間でファイルをコピーする

  • 単発ファイル・フォルダなら簡単に docker cp で直接コピー可能
  • 双方向対応(ホスト→コンテナ、コンテナ→ホスト)
  • ボリューム全体コピーは整合性の問題があるため別手段が必要

2. バインドマウント

  • ホストのディレクトリをコンテナ内へ直接マウント
  • ホスト側を編集すると即コンテナ側に反映
  • 開発用途に最適だが、本番では権限・セキュリティ管理が必要

3. ボリュームマウント

  • Docker管理の専用領域をマウントしてデータ永続化
  • コンテナ削除後もデータ保持
  • ホストファイルシステムのパスを意識せずに管理可能

4. ボリュームマウントでのバックアップ

  • ボリュームを一時コンテナ経由でtarなどにまとめてバックアップ
  • 整合性を保ちつつ全体をアーカイブ
  • 復元もtar展開で容易に対応可能

5. ボリュームマウントでのバックアップ確認

  • 一時コンテナ経由でボリュームをtarアーカイブ化しバックアップ
  • --rmオプションなしでコンテナに入ってディレクトリ構造やファイル内容を実際に確認可能
  • 受取先・出力先ディレクトリをlsで確認、tar tvf/xzOfでアーカイブ内容を詳細にチェック

1. コンテナとホスト間でファイルをコピーする

1-1. ホストからコンテナへコピー

1-2. Apacheコンテナ作成

docker run --name apache-ex -d -p 8089:80 httpd

1-3. ホストにコピー元ファイル作成

echo "<h1>localhost-between-container-hosts-copy<h1>" > index.html

1-4. ホストからコンテナへファイルをコピー

docker cp /Users/user-name/between-container-hosts-copy/index.html apache-ex:/usr/local/apache2/htdocs/
# docker cp [ホスト内コピー元ファイルパス] [コンテナ内コピー先ファイルパス]

1-5. コンテナにコピーされたファイルの中身を確認

docker exec -it apache-ex bash -c "cat /usr/local/apache2/htdocs/index.html"
# この後「コンテナからホストへコピー」でも同じコンテナを利用するので停止/削除しない

1-6. コンテナからホストへコピー

1-7.コンテナ側にコピー元ファイルを新規作成

docker exec -it apache-ex bash -c 'cd htdocs && echo "<h1>container-between-container-hosts-copy<h1>" > index2.html'

1-8.コンテナ側コピー元ファイルを確認

docker exec -it apache-ex bash -c "cat /usr/local/apache2/htdocs/index2.html"

1-9.コンテナからホストへコピー

docker cp apache-ex:/usr/local/apache2/htdocs/index2.html /Users/user-name/between-container-hosts-copy/
# docker cp [コンテナ内コピー元ファイルパス] [ホスト内コピー先ファイルパス]

1-10.コンテナ停止+削除

docker stop apache-ex
docker rm apache-ex

2. バインドマウント

2-1. ホスト側マウント対象フォルダ作成

mkdir apa_folder

2-2. apacheコンテナ起動

docker run --name apache-bind-ex -d -p 8090:80 -v /Users/user-name/between-container-hosts-copy/apa_folder:/usr/local/apache2/htdocs httpd
docker run --name apache-bind-ex -d -p 8090:80 -v [ホスト内マウント対象ディレクトリパス] [コンテナ内マウント対象ディレクトリパス]

2-3. ブラウザ確認

default表示は「Index of /」

2-4. ホスト内マウント対象ディレクトリ内にindex.htmlを作成、ブラウザが更新されるか確認

echo "<h1>bind-mount</h1>" > ./apa_folder/index.html

2-5. コンテナ側マウント対象ディレクトリを確認

docker exec -it apache-bind-ex bash -c "cat /usr/local/apache2/htdocs/index.html"

2-6. コンテナ停止+削除

docker stop apache-bind-ex
docker rm apache-bind-ex

3. ボリュームマウント

3-1. ボリューム作成

docker volume create apache-vmount-vol

3-2. apacheコンテナ起動 + ボリュームマウント

docker run --name apache-vmount-ex -d -p 8091:80 -v apache-vmount-vol:/usr/local/apache2/htdocs httpd

3-3. ホスト側ボリューム確認

docker volume inspect apache-vmount-vol

3-4. コンテナ側マウント確認

docker container inspect apache-vmount-ex

3-5. コンテナ停止+削除

docker stop apache-vmount-ex
docker rm apache-vmount-ex

3-6. ボリューム削除

docker volume rm apache-vmount-vol

4. ボリュームマウントでのバックアップ

4-1. ボリューム作成

docker volume create apache-vol

4-2. コンテナA稼働

docker run --name apache-ex -d -p 8091:80 -v apache-vol:/usr/local/apache2/htdocs httpd

4-3. 一時コンテナ経由でtarバックアップ

docker run --rm \
  -v apache-vol:/mount \
  -v /Users/user-name/between-container-hosts-copy:/bind \
  busybox tar czvf /bind/backup_apache.tar.gz -C /mount .

# 汎用フォーマット
docker run --rm \
  -v [ボリューム名]:[コンテナ内ボリュームマウント先パス] \
  -v [ホスト側バックアップ保存先パス]:[コンテナ内バインドマウント先パス] \
  busybox tar czvf [アーカイブ出力ファイルパス] -C [アーカイブするディレクトリ] .

5. ボリュームマウントでのバックアップ確認

以下ボリュームマウント確認用です。
上記では--rmで実行後即削除しているため実際のディレクトリなど確認できないため。

5-1. ボリュームマウント時コンテナ接続

docker run -it --name apache-check-ex -v apache-vol:/mount -v /Users/user-name/between-container-hosts-copy:/bind busybox sh

5-2. コンテナ内ボリュームマウント先dir表示

ls ./mount/
# index.html

5-3. コンテナ内バインドマウント先dir表示

ls ./bind/
# backup_apache.tar.gz

5-4. コンテナ内バインドマウント先tarファイル内容確認

tar tvf ./bind/backup_apache.tar.gz
# -rw-r--r-- 501/root        45 2007-06-11 18:53:14 ./index.html

5-5. コンテナ内バインドマウント先tarファイル内indexの中身を表示

tar xzOf ./bind/backup_apache.tar.gz ./index.html
# <html><body><h1>It works!</h1></body></html>

5-6. ローカルでtarファイル内indexの中身を表示

tar xzOf ./backup_apache.tar.gz ./index.html
# <html><body><h1>It works!</h1></body></html>

5-7. コンテナ停止+削除

docker stop apache-check-ex
docker rm apache-check-ex

5-8. ボリューム削除

docker volume rm apache-vol

イメージ、コンテナ、ボリュームなど不要になったものは随時停止+削除してください

まとめ

  • docker cp:単発ファイルのコピーに最適
  • バインドマウント:開発向け、ホスト編集即反映
  • ボリュームマウント:本番向け、永続データ管理
  • ボリュームバックアップ:一時コンテナ+tarで全体を安全に保存

Discussion