ホストから 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 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 volume
コマンドの利点の 1つは、複数のコンテナーと共有される単一のディレクトリを作成することです。
Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.
LinkedIn