ロボット研究開発、ソフトウェア開発、コンテンツ制作配信

【Docker】ファイルコピー、ボリューム、コンテナ内でのコマンド実行


どうもこんにちは、
今回は、Dockerコンテナ-ホストPC間でのファイルコピー、ボリュームマウント等について学んでいきます。

参考にした書籍は、以下です。
[参考書籍]
仕組みと使い方がわかる」Docker&Kubernetesのきほんのきほん
スポンサーリンク

ファイルコピー


DockerコンテナからローカルPCへファイルをコピーしたり、ローカルPCからDockerコンテナへファイルをコピーしたりするには、docker cpコマンドを使います。
docker cpの後にコピー元、コピー先を記載します。
docker cp コピー元 コピー先

コンテナからホストPCへファイルをコピー(コンテナ→ホストPC)

では、コンテナからホスト側へコピーしてみましょう。
今回もApacheのコンテナを使います。
以下でコンテナを起動します。

docker run --name apa000ex1 -d -p 8080:80 httpd

Apacheコンテナ内にあるindex.htmlファイルをホストPCへコピーしてみます。
以下を実行します。
※事前に自分のPCに/usr/ユーザー名/docker_study/apacheというディレクトリを作ってます。

docker cp apa000ex1:/usr/local/apache2/htdocs/index.html /usr/ユーザー名/docker_study/apache

実際にホストPCの/usr/ユーザー名/docker_study/apacheを確認してみます。
ちゃんと、index.htmlがコピーされていました。

ホストPCからコンテナへファイルをコピー(ホストPC→コンテナ)

次はホストPCからコンテナへファイルをコピーしてみます。
さっきコピーしてきたindex.htmlファイルを適当に編集します。(以下、2行目を追記しました)

さて、このindex.htmlファイルをコンテナへコピーします。
以下コマンドを実行します。

docker cp /usr/ユーザー名/docker_study/apache/index.html apa000ex1:/usr/local/apache2/htdocs

これで、編集したindex.htmlファイルをコンテナへコピーできたはずです。
実際にコンテナ(Apache Webサーバー)にアクセスして編集したhtmlファイルが表示できるか確認します。
ブラウザで以下にアクセスします。
http://localhost:8080

ちゃんと表示できました。

ボリュームのマウント

次にDockerコンテナにボリュームをマウントする方法を説明します。
ボリュームは、ハードディスクなどのストレージの一部分で、マウントというのは、取り付けるという意味です。
要は、ストレージの一部分をコンテナに取り付けて、コンテナがアクセスできるようにするという意味です。

ボリュームマウントのやり方はボリュームマウントバインドマウントという2つのやり方があります。

ボリュームマウントは、Docker Engineが管理している領域のボリュームがマウントされます。
DockerEngineが管理してくれるため手軽に使えますが、直接操作がしづらいという特徴があります。
絶対消したくないファイルやあまり更新しないファイルなどはこちらのマウント方法が良いかもしれません。

バインドマウントは、ホストPC側のあるディレクトリをマウントしますので、直接操作しやすいです。
頻繁にアクセスする場合はこのマウント方法のほうが良いかもしれません。
ただし、簡単に操作できるため、誤って消したりする可能性もあります。

2つのマウント方法をまとめておきます。

ボリュームマウント
・Docker Engineが管理している領域内にマウント→直接操作しずらい
<用途例>
滅多に触らないファイルとか消してはいけないファイル
バインドマウント
・ホストPC側のディレクトリをマウント
<用途例>
頻繁に更新するファイル等。(ソースコード等)

バインドマウント

早速コマンドでバインドマウントをやってみます。
コマンドは、-vオプションを使います。
-v ホストPCのディレクトリパス:コンテナの領域パス
上記でホストPC側のディレクトリとコンテナ領域のマウントされ、ファイル等が共有されます。

以下コマンドでまたApacheコンテナを起動します。
マウントしたいホストPCのディレクトリは、以下にしました。
/Users/ユーザー名/docker_study/apache02

docker run --name apa000ex2 -d -p 8081:80 -v /Users/ユーザー名/docker_study/apache02:/usr/local/apache2/htdocs httpd

では、ホストPCの/Users/ユーザー名/docker_study/apache02にindex.htmlファイルを作ってみます。(とりあえず、以下のようなindex.htmlを作りました)

