Docker cpを使用してファイルをDockerコンテナにコピーする方法

DockerホストからDockerコンテナにファイルをコピーする必要がある場合、このチュートリアルが役立ちます。

このチュートリアルでは、さまざまな方法を使用してDockerホストからDockerコンテナにファイルをコピーする方法を学びます。

さあ始めましょう!

前提条件

ステップバイステップで進める場合は、以下の準備が必要です:

  • LinuxホストにDockerがインストールされていること。このチュートリアルではDocker v19.03.11を使用します。Dockerのバージョンはdocker versionを実行して確認できます。

docker cpコマンドを使用してファイルをコピーする

このチュートリアルでは、docker cpコマンドを使用してDockerホストからコンテナにファイルをコピーする方法を学びます。docker cpコマンドは、コンテナとDockerホストのローカルファイルシステム間でファイルやフォルダをコピーすることができます。

例を使ってDocker cpコマンドの使い方を学びましょう。

1. ローカルマシンでターミナルを開きます。

2. touchコマンドを使用してmyfile.txtという名前のファイルを作成します。このmyfile.txtは、Dockerホストからコンテナにコピーされます。

touch myfile.txt

3. docker runコマンドを実行します。以下のdocker runは、バックグラウンドで新しいコンテナを作成します。以下のコマンドには、以下の3つのパラメータが含まれています:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginxはコンテナを実行するために使用されるイメージです。
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. docker psコマンドを使用して、Dockerコンテナが正常に作成されたかを確認します。 docker psコマンドを実行すると、NGINXイメージを使用して新しい値がCONTAINER ID(下記の場合はccae4670f030の属性に生成され、コンテナが正常に作成されたことが確認できます。

sudo docker ps
Verifying the docker container by running the docker ps command

Docker cpコマンドを実行する前に、Docker cpコマンドの構文は次のようになります:

  • CONTAINER: SRC_PATHはコンテナのソースパスを指定します。
  • DEST_PATHはホスト上の宛先パスです。
  • CONTAINER: DEST_PATHはコンテナ上の宛先パスです。

さらに、コマンドに以下のパラメータをオプションとして追加することもできます:

  • アーカイブまたは-aを使用すると、ファイルとフォルダのユーザーおよびプライマリグループのすべてのアクセス許可がコピーされます。
  • -Lを指定すると、ソースパスのシンボリックリンクを宛先パスにコピーすることができます。
# コンテナからDockerホストにコピーする構文  
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# Dockerホストからコンテナにコピーする構文  
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. 次に、docker cpコマンドを実行します。このコマンドは、以前に作成したmyfile.txtをコンテナの/usr/shareディレクトリにコピーします。ccae4670f030myfile.txtがコピーされるコンテナのIDです。

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. 最後に、docker execコマンドを使用して実行中のコンテナにSSH接続します。この際、デフォルトのシェルである/bin/bashを指定します。

  • iフラグは、コンテナに対してインタラクティブなSSHセッションを開きたいことを示します。 iフラグは、コンテナがアタッチされていなくてもSSHセッションを閉じません。
  • tフラグは、コマンドをインタラクティブに実行するために疑似TTYを割り当てる必要があります。sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

docker execを実行すると、コンテナのシェルに接続されていることが分かります。

SSH into the running container using docker exec command

7. コンテナにログインした後、myfile.txtlsコマンドを使用してコンテナにコピーされたかどうかを確認してください。

  • lsは、UnixおよびUnixライクなオペレーティングシステムでコンピュータファイルをリストするためのコマンドです。
  • grepは、usr/shareディレクトリ内で文字列myで始まるすべてのファイルまたはフォルダを検索します。
Verifying the files in the container

DockerFileを使用してファイルをコピーする

前のセクションで、Docker cpコマンドを実行してコンテナにファイルをコピーする方法を学びました。複数のファイルを一度にコピーする必要がある場合はどうでしょうか?複数のコマンドを実行することは負荷となります!複数のcpコマンドを実行する問題を解決するには、Dockerfileを使用してファイルまたはフォルダをコンテナにコピーするCOPYコマンドを試してみましょう。

コンテナを展開し、Dockerfileを使用してファイル/フォルダをコピーすることで、前のセクションで行った手動のコピー手順を削除できます。Dockerfileは、ユーザーがコマンドラインで呼び出すことができるすべてのコマンドを含むテキストドキュメントです。

では、Dockerfileを作成し、それを元にコンテナを実行し、最後にファイルをコピーします。

1. ~/host-to-container-copy-demoという名前のフォルダを作成し、作業ディレクトリをそのフォルダに変更(cd)します。このフォルダには、このデモで作成するすべてのファイルが含まれます。

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. 続いて、myfile1.txtとmyfile2.txtという名前の2つのテキストファイルを作成し、それらをコピーしてファイルに貼り付け、~/host-to-container-copy-demoディレクトリに保存します。

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. 別のファイルを作成し、以下の設定をコピー/貼り付けし、ファイルをDockerfileとして保存します。保存場所は~/host-to-container-copy-demoディレクトリです。 完了したら、DockerはこのDockerfileを使用して、ベースイメージの上に新しいDockerイメージをビルドするためのすべてのコマンドを実行します。

以下のDockerfileには、新しいコンテナをビルドするためのさまざまなステップ/命令が含まれています:

  • FROM FROM命令は新しいビルドステージを初期化し、後続の命令のためのベースイメージを設定します。
  • COPY COPYコマンドは、ホストマシン(Dockerホスト)からコンテナにファイルをコピーします。
# Dockerfileの命令でベースイメージ(ubuntu)の上に新しいイメージを作成するための指示
# ベースイメージとしてubuntu:latestを使用
FROM ubuntu:latest
# myfile1.txtをコンテナの/usr/shareディレクトリにコピー
COPY myfile1.txt /usr/share
# myfile2.txtをコンテナの/tmpディレクトリにコピー
COPY myfile2.txt /tmp

4. treeコマンドを実行して、新しいイメージを構築するために必要なすべてのファイルを確認します。~/host-to-container-copy-demoディレクトリの下にDockerfile、myfile1.txt、およびmyfile2.txtが表示されるはずです。

Verifies files and folders using tree command

5. 次に、docker buildコマンドを実行してイメージをビルドします。 tフラグはイメージにlatestというタグを付けるために使用され、.はdockerが現在の作業ディレクトリから必要なすべてのファイルを選ぶことを可能にします。

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. 今度は、docker imagesコマンドを実行して新しく構築されたイメージupdated_ubuntu_imageを確認します。 REPOSITORY属性に注目してください。 この属性は前のステップで-tフラグで作成されたタグです。

sudo docker images
Repository Attribute

7. 最後に、docker runコマンドを実行して、新しく構築されたイメージを使用してDockerコンテナを実行します。 -itフラグはDockerにコンテナのstdinに接続された疑似ターミナルを割り当てるよう指示します。 bashはLinuxシステムのユーザーログインのデフォルトシェルを提供します。

sudo docker run -it updated_ubuntu_image bash

以下のように、DockerコンテナのBashシェルに移動したことがわかります。

Running the container using docker run command.

8. 次に、lsコマンドを実行して、ファイルがコンテナの/tmpディレクトリと/usr/shareディレクトリに正常にコピーされたか確認します。/tmpおよび/usr/share

Verifying the files if they are successfully copied on the container

ストレージボリュームのマウントとDocker Volumeコマンドを使用したファイルへのアクセス

今まで、docker cpコマンドとDockerFileを使用して、ホストからコンテナにファイルをコピーする方法を2つ学びました。今度は、docker volumeコマンドを使用して、ホストとコンテナ間で簡単にファイルシステムを共有する方法を学びましょう。

まだターミナルにログインしていると仮定します:

1. docker volume createコマンドを実行して、Dockerホスト上にボリュームを作成します。以下のコマンドは、my-volという名前のボリュームを作成します。sudo docker volume create my-vol

sudo docker volume create my-vol

2. docker volume lsコマンドを実行して、ボリュームが正常に作成されたことを確認します。docker volume lsコマンドはボリュームをリストします。docker volume lsコマンドを実行した後、VOLUME NAME属性にmy-volが表示されることで、ボリュームが正常に作成されたことが確認できます。

sudo docker volume ls
Listing the docker volumes

3. 次に、docker runコマンドを使用してコンテナを実行します。

  • コンテナの名前はvolume_testingで、nginx: latestイメージを使用します。
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. 以docker inspect命令验证之前创建的卷my-vol是否正确地与容器挂载。Docker inspect命令提供容器的信息。运行docker inspect命令后,将显示指定容器(volume_testing)的所有详细信息,包括挂载细节,如下所示。

sudo docker inspect volume_testing

下面的图像快照确认了你在主机上创建的卷(my-vol)成功地与容器的/app目录挂载。

Verifying the volumes in the container

结论

在本教程中,你学习了从Docker主机复制文件或文件夹到容器的不同方法,例如使用Docker cp命令、Docker卷命令和Dockerfile。

那么在将数据从主机复制到Docker容器时,你将使用哪种方法呢?

Source:
https://adamtheautomator.com/docker-cp/