自由気ままに書いちゃおう

好きなことをつらつらと・・・

【Docker】Dockerホストのディレクトリをマウントする

前回、docker cp コマンドでのindex.htmlの転送(更新)を行いました。

www.guri2o1667.work

今回は、docker cp コマンドを利用せず、
違った方法でapache1サーバのindex.htmlを修正しようと思います。

■やりたいこと

Dockerホストの任意のディレクトリをapache1サーバの特定ディレクトリにマウントすることで、Dockerホスト上での修正をそのままapache1サーバで利用します。

■注意点

「Dockerホスト上のディレクトリをapacheサーバでマウントします。」と書くと、
若干Linux観点で解釈しようとするとハマるので、
先にマウント仕様について少し記載致します。

「Dockerホスト上のディレクトリをapacheサーバでマウントする」と記載した場合、
"apacheサーバがDockerホストのディレクトリを利用する" というイメージが近いです。

少し違った表現をすると、
"Dockerホスト上のディレクトリが共有ディレクトリになっており、そこをapacheサーバが利用している"
と言った感じが近いかと。

なので、何が言いたいかと言うと、
Dockerホストからもapacheサーバからもディレクトリ操作が可能
ということです。

少し横道にそれましたが、以降から本題です。

■手順概要

Dockerホスト上で任意のディレクトリを作成し、apache1サーバ起動時にDockerホスト上の任意のディレクトリをマウントさせます。

■手順

1.Dockerホスト上に任意のディレクトリを作成し、そこにindex.htmlを作成します。
今回は、Dockerホスト上に/var/tmp/apache1およびapache1/index.htmlを作成し、
index.htmlの中身は「/var/tmp/apache1 directory index.html」としました。

f:id:guri2o1667:20210520141822p:plain

/var/tmp/apache1ディレクトリの権限とindex.htmlの権限は以下の通りです。

f:id:guri2o1667:20210520143121p:plain


2.apache1サーバを作成します。
作成時にDockerホスト上の/var/tmp/apache1ディレクトリをマウントします。

docker run -itd --name apache1 -v /var/tmp/apache1:/usr/local/apache2/htdocs -p 8081:80 httpd:2.4

f:id:guri2o1667:20210520142353p:plain

3.apache1サーバにブラウザからアクセスします。
「/var/tmp/apache1 directory index.html」と表示されていればOKです。

f:id:guri2o1667:20210520142525p:plain

4.Dockerホストから/var/tmp/apache1/index.htmlを修正します。
「/var/tmp/apache1 directory index.html 2」と修正しました。

f:id:guri2o1667:20210520142716p:plain

5.apache1サーバにブラウザからアクセスします。
「/var/tmp/apache1 directory index.html 2」と表示されていればOKです。

f:id:guri2o1667:20210520142815p:plain

■マウントしているディレクトリをコンテナ上から操作してみる

Dockerホスト上でマウントしたディレクトリ(/var/tmp/apache1/)内のindex.htmlを更新することで、apache1サーバの/usr/local/apache2/htdocs/index.htmlが更新されることは前述の手順でわかりました。

では、今度はapache1サーバにログインして/usr/local/apache2/htdocs/内を更新してみます。

docker exec -it apache1 /bin/bash
pwd
ls -la
cd /htdocs;pwd
ls -la
cat index.html

f:id:guri2o1667:20210520143512p:plain

では実際にindex.htmlを修正してみます。
※viコマンドがapacheサーバにインストールされていなかったので、
echoで流しました。

f:id:guri2o1667:20210520143720p:plain

ブラウザからアクセスしても、更新されていることを確認できました。
f:id:guri2o1667:20210520143749p:plain

では、今度はindex2.htmlと言うファイルを作成します。
作成もできますね。

f:id:guri2o1667:20210520143851p:plain


一度、apache1サーバからログアウトします。

f:id:guri2o1667:20210520143940p:plain


Dockerホスト上からindex2.htmlが確認できるか見てみます。

f:id:guri2o1667:20210520144033p:plain

きちんとindex2.htmlが存在することを確認できました。

では、apache1サーバを停止&削除します。

f:id:guri2o1667:20210520144129p:plain

f:id:guri2o1667:20210520144347p:plain

ブラウザからアクセスできないことも念のため確認します。

f:id:guri2o1667:20210520144214p:plain

では、新しくapache2サーバを作成します。
作成時にDockerホスト上の/var/tmp/apache1をマウントします。

docker run -itd --name apache2 -v /var/tmp/apache1:/usr/local/apache2/htdocs -p 8082:80 httpd:2.4

f:id:guri2o1667:20210520144527p:plain

ブラウザから8082番ポートへアクセスしてみます。

f:id:guri2o1667:20210520144601p:plain

apache1サーバで使っていたindex.htmlを利用して、
apache2サーバを動作させることができました。

■起動中のコンテナにてDockerホストをマウントしたい

残念ながらできません。
コンテナを作り直す必要があります。




以上です。