HOWTO · Docker

ホストから Docker コンテナにファイルをコピーする

このチュートリアルでは、ホストから Docker コンテナにファイルをコピーする方法を示します。

この記事では、ホストマシンから Docker で実行中のコンテナーにファイルを転送するために使用できる方法について説明します。

docker cp を使用して、ホストから Docker コンテナにファイルをコピーする

docker cp コマンドは、ホストマシンから Docker コンテナにファイルとディレクトリをコピーするために使用できる最も簡単な方法の 1つです。現時点では、Ubuntu 20.4.5 と最新バージョンの Docker(v 19.03)を使用します。

構文:

docker cp {options} PATH_HOST CONTAINER:PATH_TO_CONTAINER 

ここで:

  • PATH_HOST は、コピーするファイルがホスト上にあるソースパスを指定します。
  • PATH_TO_CONTAINER は、ファイルをコンテナに保存する宛先パスです。

例:

まず、ターゲットコンテナを作成します。この記事では公式の Nginx イメージを使用します。このイメージは、以下のコマンドを実行することで Docker デスクトップまたはターミナルを介してプルできます。

$ docker pull nginx

出力:

Using default tag: latest
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

次のコマンドを使用して、レジストリからイメージを正常にプルしたことを確認します。

$ docker images

出力:

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    c316d5a335a5   2 weeks ago   142MB

これで、コンテナを作成できます。run コマンドを使用して、コンテナーを作成し、それをデタッチモードでデプロイして、外部ポート 8080 と内部ポート 80 でリッスンします。

以下のコマンドは、Nginx ベースイメージを使用してコンテナを作成します。

$ docker run -d -p 8080:80 nginx

docker ps -a コマンドを実行すると、新しいコンテナーが正常に作成されたことを確認できます。これにより、最近および過去に作成したすべてのコンテナーが、コンテナーID およびそれぞれのイメージとともに一覧表示されます。

ここに示すようにこれを実行できます。

docker ps -a

出力:

CONTAINER ID   IMAGE   COMMAND                  CREATED              STATUS              PORTS                  NAMES
0c57de10362b   nginx   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   lucid_booth

docker cp コマンドを使用する前に、ホストから作成したコンテナーにコピーするファイルを作成する必要があります。

new_file.txt という名前のファイルを作成し、touch コマンドを使用してホームディレクトリに保存します。

これを行うためのコマンドは次のとおりです。

$ touch new_file.txt

ここに示すように、ディレクトリを表示して、ls コマンドを使用してファイルが正常に作成されたことを確認できます。

isaac@DESKTOP-HV44HT6:~$ ls
new_file.txt

もちろん、new_file.txt は空のファイルです。ただし、docker cp コマンドを使用して、ホストから以前に作成したコンテナーに移動することに焦点を当てたいと思います。

次に、このファイルを作成したコンテナにコピーします。

$ docker cp new_file.txt 0c57de10362b:/usr/share

ちょうどそのように、new_file.txt をフォルダ/usr/share の下の ID0c57de10362b のコンテナにコピーしました。

これを確認するには、コマンド docker exec-it フラグを使用してインタラクティブ SSH セッションを介して実行中のコンテナーにアクセスし、コマンドをインタラクティブに実行します。

$ docker exec -it 0c57de10362b /bin/bash

コンテナにログインしたので、ファイルを一覧表示して、このファイルをこのコンテナにコピーしたことを確認します。ls コマンドを再度使用できますが、アクセスするフォルダーを指定します。

root@0c57de10362b:/# ls -lh /usr/share/

出力:

ホストから Docker コンテナにコピーされたファイルを表示する

同様に、以下に示すように、ディレクトリから読み取るファイルの場所を変更するだけで、多くのファイルを含むディレクトリをコピーすることもできます。

$ docker cp src/directory/. container-id:/target_location/directory

docker cp コマンドは使いやすいですが、いくつかの制限があります。その構文は Unix の cp コマンドとは異なり、限られた数のタグのみをサポートします。

また、これはホストからコンテナにファイルをコピーするためにのみ使用でき、コンテナ間では使用できません。

docker volume を使用して、ホストから Docker コンテナにファイルをコピーする

コンテナ間でファイルをコピーするためのより良いアプローチは、docker volume を使用することです。

コンテナ作成プロセス中に、-v または -mount フラグのいずれかを使用して、コンテナにコピーするファイルを含むボリュームをアタッチできます。

Docker でボリュームを使用するには、次に示すように、最初に docker volume コマンドを使用してボリュームを作成します。

$ docker volume create volume_one

docker volume ls を使用して、ボリュームが正常に作成されたことを確認できます。これにより、現在および過去に作成されたボリュームの名前とドライバーの名前が一覧表示されます。

isaac@DESKTOP-HV44HT6:~$ docker volume ls
DRIVER    VOLUME NAME
local     volume_one

ボリュームを作成したので、次のステップでは、run コマンドを使用して新しいコンテナーを作成し、-v フラグを使用して作成したボリュームをアタッチします。

-v フラグを使用すると、作成したコンテナに新しいボリュームをアタッチできます。このコンテナは、最新バージョンの Nginx ベースイメージを使用して作成します。

$ docker run -d -v volume_one:/app nginx:latest
f2457d3eb8fe14645b9e3938017c02c46a657c9ad3323ff4c03924d2fddd7046

Docker inspect コマンドを使用して、Docker オブジェクトに関する低レベルの情報を返すことができます。ボリュームが作成したコンテナーに正常に接続されたかどうかを調査します。

このコンテナには名前を割り当てていないため、コンテナ ID を使用して検査します。以前のコンテナ ID ではなく、最新のコンテナ ID を使用します。

$ docker ps -a

出力:

CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                  NAMES
f2457d3eb8fe   nginx:latest   "/docker-entrypoint.…"   4 minutes ago       Up 4 minutes       80/tcp                 brave_kirch
0c57de10362b   nginx          "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8080->80/tcp   lucid_booth

これで、このコンテナ ID を使用してコンテナを検査できます。

$ docker inspect f2457d3eb8fe

出力:

Docker コンテナにマウントされたボリュームを検査する

docker volume コマンドの利点の 1つは、複数のコンテナーと共有される単一のディレクトリを作成することです。