はじめに
この実験では、docker container cp コマンドを使用してローカルファイルシステムと Docker コンテナ間でファイルを効果的にコピーする方法を学びます。この実践的なチャレンジでは、以下の重要なシナリオをカバーします:
- ローカルマシンから実行中のコンテナへファイルをコピーする
- コンテナからローカルシステムへファイルを取得する
- STDOUT と STDIN を介したデータ転送のためのストリーミング機能の活用
実践的な例を通じて、コンテナ化されたアプリケーションのデータフロー管理に習熟します。個々のファイルやディレクトリのコピー方法、さらにはデータストリーミング方法を学ぶことで、様々な開発やデプロイタスクに必要な柔軟性を身につけることができます。
ローカルファイルをコンテナにコピー
このステップでは、ローカルファイルシステムから実行中の Docker コンテナへファイルをコピーする方法を学びます。これは、コンテナ起動後に設定ファイルやスクリプト、その他のデータを追加する必要がある場合によく行われる作業です。
まず、~/projectディレクトリ内に簡単なテキストファイルをローカルマシン上に作成しましょう。
echo "This is a test file." > ~/project/test_file.txt
このコマンドは、~/projectディレクトリにtest_file.txtというファイルを作成し、「This is a test file.」というテキストを書き込みます。
次に、ファイルをコピーする対象となる実行中のコンテナが必要です。ここではシンプルなubuntuイメージを使用します。イメージがローカルに存在しない可能性があるため、まずはプルします。
docker pull ubuntu:latest
このコマンドは、Docker Hub からubuntuイメージの最新版をダウンロードします。
では、ubuntuイメージを基にコンテナを実行しましょう。デタッチモード (-d) で実行し、識別しやすいように名前 (my_ubuntu_container) を付けます。
docker run -d --name my_ubuntu_container ubuntu:latest sleep infinity
このコマンドは、ubuntu:latestイメージを使用してmy_ubuntu_containerという名前の新しいコンテナを起動します。sleep infinityコマンドにより、コンテナは無期限に実行され続けます(デモンストレーション目的に便利です)。
docker psコマンドを使用して、コンテナが実行中であることを確認できます。
docker ps
出力にmy_ubuntu_containerが表示されるはずです。
これで、docker cpコマンドを使用してローカルマシンからtest_file.txtを実行中のコンテナにコピーできます。構文はdocker cp <local_path> <container_name>:<container_path>です。
docker cp ~/project/test_file.txt my_ubuntu_container:/tmp/
このコマンドは、~/project/test_file.txtファイルをmy_ubuntu_container内の/tmp/ディレクトリにコピーします。
ファイルが正常にコピーされたことを確認するには、docker execを使用してコンテナ内でコマンドを実行します。コンテナの/tmp/ディレクトリ内のファイルをリスト表示するためにlsを使用します。
docker exec my_ubuntu_container ls /tmp/
出力にtest_file.txtが表示されれば、ファイルが正常にコピーされたことが確認できます。
最後に、作成したコンテナをクリーンアップしましょう。
docker stop my_ubuntu_container
docker rm my_ubuntu_container
これらのコマンドは、それぞれコンテナを停止し、削除します。
コンテナからローカルファイルシステムへファイルをコピー
このステップでは、実行中の Docker コンテナからローカルファイルシステムへファイルをコピーする方法を学びます。これは、ログや設定ファイル、コンテナ内で生成・変更されたデータを取得する際に有用です。
まず、作業対象となる実行中のコンテナがあることを確認しましょう。前のステップで使用したmy_ubuntu_containerを使用します。実行中でない場合は起動します。
docker start my_ubuntu_container
このコマンドは、my_ubuntu_containerという名前のコンテナを起動します。
次に、ローカルマシンにコピーするためのファイルをコンテナ内に作成します。docker execを使用してコンテナ内でコマンドを実行し、/root/ディレクトリにcontainer_file.txtというファイルを作成します。
docker exec my_ubuntu_container sh -c 'echo "This file is from the container." > /root/container_file.txt'
このコマンドは、my_ubuntu_container内でシェルコマンドを実行し、指定された内容で/root/container_file.txtファイルを作成します。
コンテナ内にファイルが作成されたことを確認するには、docker execを使用してコンテナの/root/ディレクトリ内のファイルをリスト表示します。
docker exec my_ubuntu_container ls /root/
出力にcontainer_file.txtが表示されるはずです。
これで、docker cpコマンドを使用してcontainer_file.txtをコンテナからローカルマシンにコピーできます。コンテナからローカルへのコピー構文はdocker cp <container_name>:<container_path> <local_path>です。~/projectディレクトリにコピーします。
docker cp my_ubuntu_container:/root/container_file.txt ~/project/
このコマンドは、my_ubuntu_container内の/root/container_file.txtファイルをローカルの~/project/ディレクトリにコピーします。
ローカルマシンにファイルが正常にコピーされたことを確認するには、~/projectディレクトリ内のファイルをリスト表示します。
ls ~/project/
出力には、前のステップのtest_file.txtと共にcontainer_file.txtが表示されるはずです。
また、catコマンドを使用してコピーしたファイルの内容を表示できます。
cat ~/project/container_file.txt
出力は「This file is from the container.」となり、内容が正しくコピーされたことが確認できます。
最後に、コンテナをクリーンアップしましょう。
docker stop my_ubuntu_container
docker rm my_ubuntu_container
コンテナから STDOUT へファイルをストリーミング
このステップでは、実行中の Docker コンテナ内のファイル内容をローカルマシンの標準出力 (STDOUT) に直接ストリーミングする方法を学びます。これは、ファイルを明示的にコピーすることなく、コンテナ内のファイル内容を素早く確認するのに便利です。
まず、my_ubuntu_containerが実行中であることを確認してください。実行中でない場合は起動します。
docker start my_ubuntu_container
次に、STDOUT にストリーミングするためのファイルをコンテナ内に作成します。コンテナの/var/log/ディレクトリにstream_test.logというファイルを作成します。
docker exec my_ubuntu_container sh -c 'echo "This is a log entry." > /var/log/stream_test.log'
このコマンドは、my_ubuntu_container内でシェルコマンドを実行し、指定された内容で/var/log/stream_test.logファイルを作成します。
このファイルの内容をローカルの STDOUT にストリーミングするには、docker execコマンドとコンテナ内のcatコマンドを使用します。
docker exec my_ubuntu_container cat /var/log/stream_test.log
このコマンドは、my_ubuntu_container内でcat /var/log/stream_test.logコマンドを実行します。コンテナ内のこのコマンドの出力は、ローカルのターミナルの STDOUT にストリーミングされます。
「This is a log entry.」という内容が直接ターミナルに表示されるはずです。これにより、ファイル全体をコピーする必要なく、コンテナ内のファイル内容を素早く確認できることがわかります。
最後に、コンテナをクリーンアップしましょう。
docker stop my_ubuntu_container
docker rm my_ubuntu_container
ローカルの tar アーカイブを STDIN からコンテナへストリーミング
このステップでは、ローカルの tar アーカイブを標準入力 (STDIN) を使用して実行中の Docker コンテナに直接ストリーミングする方法を学びます。これは、ローカルマシン上の中間ファイルを作成せずに、複数のファイルやディレクトリをコンテナに転送する効率的な方法です。
まず、アーカイブしてストリーミングするためのディレクトリとファイルを~/projectディレクトリ内に作成します。
mkdir ~/project/my_files
echo "File 1 content." > ~/project/my_files/file1.txt
echo "File 2 content." > ~/project/my_files/file2.txt
これにより、my_filesディレクトリとその中に 2 つのテキストファイルが作成されます。
次に、my_ubuntu_containerが実行中であることを確認してください。実行中でない場合は起動します。
docker start my_ubuntu_container
tar アーカイブをコンテナにストリーミングするには、tarコマンドでmy_filesディレクトリのアーカイブを作成し、その出力をパイプ (|) でdocker execコマンドに渡します。コンテナ内では、再度tarコマンドを使用してアーカイブを展開します。
アーカイブはコンテナ内の/opt/ディレクトリにストリーミングします。
tar -cvf - ~/project/my_files | docker exec -i my_ubuntu_container tar -xvf - -C /opt/
このコマンドを分解してみましょう:
tar -cvf - ~/project/my_files: このコマンドは~/project/my_filesディレクトリの tar アーカイブを (-c) 詳細表示 (-v) で作成します。-f -オプションはtarに標準出力へアーカイブを書き込むよう指示します|: このパイプはtarコマンドの標準出力 (tar アーカイブ) を次のコマンドの標準入力に渡しますdocker exec -i my_ubuntu_container tar -xvf - -C /opt/: これはmy_ubuntu_container内でtarコマンドを実行します。-iフラグはexecコマンドの STDIN を開いたままにし、パイプされたデータを受け取れるようにするために重要です。tar -xvf -コマンドは標準入力 (-f -) から詳細表示 (-v) で展開 (-x) します。-C /opt/オプションは展開前にディレクトリを/opt/に変更するため、アーカイブの内容はコンテナ内の/opt/my_filesに展開されます
ファイルが正常にストリーミングされ、コンテナ内で展開されたことを確認するには、docker execを使用してコンテナ内の/opt/my_files/ディレクトリの内容をリスト表示します。
docker exec my_ubuntu_container ls /opt/my_files/
出力にfile1.txtとfile2.txtが表示されれば、tar アーカイブが正しくストリーミングされ展開されたことが確認できます。
最後に、コンテナとローカルのファイルをクリーンアップします。
docker stop my_ubuntu_container
docker rm my_ubuntu_container
rm -rf ~/project/my_files
まとめ
この実験では、docker container cpコマンドを使用してローカルファイルシステムと実行中の Docker コンテナ間でファイルをコピーする方法を学びました。コンテナ起動後に必要なデータや設定を追加する方法として、ローカルファイルをコンテナにコピーする操作を実践しました。具体的には、ローカルファイルの作成、シンプルな Ubuntu コンテナの pull と実行、そしてdocker cpを使用してファイルをコンテナの/tmpディレクトリに転送する手順を行いました。



