DockerホストからDockerコンテナにファイルをコピーする必要がある場合、このチュートリアルが役立ちます。
このチュートリアルでは、さまざまな方法を使用してDockerホストからDockerコンテナにファイルをコピーする方法を学びます。
さあ始めましょう!
前提条件
ステップバイステップで進める場合は、以下の準備が必要です:
- A Linux host. This tutorial uses Ubuntu 18.04.5 LTS.
- LinuxホストにDockerがインストールされていること。このチュートリアルではDocker v19.03.11を使用します。Dockerのバージョンは
docker version
を実行して確認できます。
- ダウンロードされて利用可能な任意のDockerイメージ。このチュートリアルでは、Docker Hubで利用可能な最新のNGINX Dockerイメージを使用します。
docker cp
コマンドを使用してファイルをコピーする
このチュートリアルでは、docker cp
コマンドを使用してDockerホストからコンテナにファイルをコピーする方法を学びます。docker cp
コマンドは、コンテナとDockerホストのローカルファイルシステム間でファイルやフォルダをコピーすることができます。
例を使ってDocker cpコマンドの使い方を学びましょう。
1. ローカルマシンでターミナルを開きます。
2. touch
コマンドを使用してmyfile.txtという名前のファイルを作成します。このmyfile.txtは、Dockerホストからコンテナにコピーされます。
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 port80
to the host on port80
.nginx
はコンテナを実行するために使用されるイメージです。

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

Docker cpコマンドを実行する前に、Docker cpコマンドの構文は次のようになります:
CONTAINER: SRC_PATH
はコンテナのソースパスを指定します。DEST_PATH
はホスト上の宛先パスです。CONTAINER: DEST_PATH
はコンテナ上の宛先パスです。
さらに、コマンドに以下のパラメータをオプションとして追加することもできます:
- アーカイブまたは-aを使用すると、ファイルとフォルダのユーザーおよびプライマリグループのすべてのアクセス許可がコピーされます。
- -Lを指定すると、ソースパスのシンボリックリンクを宛先パスにコピーすることができます。
5. 次に、docker cp
コマンドを実行します。このコマンドは、以前に作成したmyfile.txtをコンテナの/usr/shareディレクトリにコピーします。ccae4670f030
はmyfile.txtがコピーされるコンテナのIDです。
6. 最後に、docker exec
コマンドを使用して実行中のコンテナにSSH接続します。この際、デフォルトのシェルである/bin/bash
を指定します。
-
i
フラグは、コンテナに対してインタラクティブなSSHセッションを開きたいことを示します。i
フラグは、コンテナがアタッチされていなくてもSSHセッションを閉じません。 -
t
フラグは、コマンドをインタラクティブに実行するために疑似TTYを割り当てる必要があります。sudo docker exec -it ccae4670f030 /bin/bash
docker exec
を実行すると、コンテナのシェルに接続されていることが分かります。

7. コンテナにログインした後、myfile.txtがlsコマンドを使用してコンテナにコピーされたかどうかを確認してください。
ls
は、UnixおよびUnixライクなオペレーティングシステムでコンピュータファイルをリストするためのコマンドです。grep
は、usr/shareディレクトリ内で文字列my
で始まるすべてのファイルまたはフォルダを検索します。

DockerFileを使用してファイルをコピーする
前のセクションで、Docker cpコマンドを実行してコンテナにファイルをコピーする方法を学びました。複数のファイルを一度にコピーする必要がある場合はどうでしょうか?複数のコマンドを実行することは負荷となります!複数のcpコマンドを実行する問題を解決するには、Dockerfileを使用してファイルまたはフォルダをコンテナにコピーするCOPY
コマンドを試してみましょう。
コンテナを展開し、Dockerfileを使用してファイル/フォルダをコピーすることで、前のセクションで行った手動のコピー手順を削除できます。Dockerfileは、ユーザーがコマンドラインで呼び出すことができるすべてのコマンドを含むテキストドキュメントです。
では、Dockerfileを作成し、それを元にコンテナを実行し、最後にファイルをコピーします。
1. ~/host-to-container-copy-demoという名前のフォルダを作成し、作業ディレクトリをそのフォルダに変更(cd
)します。このフォルダには、このデモで作成するすべてのファイルが含まれます。
2. 続いて、myfile1.txtとmyfile2.txtという名前の2つのテキストファイルを作成し、それらをコピーしてファイルに貼り付け、~/host-to-container-copy-demoディレクトリに保存します。
3. 別のファイルを作成し、以下の設定をコピー/貼り付けし、ファイルをDockerfileとして保存します。保存場所は~/host-to-container-copy-demoディレクトリです。 完了したら、DockerはこのDockerfileを使用して、ベースイメージの上に新しいDockerイメージをビルドするためのすべてのコマンドを実行します。
以下のDockerfileには、新しいコンテナをビルドするためのさまざまなステップ/命令が含まれています:
FROM
– FROM命令は新しいビルドステージを初期化し、後続の命令のためのベースイメージを設定します。COPY
– COPYコマンドは、ホストマシン(Dockerホスト)からコンテナにファイルをコピーします。
4. tree
コマンドを実行して、新しいイメージを構築するために必要なすべてのファイルを確認します。~/host-to-container-copy-demoディレクトリの下にDockerfile、myfile1.txt、およびmyfile2.txtが表示されるはずです。

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

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

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

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

ストレージボリュームのマウントとDocker Volume
コマンドを使用したファイルへのアクセス
今まで、docker cp
コマンドとDockerFileを使用して、ホストからコンテナにファイルをコピーする方法を2つ学びました。今度は、docker volume
コマンドを使用して、ホストとコンテナ間で簡単にファイルシステムを共有する方法を学びましょう。
まだターミナルにログインしていると仮定します:
1. docker volume create
コマンドを実行して、Dockerホスト上にボリュームを作成します。以下のコマンドは、my-vol
という名前のボリュームを作成します。sudo docker volume create my-vol
2. docker volume ls
コマンドを実行して、ボリュームが正常に作成されたことを確認します。docker volume lsコマンドはボリュームをリストします。docker volume ls
コマンドを実行した後、VOLUME NAME属性にmy-vol
が表示されることで、ボリュームが正常に作成されたことが確認できます。

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 volumemy-vol
created on Docker host to the container’s destination/app
directory.

4. 以docker inspect
命令验证之前创建的卷my-vol是否正确地与容器挂载。Docker inspect命令提供容器的信息。运行docker inspect
命令后,将显示指定容器(volume_testing)的所有详细信息,包括挂载细节,如下所示。
下面的图像快照确认了你在主机上创建的卷(my-vol)成功地与容器的/app
目录挂载。

结论
在本教程中,你学习了从Docker主机复制文件或文件夹到容器的不同方法,例如使用Docker cp命令、Docker卷命令和Dockerfile。
那么在将数据从主机复制到Docker容器时,你将使用哪种方法呢?