【Docker】第6回 マウントについて(volume)


Dockerで「ボリュームマウント」を使う


前回に引き続き、Dockerにおける「マウント」についてです。
今回は「ボリュームマウント」を確認していきます。


ボリュームマウントはDockerが管理している領域上のデータをコンテナへマウントする機能です。
複数のコンテナでボリュームの共有を行うことができ、バインドマウントよりもバックアップやマイグレーションが行いやすい、という利点があります。

ボリューム作成とコンテナへのマウント


それでは実際に手順を確認してみます。

1.まず、状態をわかりやすくするために起動中のコンテナがあるか確認しましょう。

docker ps -a


起動中のコンテナがあるなら、一度全て停止&削除しておきます。

※今までは「stop [コンテナID] → rm [コンテナID]」と2回コマンドを実行していましたが、
以下の様に1ライナーで「全てのコンテナを一括停止&削除」する方法があります。

 
docker rm -f `docker ps -a -q`

 

「docker ps -a -q」で全コンテナのIDを取得します。
(-aオプションで全てのコンテナを、-qオプションでIDのみを出力します)

②上記の①で得たIDを「docker rm」します。
(-fオプションで稼働中のコンテナも強制削除できます)


2.次に、Docker上に存在しているボリュームを確認してみます。
コマンドは「volume ls」です。

docker volume ls


何も作成されていない状態だと思いますが、もしあれば削除しておきます。

 
docker volume rm [ボリューム名]

※こちらもコンテナの削除と同様、一括削除することができます。

 
docker volume rm `docker volume ls -q`

 

「docker volume ls -q」で全ボリュームの名前を全て取得します。
(-qオプションで名前のみを出力します)

②上記の①で得た名前を「docker volume rm」します。


3.ここから、実際にボリュームを作成していきます。「vol_test」というボリューム名にしました。

docker volume create vol_test


「volume ls」コマンドで確認します。

 
docker volume ls

 

DRIVER  VOLUME NAME
local   vol_test


ボリュームの詳細情報を参照するには、「volume inspect」コマンドです。

 
docker volume inspect vol_test

 

[
  {
   "CreatedAt": "2019-02-19T16:00:53+09:00",
   "Driver": "local",
   "Labels": {},
   "Mountpoint": "/var/lib/docker/volumes/vol_test/_data",
   "Name": "vol_test",
   "Options": {},
   "Scope": "local"
  }
]


"Mountpoint"が指しているパスが、ボリュームの実体があるホスト上の場所です。「/var/lib/docker/volumes/[ボリューム名]/_data」となります。


4.いよいよ、ボリュームマウントを指定してのコンテナ起動を行ってみます。

 
docker run -d --rm --name=httpd_vol -p 8080:80 --mount type=volume,
src=vol_test,dst=/usr/local/apache2/htdocs/ httpd


-d、-pオプションは今までと同じですが、今回は「--name」を指定しておきます。
また、「--rm」オプションはコンテナ停止時に削除する、という指定です。


前回は「--mount type=bind」でしたが、今回は「type=volume」です。
「src」には作成したボリューム名を、「dst」にはマウントするコンテナ側のパスを記述します。
コンテナが起動したら、inspectコマンドでコンテナの詳細情報を確認してみます。

 
docker inspect [コンテナID]


途中に、以下の記述が発見できるはずです。

 "Mounts": [
  {
   "Type": "volume",
   "Source": "vol_test",
   "Target": "/usr/local/apache2/htdocs/"
  }
 ]


次にコンテナの内部で以下のコマンドを実行し、index.htmlファイルを編集してみます。

 
docker exec -it httpd_vol /bin/bash   ←コンテナの内部に入る
apt-get update                          ←パッケージの更新
apt-get install vim             ←最新vimをインストール
vi /usr/local/apache2/htdocs/index.html ←index.htmlを編集

 

<html><body><h1>using httpd volume!</h1></body></html>


Webブラウザでページを確認すると、編集内容で更新されているはずです。


5.ここまで確認できたら、
一度コンテナを削除⇒再度マウント指定してコンテナの起動を行ってみます。

 
docker rm -f httpd_vol
docker run -d --name=httpd_vol -p 8080:80 --mount type=volume,src=vol_test,dst=/usr/local/apache2/htdocs/ httpd


