Docker コンテナからホストへのファイルコピー:コード例解説
Docker コンテナからホストへのファイルコピー
Docker コンテナは、アプリケーションとその依存関係をパッケージ化した独立した実行環境です。このため、コンテナ内外のファイルのやり取りが必要になることがあります。
コマンド
Docker コンテナからホストへファイルをコピーするには、以下のコマンドを使用します:
docker cp コンテナ名:コンテナ内パス ホスト上のパス
- コンテナ名: コピー元のコンテナの名前または ID
- コンテナ内パス: コンテナ内のファイルまたはディレクトリのパス
- ホスト上のパス: コピー先のホスト上のパス
例
docker cp my_container:/app/data/output.txt /path/to/host/directory
このコマンドは、コンテナ my_container
内の /app/data
ディレクトリにある output.txt
ファイルを、ホストの /path/to/host/directory
ディレクトリにコピーします。
注意事項
- コンテナが実行中の状態でコピーする必要があります。
- ファイルパーミッションが変更される可能性があります。
- 大量のデータをコピーする場合、時間がかかることがあります。
- ボリュームマウント: ホストのディレクトリをコンテナ内にマウントすることで、ファイルの共有が可能になります。
- コンテナ内からのコピー: コンテナ内で
cp
コマンドを使用して一時ファイルを作成し、その後docker cp
でホストにコピーすることもできます。
- コンテナ内のファイルシステムは、ホストのファイルシステムとは異なるため、直接アクセスすることはできません。
- Docker コンテナは、アプリケーションの分離と移植性を向上させるために使用されます。
コマンド docker cp
の詳細と例
docker cp
コマンドは、Docker コンテナとホスト間でファイルをコピーするためのシンプルな方法です。
基本的な構文:
docker cp コンテナ名:コンテナ内パス ホスト上のパス
例:
docker cp my_running_container:/app/data/results.csv /home/user/data
このコマンドは、以下のことを行います。
my_running_container
: コピー元のコンテナを指定します。/app/data/results.csv
: コンテナ内のコピー元ファイルのパスを指定します。/home/user/data
: ホスト上のコピー先ディレクトリを指定します。- 既に
data
ディレクトリが存在していれば、その中にresults.csv
ファイルが作成されます。 - ディレクトリが存在しない場合は、新しいディレクトリが作成され、その中にファイルがコピーされます。
- 既に
具体的なユースケースと解説
- ログファイルの取得:
コンテナ内のアプリケーションのログファイルdocker cp my_web_app:/var/log/myapp.log /tmp/myapp_logs
myapp.log
を、ホストの/tmp
ディレクトリにmyapp_logs
という名前でコピーします。 - 生成されたファイルのダウンロード:
データ処理コンテナ内で生成されたdocker cp my_data_processing_container:/output/processed_data.zip /home/user/downloads
processed_data.zip
ファイルを、ホストのダウンロードディレクトリにコピーします。 - 設定ファイルの更新:
ホスト上の新しい設定ファイルdocker cp new_config.yaml my_running_container:/etc/myapp/config.yaml
new_config.yaml
を、コンテナ内の既存の設定ファイルに上書きします。
- コンテナの状態: コンテナは実行中である必要があります。停止しているコンテナからはコピーできません。
- ファイルパーミッション: コピー先のファイルのパーミッションは、ホストのファイルシステムの設定に依存します。
- 大容量ファイル: 大量のデータをコピーする場合は、時間がかかる場合があります。
- ボリュームマウント: より頻繁なファイルのやり取りや、大規模なデータの共有には、ボリュームマウントが適しています。
docker cp
コマンドは、Docker コンテナとホスト間のファイルコピーを簡単に行うための便利なツールです。ログの取得、データのダウンロード、設定ファイルの更新など、様々なユースケースで活用できます。
ボリュームマウント
メリット:
- ファイルの変更がリアルタイムに反映される。
docker cp
コマンドを使用するよりも効率的。- 大量のデータを頻繁にやり取りする場合に適している。
- ホストのファイルシステムに直接アクセスできるため、誤ってコンテナ内のファイルを削除してしまう可能性がある。
- セキュリティ上のリスクが高まる可能性がある。
docker run -v /path/to/host/directory:/container/directory my_image
このコマンドは、ホストの /path/to/host/directory
をコンテナ内の /container/directory
にマウントし、コンテナを起動します。
コンテナ内からのコピー
- コンテナ内で複雑なファイル操作を行う場合に有効。
- スクリプト化しやすい。
docker cp
コマンドを2回実行する必要があるため、若干手間がかかる。
docker exec my_container cp /app/data/output.txt /tmp/output.txt
docker cp my_container:/tmp/output.txt /path/to/host/directory
rsync
- 部分的な同期が可能。
- 圧縮転送により、ネットワーク帯域を節約できる。
- 複雑な同期ルールを設定できる。
docker cp
コマンドよりも設定が複雑になる。- rsync をコンテナ内にインストールする必要がある。
docker exec -it my_container rsync -av /app/data/ /tmp/backup
docker cp my_container:/tmp/backup/ /path/to/host/backup
どの方法を選ぶべきか?
- 頻繁なファイルのやり取り: ボリュームマウント
- 単純なファイルコピー:
docker cp
コマンド - 複雑なファイル操作: コンテナ内からのコピー、rsync
- 大容量ファイルの転送: rsync
- セキュリティ: ボリュームマウントはセキュリティリスクが高いことを考慮する
Docker コンテナとホスト間のファイルコピーには、様々な方法があります。それぞれの方法にはメリットとデメリットがあるため、利用シーンに合わせて最適な方法を選択することが重要です。
docker docker-container file-copying