DockerホストからDockerコンテナーにファイルをコピーする必要がある場合は、このチュートリアルが役立ちます。
このチュートリアルでは、さまざまなアプローチを使用して、DockerホストからDockerコンテナーにファイルをコピーする方法を学習します。
さあ、始めましょう!
前提条件
ステップバイステップでフォローしたい場合は、次のものがあることを確認してください。
- Linuxホスト。このチュートリアルでは、Ubuntu18.04.5LTSを使用します。
- LinuxホストにインストールされたDocker。このチュートリアルでは、Dockerv19.03.11を使用します。
docker version
を実行すると、Dockerのバージョンを確認できます。 。
- ダウンロードして利用可能なDockerイメージ。このチュートリアルでは、DockerHubで利用可能な最新のNGINXDockerイメージを使用します。
docker cp
を使用してファイルをコピーする コマンド
このチュートリアルを開始するには、 docker cp
を使用してDockerホストからコンテナーにファイルをコピーする方法を学習します。 指図。 docker cp
コマンドは、コンテナとDockerホストのローカルファイルシステム間でファイルまたはフォルダをコピーします。その逆も同様です。
例を挙げてDockercpコマンドの使用方法を学びましょう。
1.ローカルマシンでターミナルを開きます。
2. myfile.txtという名前のファイルを作成します touch
を使用する 指図。 myfile.txt Dockerホストからコンテナにコピーされます。
touch myfile.txt
3. docker run
を実行します 指図。以下のdockerrunは、バックグラウンドで新しいコンテナーを作成します。以下のコマンドには、以下に説明する3つのパラメーターが含まれています。
-
d
コンテナをバックグラウンドで実行し、削除されるまで存続させるフラグ。 -
p
フラグはコンテナのポートを公開します80
ポート80
でホストに送信 。 -
nginx
コンテナの実行に使用されるイメージになります。
sudo docker run -d -p 80:80 nginx
4. docker ps
を使用してDockerコンテナが正常に作成されているかどうかを確認します 指図。 docker ps
を実行した後 コマンドを実行すると、属性 CONTAINER ID(以下の場合は ccae4670f030
)の下に生成された新しい値が表示されます。 ) コンテナが正常に作成されたことを確認するNGINXイメージを使用します。
sudo docker ps
Docker cpコマンドを実行する前に、Dockercpコマンドの構文は次のとおりです。
-
CONTAINER:SRC_PATH
コンテナのソースパスを指定します。 -
DEST_PATH
ホストの宛先パスです。 -
CONTAINER:DEST_PATH
コンテナの宛先パスです。
さらに、 options
を追加することもできます 次のようにコマンドで以下のパラメータを使用します:
- アーカイブまたはaの使用–ファイルおよびフォルダーのすべてのユーザーおよびプライマリグループのアクセス許可をコピーします。
- Lの使用– Lオプションを指定すると、ソースパス内のすべてのシンボリックリンクを宛先パスにコピーできます。
# Syntax to Copy from Container to Docker Host
docker cp {options} CONTAINER:SRC_PATH DEST_PATH
# Syntax to Copy from Docker Host to Container
docker cp {options} SRC_PATH CONTAINER:DEST_PATH
5.次に、 docker cp
を実行します 指図。 docker cp
コマンドはmyfile.txtをコピーします 以前にコンテナ/usr / shareに作成したもの ディレクトリ。 ccae4670f030
myfile.txtが送信されるコンテナIDです。 コピーされます。
sudo docker cp myfile.txt ccae4670f030:/usr/share
6.最後に、 docker exec
を実行して、実行中のコンテナーにSSHで接続します。 / bin / bash
を使用したコマンド 、Linuxシステムのユーザーログインのデフォルトシェルとして使用されます。
-
i
コンテナへのインタラクティブSSHセッションを開くことを示すフラグ。i
コンテナが接続されていなくても、フラグはSSHセッションを閉じません。 -
t
flagは、コマンドをインタラクティブに実行するためによく使用される疑似TTYを割り当てます。sudodocker exec -it ccae4670f030 / bin / bash
sudo docker exec -it ccae4670f030 /bin/bash
docker exec
を実行すると、コンテナのシェルに接続されていることがわかります。 。
7.コンテナにログインした後、 myfile.txtかどうかを確認します lsコマンドを使用してコンテナにコピーされました。
-
ls
UnixおよびUnixライクなオペレーティングシステムのコンピュータファイルを一覧表示するコマンドです。 -
grep
文字列my
で始まるすべてのファイルまたはフォルダを検索します usr / share内 ディレクトリ。
DockerFileを使用したファイルのコピー
前のセクションでは、Dockercpコマンドを実行してファイルをコンテナーにコピーする方法を学習しました。一度に複数のファイルをコピーする必要がある場合はどうなりますか?確かに、複数のコマンドを実行するとオーバーヘッドになります!複数のcpコマンドの実行を解決するには、 COPY
でDockerfileを使用してファイルまたはフォルダーをコンテナーにコピーしてみてください。 コマンド?
コンテナーをデプロイし、Dockerfileを使用してファイル/フォルダーをコピーすると、前のセクションで行った手動のコピー手順を削除できます。 Dockerfileは、ユーザーが画像をアセンブルするためにコマンドラインで呼び出すことができるすべてのコマンドを含むテキストドキュメントです。
Dockerfileを作成し、そこからコンテナーを実行して、最後にファイルをコピーしましょう。
1.〜/ host-to-container-copy-demo、という名前のフォルダを作成します 次に変更します( cd
)そのフォルダへの作業ディレクトリ。このフォルダには、このデモで作成するすべてのファイルが含まれます。
mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo
2.次に、 myfile1.txという名前の2つのテキストファイルを作成します。 tおよびmyfile2.txt 、それらをコピーしてファイルに貼り付け、〜/ 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コマンドは、ファイルをホストマシン(Dockerホスト)からコンテナーにコピーします。
# Instruction for Dockerfile to create a new image on top of the base image (ubuntu)
# Using the base image ubuntu: latest
FROM ubuntu:latest
# Copying myfile1.txt to the containers /usr/share directory
COPY myfile1.txt /usr/share
# Copying myfile2.txt to the containers /tmp directory
COPY myfile2.txt /tmp
4. tree
を実行して、新しいイメージをビルドするために必要なすべてのファイルを確認します 指図。 Dockerfile、myfile1.txt、およびmyfile2.txtが表示されます。 〜/ host-to-container-copy-demo ディレクトリ。
5.次に、 docker build
を実行してイメージをビルドします 指図。 t
フラグは、画像にタグを付けるために使用されます updated_ubuntu_image
latest
および。
dockerが現在の作業ディレクトリから必要なすべてのファイルを選択できるようにします。
sudo docker build -t updated_ubuntu_image:latest .
6.次に、新しくビルドされたイメージ updated_ubuntu_image
を確認します docker images
を実行する 指図。 リポジトリに注意してください 属性。この属性は、 -t
で作成されたタグです。 前のステップでフラグを立てます。
sudo docker images
7.最後に、 docker run
を実行して、新しくビルドされたイメージを使用してdockerコンテナーを実行します。 指図。 -it
flagは、コンテナのstdinに接続された疑似端末を割り当てるようにDockerに指示します。 bash
Linuxシステムのユーザーログイン用のデフォルトシェルを提供します。
sudo docker run -it updated_ubuntu_image bash
以下に、DockerコンテナのBashシェルを使用していることがわかります。
8.次に、ディレクトリ / tmpのコンテナにファイルが正常にコピーされたかどうかを確認します。 および/usr / share ls
を実行する 指図。
Dockerボリューム
を使用したファイルへのアクセス コマンド
これまで、 docker cp
を使用して、2つの異なるアプローチを使用してホストからコンテナにファイルをコピーする方法を学習しました。 コマンドとDockerFile 。今回は、 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
を実行して、ボリュームが正常に作成されたことを確認します 指図。 dockervolumelsコマンドはボリュームを一覧表示します。 docker volume ls
を実行した後 コマンドを実行すると、 my-vol
が表示されます。 ボリュームが正常に作成されたことを確認するVOLUMENAME属性。
sudo docker volume ls
3.次に、 docker run
を使用してコンテナを実行します コマンド。
-
volume_testing
という名前のコンテナnginx:latest
を使用します 画像。 -
d
flagはコンテナをバックグラウンドで実行し、削除されるまで存続させます。 -
v
フラグはボリュームをマウントしますmy-vol
Dockerホスト上でコンテナの宛先/app
に作成されます ディレクトリ。
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
4. docker inspect
を使用して、以前に作成したボリュームmy-volがコンテナーに正しくマウントされているかどうかを確認します。 指図。 Docker inspectコマンドは、コンテナーの情報を提供します。 docker inspect
を実行した後 コマンドを実行すると、指定したコンテナのすべての詳細が表示されます( volume_testing
)以下に示すように、マウントの詳細を含む詳細。
sudo docker inspect volume_testing
以下の画像スナップショットは、ボリューム( my-vol
)ホスト上に作成したものは、コンテナの / app
で正常にマウントされます ディレクトリ。
このチュートリアルでは、Docker cpコマンド、Dockerボリュームコマンド、Dockerfileを使用するなど、Dockerホストからコンテナーにファイルまたはフォルダーをコピーするさまざまな方法を学習しました。
では、ホストからDockerコンテナにデータをコピーするときに、次にどのアプローチを使用しますか?