コンテナ起動後にWebブラウザでページを確認すると、先ほどの編集内容が残っていることが確認できます。


今まではコンテナを破棄するとコンテナ内部のリソースも破棄されていましたが、マウントによりボリューム領域上に編集内容を残しておくことができました。

Dockerfileからのボリュームマウント


続いて、Dockerfile上でボリュームマウントを指定する方法を見ていきます。


まず新規にDockerfileを作成します。「Dockerfile_httpd_volume」という名前にしました。

 
touch Dockerfile_httpd_volume


内容はこのようにします。「RUN」の記述箇所で編集済みindex.htmlを用意し、「VOLUME」の記述箇所でマウントの記述も追加します。

#--------------------------------------------------------------
# ベースイメージを指定
#--------------------------------------------------------------
FROM httpd:latest

#--------------------------------------------------------------
# イメージの作成者
#--------------------------------------------------------------
MAINTAINER PublicRelations

#--------------------------------------------------------------
# 環境変数
#--------------------------------------------------------------
ENV DIRPATH /usr/local/apache2

#--------------------------------------------------------------
# ワークディレクトリ指定
#--------------------------------------------------------------
WORKDIR $DIRPATH/htdocs

#--------------------------------------------------------------
# index.htmlを編集する
#--------------------------------------------------------------
RUN : "index.htmlを編集" && { \
 echo "<html><body><h1>Dockerfile volume-mount httpd.container!</h1></body></html>"; \
} | tee index.html

#--------------------------------------------------------------
# Volumeマウント
#--------------------------------------------------------------
VOLUME $DIRPATH/htdocs

#--------------------------------------------------------------
# 特定のネットワーク・ポートをコンテナ実行時にリッスンさせる
#--------------------------------------------------------------
EXPOSE 80


ファイルを保存し、イメージをビルドします。

 
docker build -f ./Dockerfile_httpd_volume -t httpd_volume .

Sending build context to Docker daemon 30.72kB
Step 1/7 : FROM httpd:latest
 ---> 2a51bb06dc8b
Step 2/7 : MAINTAINER PublicRelations
 ---> Using cache
 ---> 93d34029e7e7
Step 3/7 : ENV DIRPATH /usr/local/apache2
 ---> Using cache
 ---> 37eef9269e57
Step 4/7 : WORKDIR $DIRPATH/htdocs
 ---> Using cache
 ---> 03c5a1c592e6
Step 5/7 : RUN : "index.htmlを編集" && { echo "<html><body><h1>Dockerfile volume-mount httpd.container!</h1></body></html>"; } | tee index.html
 ---> Running in 3b2bde3fe258
<html><body><h1>Dockerfile volume-mount httpd.container!</h1></body></html>
Removing intermediate container 3b2bde3fe258
 ---> fd8984998319
Step 6/7 : VOLUME $DIRPATH/htdocs
 ---> Running in e96099df2058
Removing intermediate container e96099df2058
 ---> 3bc9012421d3
Step 7/7 : EXPOSE 80
 ---> Running in f85815839795
Removing intermediate container f85815839795
 ---> d661ea287b4a
Successfully built d661ea287b4a
Successfully tagged httpd_volume:latest


成功したら、ビルドしたイメージを起動します。

※この時他のコンテナが「httpd_vol」ボリュームにマウント起動している場合、
エラーになります。先にコンテナを停止してマウントを解除しておきます。

docker run -d --name=httpd_volume -p 8080:80 httpd_volume


Webブラウザでページを確認すると、Dockerfileで編集した内容になっています。コンテナ内の記述でボリュームが上書きされています。

 

今回はDockerのボリュームマウントの確認とDockerfileへの記述方法でした。

次回は「ボリュームコンテナ」と、ボリュームのバックアップ・リストアについて確認していきます。


  お問い合わせ  - お気軽にお問い合わせください - 

  • 株式会社 パブリックリレーションズ
  • 〒064-0807
  • 北海道札幌市中央区南7条西1丁目13番地 弘安ビル5階
メールでのお問い合わせはこちら

  • この記事をシェアする