はじめに
この実験では、docker compose cp コマンドを使用して、サービスコンテナとローカルファイルシステム間でファイルやディレクトリをコピーする方法を学びます。まず、Docker Compose のインストールと、Ubuntu イメージを基にした基本的な docker-compose.yml ファイルの作成を含む、シンプルな Docker Compose プロジェクトのセットアップから始めます。
プロジェクトのセットアップ後、サービスコンテナからローカルマシンへファイルをコピーする練習を行い、次にローカルマシンからサービスコンテナへファイルをコピーします。最後に、サービスコンテナからローカルファイルシステムへディレクトリ全体をコピーする方法を学び、Docker Compose 環境内でのデータ管理における docker compose cp コマンドの柔軟性を実証します。
シンプルな Docker Compose プロジェクトの準備
このステップでは、シンプルな Docker Compose プロジェクトを準備します。LabEx 環境には Docker Compose がプリインストールされていないため、まずインストールを行います。Docker Compose はマルチコンテナ Docker アプリケーションを定義・実行するためのツールです。Compose では YAML ファイルを使用してアプリケーションのサービスを設定し、単一のコマンドで設定からすべてのサービスを作成・起動できます。
まず、Docker Compose をインストールしましょう。Docker Compose バイナリをダウンロードし、実行可能にします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
インストールを確認するため、Docker Compose のバージョンを確認します。
docker-compose --version
Docker Compose version v2.20.2のような出力が表示されるはずです。
次に、シンプルな Docker Compose プロジェクトを作成します。プロジェクト用のディレクトリを作成し、その中にdocker-compose.ymlファイルを作成します。このファイルはubuntuイメージを使用したシンプルなサービスを定義します。
mkdir ~/project/my-compose-app
cd ~/project/my-compose-app
nano docker-compose.yml
nanoエディタで、以下の内容をdocker-compose.ymlファイルに貼り付けます:
version: "3.8"
services:
my-service:
image: ubuntu:latest
command: tail -f /dev/null
Ctrl + X、次にY、そしてEnterを押して保存し、エディタを終了します。
docker-compose.ymlファイルの内容を解説します:
version: '3.8'は Docker Compose ファイルフォーマットのバージョンを指定しますservices:はアプリケーションを構成するサービスを定義しますmy-service:は私たちのサービス名ですimage: ubuntu:latestはこのサービスで使用する Docker イメージを指定します。最新版の Ubuntu イメージを使用していますcommand: tail -f /dev/nullはコンテナ起動時に実行されるコマンドです。このコマンドはコンテナをリソースをほとんど消費せずに無限に実行し続けます。テストやデバッグに便利です
サービスを起動する前に、ubuntu:latestイメージをプルします。
docker pull ubuntu:latest
これで、docker-compose upコマンドでサービスを起動できます。-dフラグはコンテナをデタッチドモード (バックグラウンド) で実行します。
docker-compose up -d
サービスが作成・起動されることを示す出力が表示されるはずです。
最後に、docker-compose psコマンドで実行中のサービスの状態を確認します。
docker-compose ps
my-serviceコンテナが実行中であることを示す出力が表示されるはずです。
サービスコンテナからローカルファイルシステムへファイルをコピー
このステップでは、実行中の Docker コンテナからローカルファイルシステムへファイルをコピーする方法を学びます。これは、コンテナ内で生成されたログや設定ファイル、その他のデータを取得する必要がある場合によく行われる作業です。
この目的にはdocker cpコマンドを使用します。docker cpコマンドはコンテナとローカルファイルシステム間でファイル/フォルダをコピーします。構文は、コンテナからローカルファイルシステムへコピーする場合はdocker cp <container>:<src_path> <dest_path>、ローカルファイルシステムからコンテナへコピーする場合はdocker cp <src_path> <container>:<dest_path>です。
まず、実行中のmy-serviceコンテナ内にシンプルなファイルを作成しましょう。コンテナ内でコマンドを実行するためにdocker execコマンドを使用します。docker execコマンドは実行中のコンテナ内で新しいコマンドを実行します。
~/project/my-compose-appディレクトリにいることを確認してください。
cd ~/project/my-compose-app
docker-compose exec my-service bash -c "echo 'This is a test file inside the container.' > /tmp/container_file.txt"
このコマンドはmy-serviceコンテナ内でbashシェルを実行し、echoコマンドを使って/tmp/container_file.txtというファイルを作成し、内容を書き込みます。
次に、このファイルをコンテナからローカルファイルシステムへコピーします。現在のディレクトリ (~/project/my-compose-app) にコピーします。
docker-compose cp my-service:/tmp/container_file.txt .
docker-compose cpコマンドはdocker cpと似ていますが、docker-compose.ymlファイルで定義されたサービス名で動作します。my-serviceは私たちのサービス名、/tmp/container_file.txtはコンテナ内のファイルパス、.はローカルファイルシステムのカレントディレクトリを表します。
コマンド実行後、~/project/my-compose-appディレクトリにcontainer_file.txtファイルが存在するはずです。存在と内容を確認しましょう。
ls container_file.txt
cat container_file.txt
ファイル名が表示され、内容として"This is a test file inside the container."がコンソールに出力されるはずです。
ローカルファイルシステムからサービスコンテナへファイルをコピー
このステップでは、ローカルファイルシステムから実行中の Docker コンテナへファイルをコピーする方法を学びます。これはコンテナ起動後に設定ファイルやスクリプト、その他のデータを追加する必要がある場合に便利です。
今回もdocker cpコマンドを使用しますが、方向が逆になります:docker cp <src_path> <container>:<dest_path>。
まず、ローカルファイルシステムの~/project/my-compose-appディレクトリにシンプルなファイルを作成しましょう。
cd ~/project/my-compose-app
echo "This file is from the local filesystem." > local_file.txt
次に、このlocal_file.txtをローカルファイルシステムからmy-serviceコンテナ内の/tmp/ディレクトリへコピーします。
docker-compose cp local_file.txt my-service:/tmp/
ここではdocker-compose cpコマンドを使用しています。local_file.txtはローカルファイルシステム上のファイルパス、my-serviceはサービス名、/tmp/はコンテナ内のコピー先ディレクトリです。
ファイルが正常にコピーされたことを確認するため、コンテナ内でコマンドを実行してファイルの存在と内容を確認します。
docker-compose exec my-service cat /tmp/local_file.txt
このコマンドはmy-serviceコンテナ内でcat /tmp/local_file.txtコマンドを実行します。コンソールに"This file is from the local filesystem."と表示されれば、ファイルが正しくコピーされたことが確認できます。
サービスコンテナからローカルファイルシステムへディレクトリをコピー
このステップでは、実行中の Docker コンテナからローカルファイルシステムへディレクトリ全体をコピーする方法を学びます。これはアプリケーションの出力ディレクトリやログディレクトリ、コンテナ内で生成されたディレクトリ構造を取得する際に便利です。
ファイルのコピーと同様にdocker cpコマンドを使用しますが、ディレクトリパスを指定します。
まず、実行中のmy-serviceコンテナ内にディレクトリといくつかのファイルを作成しましょう。コンテナ内でコマンドを実行するためにdocker-compose execを使用します。
~/project/my-compose-appディレクトリにいることを確認してください。
cd ~/project/my-compose-app
docker-compose exec my-service bash -c "mkdir /tmp/container_dir && echo 'File 1' > /tmp/container_dir/file1.txt && echo 'File 2' > /tmp/container_dir/file2.txt"
このコマンドはmy-serviceコンテナ内に/tmp/container_dirというディレクトリを作成し、その中にfile1.txtとfile2.txtという 2 つのファイルを作成します。
次に、このディレクトリ全体をコンテナからローカルファイルシステムへコピーします。現在のディレクトリ (~/project/my-compose-app) にコピーします。
docker-compose cp my-service:/tmp/container_dir .
ここではdocker-compose cpコマンドを使用しています。my-serviceはサービス名、/tmp/container_dirはコンテナ内のディレクトリパス、.はローカルファイルシステムのカレントディレクトリを表します。
コマンド実行後、~/project/my-compose-appディレクトリにcontainer_dirという新しいディレクトリが作成されているはずです。存在確認と内容を確認しましょう。
ls container_dir
ls container_dir/file1.txt container_dir/file2.txt
container_dirが表示され、その中の 2 つのファイル (file1.txtとfile2.txt) がリストアップされるはずです。
最後に、起動した Docker Compose サービスをクリーンアップします。
docker-compose down
このコマンドはdocker-compose upで作成されたコンテナ、ネットワーク、ボリュームを停止して削除します。
まとめ
この実験では、docker compose cpコマンドを使用してサービスコンテナとローカルファイルシステム間でファイルやディレクトリをコピーする方法を学びました。まず、Docker Compose のインストールと Ubuntu イメージを使用した基本的なサービスを定義するdocker-compose.ymlファイルの作成を含む、シンプルな Docker Compose プロジェクトの準備から始めました。
プロジェクトのセットアップ後、以下の操作を実践しました:
- サービスコンテナからローカルファイルシステムへのファイルコピー
- ローカルファイルシステムからサービスコンテナへのファイルコピー
- サービスコンテナからローカルファイルシステムへのディレクトリ全体のコピー
これらのステップを通じて、Docker Compose 環境内でのデータ転送管理におけるdocker compose cpコマンドの実用的な活用方法を確認しました。



