このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Docker超入門:Docker Composeでコンテナ内のファイルをホストにコピーする方法

Docker Composeでコンテナ内のファイルをホストにコピーする方法

 Docker Composeを使ってコンテナを管理していると、「コンテナの中にあるファイルをホストに取り出したい!」という場面があります。
たとえば、Apacheコンテナ内の index.html を確認したい場合などですね。
 この記事では、docker compose cp コマンドを使って、簡単にファイルをコピーする方法をわかりやすく解説します。

図で理解する:ファイルコピーの流れ

Composeを使ったファイルコピーは次のようなイメージです👇

作業前のクリーンアップ

まずは環境をきれいに整えておきましょう。
古いコンテナやイメージが残っていると、後の動作確認がわかりづらくなります。

💡実行コマンド

docker system prune -a

 このコマンドは、停止中のコンテナや未使用のネットワーク・イメージ・キャッシュをまとめて削除してくれます。
実行すると次のように表示されます。

実行結果

PS C:\Users\joeac> docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y

「y」を入力して実行すれば、古いオブジェクトが削除され、クリーンな状態になります。
もしボリュームが残っている場合は、必要に応じて削除しておきましょう。

作業ディレクトリの移動

次に、Composeファイル(compose.yaml)を配置しているフォルダに移動します。
ここでは desktop/docker/apache フォルダにある前提です。

cd desktop/docker/apache

実行結果

PS C:\Users\joeac> cd desktop/docker/apache
PS C:\Users\joeac\Desktop\docker\apache>

コンテナの作成と起動

まずは compose.yaml の中身を確認してみましょう。

cat compose.yaml

実行結果

PS C:\Users\joeac\Desktop\docker\apache> cat compose.yaml
version: '3'

services:
  apache:
    image: httpd:2.4
    ports:
      - "80:80"

このファイルでは、Apache Webサーバー(httpd:2.4) コンテナを定義しています。

コンテナの起動

続いてコンテナを起動します。

docker compose up -d

実行結果

PS C:\Users\joeac\Desktop\docker\apache> docker compose up -d
(省略)
[+] Running 7/7
 ✔ apache Pulled                                                                 7.0s
   ✔ fbb3c2cad9f8 Pull complete                                                  0.4s
   ✔ 6c19a85825c3 Pull complete                                                  0.9s
   ✔ af3b83c443ec Pull complete                                                  0.8s
   ✔ 12844f4198f6 Pull complete                                                  4.0s
   ✔ 4f4fb700ef54 Pull complete                                                  0.7s
   ✔ 8c7716127147 Pull complete                                                  3.7s
[+] Running 2/2
 ✔ Network apache_default     Created                                            0.1s
 ✔ Container apache-apache-1  Started 

これでApacheコンテナがバックグラウンドで起動しました。

コンテナ内のファイルをホストにコピー

ここからが本題です。
 Docker Composeを使って起動したコンテナ内にある index.html をホスト側へコピーしてみましょう。

📘コマンド書式

docker compose cp <サービス名>:<コンテナ内のファイルパス> <ホスト側のコピー先パス>

実際の例は次のようになります。

docker compose cp apache:/usr/local/apache2/htdocs/index.html .

このコマンドは、apache サービス(httpdコンテナ)の
/usr/local/apache2/htdocs/index.html ファイルを、ホストのカレントディレクトリ(.) にコピーします。

💡コマンド解説表

要素説明
docker compose cpDocker Composeで、コンテナからホストへファイルをコピーするコマンド。
apacheサービス名。compose.yaml内で定義したサービスを指定する。
/usr/local/apache2/htdocs/index.htmlコピー元ファイルのコンテナ内パス。
.コピー先(現在のディレクトリを意味する)。

実行結果

PS C:\Users\joeac\Desktop\docker\apache> docker compose cp apache:/usr/local/apache2/htdocs/index.html .
(省略)
[+] Copying 1/1
 ✔ apache-apache-1 copy apache-apache-1:/usr/local/apache2/htdocs/index.html to . Copied0.0s
PS C:\Users\joeac\Desktop\docker\apache>

コピーが成功しました!
これで index.html ファイルがホストの作業ディレクトリに出力されています。

コピーしたファイルの確認

コピーされた index.html の内容を確認してみましょう。

cat index.html

実行結果

PS C:\Users\joeac\Desktop\docker\apache> cat index.html
<html><body><h1>It works!</h1></body></html>

Apacheの初期ページの内容が表示されましたね。
これで、コンテナ内のファイルをホスト上で確認できました。

docker compose cp コマンドのオプション一覧

オプション説明
なし単一ファイルまたはディレクトリをコピー
-aファイルの属性(パーミッションやタイムスタンプ)を保持
-Lシンボリックリンクを実体化してコピー
-rディレクトリを再帰的にコピー

まとめ

Docker Composeを使うと、docker cp と同様にコンテナ内のファイルを簡単に取得できます。

ポイントをまとめると

  • サービス名を指定してファイルをコピーできる。
  • compose.yamlに基づくコンテナでも問題なく利用可能
  • 「.」でカレントディレクトリを指定してホストに出力

 この方法を覚えておくと、Webサーバーの出力ファイルや設定ファイルをホスト側で確認・編集するときにとても便利です。
ぜひ試してみてください! 🚀