Dockfile イメージビルド

DockerfileはDockerイメージの設計書
2023-09-10
ヒーローイメージ

目次
  1. チートシート
  2. 前提条件
  3. Dockerfileとは?
  4. はじめてのDockerfile
  5. Dockerfile命令解説
  6. Dockerコマンド解説
  7. 参考情報

チートシート

Dockerコマンド
----Dockerイメージ検索----------------
## コマンド書式
docker image build [オプション] Dockerfileファイルパス
## コマンド実例
docker image build -t myrepository/nginx .
## コマンド実例(Dockerfileパス指定)
docker image build -t myrepository/nginx ./docker/Dockerfile

----Dockerイメージレイヤ表示----------------
## コマンド書式
docker image history [オプション] イメージ名
## コマンド実例
docker image history myrepository/nginx

Dockerfile
# これはコメント行
FROM amazonlinux:2023
RUN yum install -y nginx
COPY index.html /usr/share/nginx/html
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

前提条件

Dockerfileとは?

  • Dockerfileとは、Dockerイメージを構築するためのテキストファイルです。

  • Dockerfileは、Dockerイメージの構築手順を記載するDockerイメージの設計図みたいなものです。

  • Dockerfileでイメージ構築(イメージビルド)における作業は以下の2ステップです。

    1. Dockerfile作成
    2. Dockerイメージビルドコマンド実行
    Dockerfile
  • Dockerfileには、1つの操作を命令と引数にスペース区切りで1行ずつ記述します。

    Dockerfile(記載例)
    # ベースイメージ取得
    FROM amazonlinux:2023
    
    # Nginxサーバをインストール
    RUN yum install -y nginx
    
    # ホスト側のindex.htmlをコピー
    COPY index.html /usr/share/nginx/html
    https://www.youtube.com/watch?v=EsJGbHJyXYc&list=RDEsJGbHJyXYc&index=1
    # コンテナ起動時に実行するコマンド
    ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
    
    

