このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Dockerfileからボリュームを作成する①

ここでは、Dockerfileからイメージを作成して、コンテナにボリュームをマウントさせていきます。

少し長くなりますので、2部に分けて解説します。

イメージの作成

Dockerfileからボリュームを作成する手順は次の通りです。

・Dockerfileを作成する

 最初に、ボリュームを作成するためのDockerfileを作成します。このDockerfileには、ボリュームをマウントするためのディレクトリを作成する命令を含める必要があります。

・作業ディレクトリに移動

作業ディレクトリに移動します。

・「cd desktop/docker」と入力します。

PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker>
・「volume-test」ディレクトリを作成

Dockerfile を格納する「volume-test」ディレクトリを作成します。

・「mkdir volume-test」コマンドを実行します。

「volume-test」ディレクトリが作成されます。

PS C:\Users\joeac\Desktop\docker> mkdir volume-test

    Directory: C:\Users\joeac\Desktop\docker

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2024/03/24     2:39                volume-test

「volume-test」ディレクトリに移動します。

・「cd volume-test」と入力します。

PS C:\Users\joeac\Desktop\docker> cd volume-test
PS C:\Users\joeac\Desktop\docker\volume-test>
・Dockerfileの作成

イメージをビルドするための「Dockerfile」を作成します。

VSCodeを起動します。

・「code Dockerfile」を実行します。

PS C:\Users\joeac\Desktop\docker\volume-test> code Dockerfile

VSCodeが起動します。

次のようなDockerfileを作成します。

・以下の内容を入力して保存します。

FROM ubuntu:latest

# ボリュームをマウントするためのディレクトリを作成
RUN mkdir /app
RUN echo "This is App Data" > /app/sample.txt
VOLUME /app

# その他の設定や命令

Dockerfileの各行の解説を表形式でまとめます。

行番号コマンド解説
1FROM ubuntu:latestUbuntuの最新バージョンをベースに新しいイメージを作成
2RUN mkdir /appコンテナ内に「/app」ディレクトリを作成
3RUN echo “This is App Data” > /app/sample.txt/app/sample.txt」にテキストを書き込む。
4VOLUME /app/app」ディレクトリをボリュームにマウント
5その他の設定や命令ボリューム以外の設定や命令はここに含まれる。
Dockerfileの各行の解説

 作成したディレクトリをボリュームにマウントするために、「VOLUME」命令を使用します。これにより、Dockerイメージのボリュームとしてマークされ、後でコンテナを作成する際にマウントポイントとして使用されます。

 Dockerfile内でボリュームを作成することはできません。代わりに、後で「docker run」コマンドでボリュームを作成して、それをコンテナにマウントします。

・イメージのビルド

【コマンド】
docker build -t volume-test .

このコマンドの意味は以下のとおりです。

コマンド解説
docker buildDockerイメージをビルドするためのコマンド
-t volume-test作成されるイメージに「volume-test」というタグを付ける
.カレントディレクトリにあるDockerfileを使用してビルドする
イメージのビルド

 このコマンドは、カレントディレクトリにあるDockerfileを使用して、「volume-test」という名前のイメージをビルドします。

 以下のコマンドを実行します。「volume-test」というイメージを作成して、作成したイメージを確認します。

  • 「docker build -t volume-test .」コマンド
  • 「docker image ls」コマンド
PS C:\Users\joeac\Desktop\docker\volume-test> docker build -t volume-test .
[+] Building 0.7s (7/7) FINISHED                                                                              docker:default
 => [internal] load build definition from Dockerfile                                                                    0.0s
 => => transferring dockerfile: 244B                                                                                    0.0s
 => [internal] load .dockerignore                                                                                       0.0s
 => => transferring context: 2B                                                                                         0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                                                        0.0s
 => [1/3] FROM docker.io/library/ubuntu:latest                                                                          0.0s
 => [2/3] RUN mkdir /app                                                                                                0.2s
 => [3/3] RUN echo "This is App Data" > /app/sample.txt                                                                 0.5s
 => exporting to image                                                                                                  0.0s
 => => exporting layers                                                                                                 0.0s
 => => writing image sha256:8dc22bfe5e96255809e4826b572f6f88a7e6c9447d3dfc58ea085922064aaba1                            0.0s
 => => naming to docker.io/library/volume-test                                                                          0.0s

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview
PS C:\Users\joeac\Desktop\docker\volume-test> docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
volume-test   latest    8dc22bfe5e96   About a minute ago   77.9MB
ubuntu        latest    ca2b0f26964c   3 weeks ago          77.9MB
busybox       latest    ba5dc23f65d4   10 months ago        4.26MB

「volume-test」イメージが作成されていることが確認できます。

・ボリュームの確認

作成されているボリュームを確認します。

・「docker volume ls」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\volume-test> docker volume ls
DRIVER    VOLUME NAME
local     vol1

「app」ボリュームは、まだ、作成されていないことが確認できます。

Dockerfileを元にビルドしてもボリュームは作成されないことが分かります。

代わりに、後で「docker run」コマンドでボリュームを作成して、それをコンテナにマウントします。

コンテナの作成と実行

 作成した「volume-test」を使用してコンテナを作成し実行します。この際に、ボリュームが自動的に作成され、指定されたディレクトリがボリュームにマウントされます。

docker run -v app:/app –rm -it volume-test

コマンドの意味は下表のとおりです。

コマンドパーツ説明
docker runDockerコンテナを実行するためのコマンド
-v app:/appホストマシンの「app」ディレクトリをコンテナ内の「/app」ディレクトリにマウントする
–rmコンテナが終了したら自動的に削除する
-it対話的なセッションを確立し、端末に出力を提供する
volume-test使用するDockerイメージの名前
コンテナへボリュームをマウント

 このコマンドは、ホストマシンのappディレクトリをDockerコンテナ内の/appディレクトリにマウントし、そのコンテナを実行します。コンテナが終了すると自動的に削除され、対話的なセッションが提供されます。

・「docker run -v app:/app –rm -it volume-test」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\volume-test> docker run -v app:/app --rm -it volume-test
root@886405c9123d:/#

以下のコマンドを実行して、ファイルの書き込みと読み込みを行います。

  • 「cd /app」コマンド
  • 「cat sample.txt」コマンド
root@886405c9123d:/# cd app
root@886405c9123d:/app# cat sample.txt
This is App Data
root@886405c9123d:/app#

コンテナとボリュームの関係

コンテナとボリュームとの関係を確認します。

以下のことを確認します。

コンテナは消滅してもボリュームは残る。

・コンテナの終了

・「exit」コマンドを実行します。

 「–rm」オプションを指定して、「docker run」コマンドを実行したので、コンテナは削除されるはずです。

root@886405c9123d:/app# exit
exit
PS C:\Users\joeac\Desktop\docker\volume-test>
・コンテナの確認

・「docker container ls -a」

PS C:\Users\joeac\Desktop\docker\volume-test> docker container ls -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
・ボリュームの確認

・「docker volume ls」コマンドを実行します。

PS C:\Users\joeac\Desktop\docker\volume-test> docker volume ls
DRIVER    VOLUME NAME
local     app
local     vol1

ボリュームが存在することが分かります。

 この続きは「Dockerfileからボリュームを作成する②」で、別のコンテナを作成して「app」ボリュームにマウントしていきます。