再度、localhost:8081へアクセスしてみます。
ホストPC側のディレクトリとマウントされているので、ちゃんとホストPC側で変更したソースがWebサーバーに反映されています。

ボリュームマウント

以下コマンドでボリュームを作ります。

docker volume create apa000vol1

docker runコマンドでApacheコンテナを起動します。
-vオプションで、先程作ったボリューム名を指定します。コンテナ側のパスは、/usr/local/apache2/htdocsにします。

docker run --name apa000ex1 -d -p 8080:80 -v apa000vol1:/usr/local/apache2/htdocs httpd

これで、Apacheコンテナが起動しました。

volume inspectコマンドでボリュームの詳細情報を見てみます。

docker volume inspect apa000vol1
[
{
"CreatedAt": "2025-01-16T10:50:49Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/apa000vol1/_data",
"Name": "apa000vol1",
"Options": null,
"Scope": "local"
}
]

Mountpointが、
"/var/lib/docker/volumes/apa000vol1/_data"となっています。これがDockerEngineが管理しているディレクトリになります。こちらからはアクセスできないようです。

次にcontainer inspectコマンドでマウントされているかをチェックします。

docker container inspect apa000ex1
"Mounts": [
{
"Type": "volume",
"Name": "apa000vol1",
"Source": "/var/lib/docker/volumes/apa000vol1/_data",
"Destination": "/usr/local/apache2/htdocs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],

Sourceが先程volume inspectで確認したボリュームのパス、Destinationが指定したコンテナ側のパスになっていますのでマウントされていることが確認できました。

今、コンテナ内のパス/usr/local/apache2/htdocsとapa000vol1ボリュームが同期されていますので、
docker cpコマンドで/usr/local/apache2/htdocsに更新したindex.htmlをコピーしてみます。

docker cp /Users/ユーザー名/docker_study/apache/index.html apa000ex1:/usr/local/apache2/htdocs

ブラウザでアクセスしてみます。
http://localhost:8080

ページが更新されました。

さて、こちらのコンテナを停止して、コンテナ削除してみます。
ボリュームマウントを指定したので、コンテナを消しても更新したindex.htmlは残ってるはずです。
まず、コンテナを停止します。

docker stop apa000ex1

次にコンテナを削除します。

docker rm apa000ex1

これでコンテナを消しました。
以下でコンテナを消しても作成したボリュームが残っているか確認できました。

docker volume ls

では、新しいコンテナを立てて、同じボリュームをマウントしてみます。
念の為、コンテナ名はさっきと違う名前にして起動します。

docker run --name apa000ex99 -d -p 8080:80 -v apa000vol1:/usr/local/apache2/htdocs httpd

ブラウザでApacheのWebサーバーへアクセスしてみます。
http://localhost:8080

先ほど更新したindex.htmlがそのままボリュームに残っているので、さっきけしたコンテナと同じ表示が出ました。

最後にボリュームを削除しておきます。
まず、コンテナを停止します。

docker stop apa000ex99
docker rm apa000ex99

ボリュームの削除は、docker volume rmコマンドを使います。

docker volume rm apa000vol1

ボリュームのリストを確認してみます。

docker volume ls

ボリュームが削除されていることが確認できました。

以上、ボリュームマウントについて確認していきました。

コンテナに入ってコマンドを実行する方法


最後に、コンテナに入ってコマンドを実行する方法です。
docker execというコマンドを使います。
docker exec -it コンテナ名 /bin/bash

itオプションのiは、標準入力でコンテナへ接続するためのオプション。tは、疑似ターミナルを割り当てるオプションです。
要はコンテナ内でコマンド入力を可能にするためのオプションです。
/bin/bashは、Linuxコマンドを伝えるためのシェルと呼ばれるプログラムです。

では、Apacheコンテナ(コンテナ名:apa000ex1)に入ってみましょう。※事前にdocker runでコンテナは起動しています。

docker exec -it apa000ex1 /bin/bash

これでコンテナ内に入れました。
コンテナ内で、Linuxコマンドを色々入力してコンテナを改造できます。

最後に

ということで、今回はファイルコピーやボリューム等を操作してみました。
実際に色々操作しているとだんだんDockerの理解が深まったきました。
また色々触りながら勉強していこうと思います。
それでは!

スポンサーリンク

いいね!を押すと、
最新記事をお届けします。

Twitter で
関連記事(一部広告含む)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ページトップボタン