はじめてのDockerfile

  1. Dockerfileによるイメージビルドの解説に入る前に、まずは実際にDockerfileでイメージビルドしてDockerコンテナ作成する流れを説明します。

  2. まずは事前準備です。Dockerfileindex.htmlを作成しカレントディレクトリに配置してください。

    • Dockerfile内の#ではじまる行はコメント行です。
    Dockerfile
    # ベースイメージ取得
    FROM amazonlinux:2023
    
    # Nginxサーバをインストール
    RUN yum install -y nginx
    
    # ホスト側のindex.htmlをコピー
    COPY index.html /usr/share/nginx/html
    
    # コンテナ起動時に実行するコマンド
    ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
    
    
    index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    </head>
    <body>
        <h1>palette code</h1>
    </body>
    </html>
    
    
    ファイル一覧確認コマンド
    ls -l
    実行結果(カレントディレクトリ内のファイル一覧)
    -rw-rw-r-- 1 vagrant vagrant 140 Sep  1 00:00 Dockerfile
    -rw-rw-r-- 1 vagrant vagrant 220 Sep  1 00:00 index.html
    
    
  3. 前手順で準備は完了です。以下のコマンドを実行してDockerイメージビルド(イメージ作成)します。

    Dockerイメージビルド
    docker image build -t myrepository/nginx .
    実行結果
    Sending build context to Docker daemon  16.38kB
    Step 1/4 : FROM amazonlinux:2023
    2023: Pulling from library/amazonlinux
    8c169abda7fc: Pull complete
    Digest: sha256:ba5522360eea0f350e8f4444f0d49a4df0f824037144f7412193bd87dcd5e0fc
    Status: Downloaded newer image for amazonlinux:2023
      ---> ae927aa92c77
    Step 2/4 : RUN yum install -y nginx
      ---> Running in cd2f10ab37b5
    Amazon Linux 2023 repository                     17 MB/s |  17 MB     00:00
    Last metadata expiration check: 0:00:01 ago on Mon Sep  4 12:09:08 2023.
    Dependencies resolved.
    ================================================================================
      Package               Arch     Version                     Repository     Size
    ================================================================================
    Installing:
      nginx                 x86_64   1:1.24.0-1.amzn2023.0.1     amazonlinux    32 k
    Installing dependencies:
    
    (一部省略)
    
    Complete!
    Removing intermediate container cd2f10ab37b5
     ---> 28180344fdf1
    Step 3/4 : COPY index.html /usr/share/nginx/html
     ---> fcf40727710d
    Step 4/4 : ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
     ---> Running in e9df81fb1bc3
    Removing intermediate container e9df81fb1bc3
     ---> f0e3055d63ba
    Successfully built f0e3055d63ba
    Successfully tagged myrepository/nginx:latest
    
    
  4. Successfully built f0e3055d63baf0e3055d63baはイメージIDでビルド毎に変わります)と表示されビルドに成功したことが確認できます。
    Dockerイメージ一覧確認コマンドで、イメージビルドで作成されたDockerイメージが確認できます。

    • f0e3055d63baはイメージIDであることが以下の結果から読み取れますね。
    Dockerイメージ一覧確認
    docker image ls
    実行結果
    REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
    myrepository/nginx  latest    f0e3055d63ba   1 minutes ago   247MB
    
  5. Dockerイメージが作成できたので、つづいて以下のコマンドでDockerコンテナを作成します。

    Dockerコンテナ作成
    docker container run -d -p 9000:80 myrepository/nginx
    実行結果
    c8da21451fa01fa6c815dfef7a560cdf27d03d638812b4c27eca0937fd9d5064
  6. Dockerコンテナ一覧確認コマンドで、Dockerコンテナが作成(&起動)されたかを確認できます。

    • STATUSUp ~となっておりDockerコンテナが起動されていることが確認できます。
    Dockerコンテナ一覧確認
    docker container ls
    実行結果
    CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS          PORTS                                   NAMES
    c8da21451fa0   myrepository/nginx  "/usr/sbin/nginx -g …"   23 seconds ago   Up 22 seconds   0.0.0.0:9000->80/tcp, :::9000->80/tcp   sweet_shannon
    
  7. 最後にブラウザで「http://localhost:9000/」にアクセスすると以下のようなページが表示されNginxサーバが起動していることが確認できます。

    Nginx Welcome

Dockerfile命令解説

Dockerfile命令一覧

Dockerfileに記載できる命令には以下のようなものがあります。

Dockerfile命令一覧
命令 説明
FROM

イメージビルド時のベースとなるDockerイメージ(ベースイメージ)を指定します。
対象バージョンを指定したい場合は :タグ名 で指定することが可能です。

書式 FROM イメージ名[:タグ名]
記述例 FROM centos:7
RUN ベースイメージ上で実行するコマンドを指定します。
書式

RUN コマンド内容
RUN ["実行プロセス","引数1","引数2"]

記述例

RUN echo $HOME
RUN ["/bin/bash","-c","echo $HOME"]

ADD ソース(ファイル、ディレクトリ、URL)をベースイメージ上の格納先にコピーします。
書式

ADD 配置元 配置先
ADD ["配置元","配置先"]

記述例

ADD index.html /var/www/html/index.html
ADD ["index.html", "/var/www/html/index.html"]

COPY ソース(ファイル、ディレクトリ)をベースイメージ上の格納先にコピーします。
書式

COPY 配置元 配置先
COPY ["配置元","配置先"]

記述例

COPY index.html /var/www/html/index.html
COPY ["index.html", "/var/www/html/index.html"]

ENV 環境変数を設定します。
書式 ENV キー 値
記述例 ENV HOSTNAME sample
EXPOSE 公開ポートを設定します。
書式 EXPOSE ポート番号
記述例 EXPOSE 9000
CMD ENTRYPOINTが未指定で「docker container run」で何も指定されなかった時に実行されるコマンドです。
書式

CMD ["実行プロセス","引数1","引数2"]
CMD コマンド 引数1 引数2

記述例

