【Docker】ファイルコピー、ボリューム、コンテナ内でのコマンド実行
どうもこんにちは、
今回は、Dockerコンテナ-ホストPC間でのファイルコピー、ボリュームマウント等について学んでいきます。
目次
ファイルコピー
DockerコンテナからローカルPCへファイルをコピーしたり、ローカルPCからDockerコンテナへファイルをコピーしたりするには、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行目を追記しました)
1 2 3 |
<html><body><h1>It works!</h1> <p>This is docker study test page!!!</p> </body></html> |
さて、このindex.htmlファイルをコンテナへコピーします。
以下コマンドを実行します。
docker cp /usr/ユーザー名/docker_study/apache/index.html apa000ex1:/usr/local/apache2/htdocs
これで、編集したindex.htmlファイルをコンテナへコピーできたはずです。
実際にコンテナ(Apache Webサーバー)にアクセスして編集したhtmlファイルが表示できるか確認します。
ブラウザで以下にアクセスします。
http://localhost:8080
ちゃんと表示できました。
ボリュームのマウント
次にDockerコンテナにボリュームをマウントする方法を説明します。
ボリュームは、ハードディスクなどのストレージの一部分で、マウントというのは、取り付けるという意味です。
要は、ストレージの一部分をコンテナに取り付けて、コンテナがアクセスできるようにするという意味です。
ボリュームマウントのやり方は
ボリュームマウントは、Docker Engineが管理している領域のボリュームがマウントされます。
DockerEngineが管理してくれるため手軽に使えますが、直接操作がしづらいという特徴があります。
絶対消したくないファイルやあまり更新しないファイルなどはこちらのマウント方法が良いかもしれません。
バインドマウントは、ホストPC側のあるディレクトリをマウントしますので、直接操作しやすいです。
頻繁にアクセスする場合はこのマウント方法のほうが良いかもしれません。
ただし、簡単に操作できるため、誤って消したりする可能性もあります。
2つのマウント方法をまとめておきます。
・Docker Engineが管理している領域内にマウント→直接操作しずらい
<用途例>
・ホストPC側のディレクトリをマウント
<用途例>
バインドマウント
早速コマンドでバインドマウントをやってみます。
コマンドは、-vオプションを使います。
上記でホスト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を作りました)
1 2 3 4 |
<html><body><h1>It works!</h1> <p>This is docker study test page!!!</p> <p>Hello world!!!!!</p> </body></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というコマンドを使います。
itオプションのiは、標準入力でコンテナへ接続するためのオプション。tは、疑似ターミナルを割り当てるオプションです。
要はコンテナ内でコマンド入力を可能にするためのオプションです。
/bin/bashは、Linuxコマンドを伝えるためのシェルと呼ばれるプログラムです。
では、Apacheコンテナ(コンテナ名:apa000ex1)に入ってみましょう。※事前にdocker runでコンテナは起動しています。
docker exec -it apa000ex1 /bin/bash
これでコンテナ内に入れました。
コンテナ内で、Linuxコマンドを色々入力してコンテナを改造できます。
最後に
ということで、今回はファイルコピーやボリューム等を操作してみました。
実際に色々操作しているとだんだんDockerの理解が深まったきました。
また色々触りながら勉強していこうと思います。
それでは!
スポンサーリンク