CMD echo $HOME
CMD ["/bin/bash","-c","echo $HOME"]

ENTRYPOINT 「docker container run」実行時に実行されるコマンドです。
書式

ENTRYPOINT ["実行プロセス","引数1","引数2"]
ENTRYPOINT コマンド 引数1 引数2

記述例

ENTRYPOINT echo $HOME
ENTRYPOINT ["/bin/bash","-c","echo $HOME"]

USER RUN、CMD、ENTRYPOINTを実行するユーザを指定します。
書式 USER ユーザ名
記述例 USER user01
VOLUME 共有可能ボリュームをマウントします。
書式 VOLUME [パス]
記述例 VOLUME ["/path/to/directory"]
WORKDIR RUN、CMD、ENTRYPOINT、ADD、COPYの作業ディレクトリを指定します。
書式 WORKDIR パス
記述例 WORKDIR /path/to/directory
ARG ビルド時の引数を定義する。
書式 ARG 変数名[=デフォルト値]
記述例 ARG sample
LABEL Dockerイメージのメタデータにラベルを追加する。
書式 LABEL キー=値
記述例 LABEL foo="bar"
MAINAINER Dockerイメージのメタデータに著作者名を追加します。
書式 MAINAINER 名前
記述例 MAINAINER username

補足説明1:ADDとCOPYの違い

  • ホストマシン(ローカル)にあるファイルやディレクトリをイメージビルドするコンテナにコピーする命令としてADD命令COPY命令があります。
    基本的にできることは同じですが、2つの命令には以下のような違いがあります。

    • COPY命令は、イメージビルド中にローカルにあるファイル、ディレクトリ、を指定したパスに配置します。

    • ADD命令は、イメージビルド中にローカルにあるファイル、ディレクトリ、tar形式ファイル、URL指定したリモートファイル、を指定したパスに配置します。 tar形式ファイルは自動展開されます。zip形式ファイルは解凍されません。

  • COPY命令はファイルやディレクトを配置する場合、ADD命令はリモートファイルやtar形式ファイルを自動展開して配置する場合、に使用することが推奨されています。

補足説明2:CMDとENTRYPOINT

  • Dockerfileでコマンドを実行する命令としてCMD命令ENTRYPOINT命令があります。
    2つの命令には以下のような違いがあります。

    • DockerfileにCMD命令を指定した上でdocker container run実行時に新たにプロセス及び引数を指定すると、その内容で上書きされます。

    • DockerfileにENTRYPOINT命令を指定した上でdocker container run実行時に新たにプロセス及び引数を指定しても、その内容は無視されます。
      ただし--entrypointオプションを利用することで上書きすることも可能です。

  • よって以下のような使い分けをするのがよいでしょう。

    命令 説明
    CMD命令 コンテナ起動時に変更可能なデフォルトコマンドを指定する。
    ENTRYPOINT命令 コンテナ起動時に必須で実行すべきコマンドを指定する。

Dockerコマンド解説

  • 本章ではDockerイメージビルドに関連するDockerコマンドを解説していきます。
    • 本章で紹介するコマンドやオプションは一部です。全ての内容を把握したい場合は、本ページ内の参考情報より公式情報を参照してください。

Dockerイメージビルド

Dockerfile
  1. DockerfileをもとにDockerイメージビルド実行したい場合は以下のコマンドを実行します。

    コマンド書式:Dockerイメージビルド
    docker image build [オプション] Dockerfileファイルパス
    オプション 説明
    -t イメージ名:タグの形式で作成するイメージ名とタグを指定します。:タグ部分は省略可能です。
    Note
    カレントディレクトリにDockerfileが存在する状態であれば「Dockerfile格納ディレクトリパス」部分は.を指定します。
  2. (カレントディレクトリにDockerfileがある状態で)Dockerイメージビルドする場合は以下の通り実行します。-tオプションでイメージ名を指定しています。

    実行例:Dockerイメージビルド
    docker image build -t myrepository/nginx .
    実行結果
    Step 1/4 : FROM amazonlinux:2023
     ---> ae927aa92c77
    Step 2/4 : RUN yum install -y nginx
    ---> Running in 679467867f9f
    Amazon Linux 2023 repository                     16 MB/s |  17 MB     00:01
    Last metadata expiration check: 0:00:01 ago on Sat Sep  9 14:37:13 2023.
    Dependencies resolved.
    ================================================================================
      Package               Arch     Version                     Repository     Size
    ================================================================================
    Installing:
      nginx                 x86_64   1:1.24.0-1.amzn2023.0.1     amazonlinux    32 k
    Installing dependencies:
    
    (一部省略)
    
    Complete!
    
    Removing intermediate container 679467867f9f
     ---> a03cf7d07201
    Step 3/4 : COPY index.html /usr/share/nginx/html
     ---> cf62cf1e7970
    Step 4/4 : ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
     ---> Running in 60c6a3f5d49c
    Removing intermediate container 60c6a3f5d49c
     ---> 61f7dcd8a65e
    Successfully built 61f7dcd8a65e
    Successfully tagged myrepository/nginx:latest
    
    
    Note

    myrepository/nginx部分はイメージ名にあたる部分で任意の名称を付与できます。もしDockerリポジトリへの登録予定があるのであればリポジトリ名/イメージ名の書式で記載しておくとよいでしょう。リポジトリ名が指定されていないとdocker image pushが実行できません。

  3. Dockerfileがカレントディレクトリに存在せず、例えば./docker/Dockerfileに配置されている場合は、以下のとおりファイルパスを指定することでイメージビルドできます。

    実行例:Dockerイメージビルド(Dockerfileパス指定)
    docker image build -t myrepository/nginx ./docker/

Dockerイメージレイヤ表示

Dockerfile
  1. 以下のコマンドを実行すると指定したDockerイメージがビルドされた過程をSTEP(レイヤ)毎に確認することができます。

    コマンド書式:Dockerイメージレイヤ表示
    docker image history [オプション] イメージ名
  2. 例えばdocker image buildを実行した結果、以下のとおりに結果が出力された(ビルドされた)イメージがあったとします。

    Sending build context to Docker daemon  16.38kB
    Step 1/4 : FROM amazonlinux:2023
    (一部省略)
      ---> ae927aa92c77Step 2/4 : RUN yum install -y nginx
    (一部省略)
     ---> a03cf7d07201Step 3/4 : COPY index.html /usr/share/nginx/html
     ---> cf62cf1e7970Step 4/4 : ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
    (一部省略)
     ---> 61f7dcd8a65eSuccessfully built f0e3055d63ba
    Successfully tagged myrepository/nginx:latest
    
    
  3. そのイメージにdocker image historyを実行すると以下のような結果が得られます。

    実行例:Dockerイメージレイヤ表示
    docker image history myrepository/nginx
    実行結果
    IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
    61f7dcd8a65e   3 minutes ago   /bin/sh -c #(nop)  ENTRYPOINT ["/usr/sbin/ng…   0Bcf62cf1e7970   3 minutes ago   /bin/sh -c #(nop) COPY file:40334528ebcf7343…   220Ba03cf7d07201   3 minutes ago   /bin/sh -c yum install -y nginx                 103MBae927aa92c77   10 days ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B<missing>      10 days ago     /bin/sh -c #(nop) COPY dir:5aeab1edfeaa75610…   144MB
    
    
    Note

    Dockerイメージビルドの過程がStep1/4~Step4/4までありますが、その過程がイメージID毎に表示されいてることが確認できます。 具体的には、Step1/4はae927aa92c77、Step2/4はa03cf7d07201、という値になっています。

参考情報

Dockerfile reference | Docker Docs
Dockerfile reference link Docker can build images automatically by reading the instructions from a Dockerfile.
docs.docker.com
リンクカード
docker | Docker Documentation
docker: The base command for the Docker CLI.
docs.docker.com
リンクカード

コメント


Palette Codeなるべく丁寧にプログラミング関連技術を解説するサイト