Dockfile イメージビルド
チートシート
----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
# これはコメント行
FROM amazonlinux:2023
RUN yum install -y nginx
COPY index.html /usr/share/nginx/html
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
前提条件
-
本ページの説明は、以下のページに記載されれているDocker基本用語とDockerコマンドを理解している人向けに説明しています。
Docker とは?Dockerとはコンテナ仮想化技術を利用してアプリケーションやサーバ環境などをパッケージ化するツールで、アプリケーションの実行依存関係を一つのコンテナにまとめて隔離された環境で実行できます。palette-code.comDocker 基本コマンド操作Dockerイメージ/コンテナの基本操作(取得・作成・削除、起動・停止)を中心に最低限覚えておいておくべきコマンド11つを実例を踏まえて解説します。palette-code.com -
Docker実行環境を構築したい方は場合は以下のページを参考にしてください。
Docker インストール手順Dockerはコンテナ仮想化技術を利用して各種環境をパッケージ化するツールです。ここではOS毎(Windows、Mac、Linux)にはDockerをインストールする方法について解説します。palette-code.com -
本ページ内容は以下で動作確認を行っています。
項目 値 ホストOS Amazon Linux 2 コンテナ Docker 20.10.3
Dockerfileとは?
-
Dockerfileとは、Dockerイメージを構築するためのテキストファイルです。
-
Dockerfileは、Dockerイメージの構築手順を記載するDockerイメージの設計図みたいなものです。
-
Dockerfileでイメージ構築(イメージビルド)における作業は以下の2ステップです。
- Dockerfile作成
- Dockerイメージビルドコマンド実行
-
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
-
Dockerfileによるイメージビルドの解説に入る前に、まずは実際にDockerfileでイメージビルドしてDockerコンテナ作成する流れを説明します。
-
まずは事前準備です。
Dockerfile
とindex.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
-
前手順で準備は完了です。以下のコマンドを実行して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
-
Successfully built f0e3055d63ba
(f0e3055d63ba
はイメージIDでビルド毎に変わります)と表示されビルドに成功したことが確認できます。
Dockerイメージ一覧確認コマンドで、イメージビルドで作成されたDockerイメージが確認できます。f0e3055d63ba
はイメージIDであることが以下の結果から読み取れますね。
Dockerイメージ一覧確認docker image ls
実行結果REPOSITORY TAG IMAGE ID CREATED SIZE myrepository/nginx latest f0e3055d63ba 1 minutes ago 247MB
-
Dockerイメージが作成できたので、つづいて以下のコマンドでDockerコンテナを作成します。
Dockerコンテナ作成docker container run -d -p 9000:80 myrepository/nginx
実行結果c8da21451fa01fa6c815dfef7a560cdf27d03d638812b4c27eca0937fd9d5064
-
Dockerコンテナ一覧確認コマンドで、Dockerコンテナが作成(&起動)されたかを確認できます。
STATUS
がUp ~
となっており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
-
最後にブラウザで「http://localhost:9000/」にアクセスすると以下のようなページが表示されNginxサーバが起動していることが確認できます。
Dockerfile命令解説
Dockerfile命令一覧
Dockerfileに記載できる命令には以下のようなものがあります。
命令 | 説明 | |
---|---|---|
FROM | イメージビルド時のベースとなるDockerイメージ(ベースイメージ)を指定します。 | |
書式 | FROM イメージ名[:タグ名] | |
記述例 | FROM centos:7 | |
RUN | ベースイメージ上で実行するコマンドを指定します。 | |
書式 | RUN コマンド内容 | |
記述例 | RUN echo $HOME | |
ADD | ソース(ファイル、ディレクトリ、URL)をベースイメージ上の格納先にコピーします。 | |
書式 | ADD 配置元 配置先 | |
記述例 | ADD index.html /var/www/html/index.html | |
COPY | ソース(ファイル、ディレクトリ)をベースイメージ上の格納先にコピーします。 | |
書式 | COPY 配置元 配置先 | |
記述例 | 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 echo $HOME | |
ENTRYPOINT | 「docker container run」実行時に実行されるコマンドです。 | |
書式 | ENTRYPOINT ["実行プロセス","引数1","引数2"] | |
記述例 | ENTRYPOINT 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をもとにDockerイメージビルド実行したい場合は以下のコマンドを実行します。
コマンド書式:Dockerイメージビルドdocker image build [オプション] Dockerfileファイルパス
オプション 説明 -t イメージ名:タグ
の形式で作成するイメージ名とタグを指定します。:タグ
部分は省略可能です。NoteカレントディレクトリにDockerfile
が存在する状態であれば「Dockerfile格納ディレクトリパス」部分は.
を指定します。 -
(カレントディレクトリに
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
Notemyrepository/nginx
部分はイメージ名にあたる部分で任意の名称を付与できます。もしDockerリポジトリへの登録予定があるのであればリポジトリ名/イメージ名
の書式で記載しておくとよいでしょう。リポジトリ名
が指定されていないとdocker image push
が実行できません。 -
Dockerfile
がカレントディレクトリに存在せず、例えば./docker/Dockerfile
に配置されている場合は、以下のとおりファイルパスを指定することでイメージビルドできます。実行例:Dockerイメージビルド(Dockerfileパス指定)docker image build -t myrepository/nginx ./docker/
Dockerイメージレイヤ表示
-
以下のコマンドを実行すると指定したDockerイメージがビルドされた過程をSTEP(レイヤ)毎に確認することができます。
コマンド書式:Dockerイメージレイヤ表示docker image history [オプション] イメージ名
-
例えば
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
-
そのイメージに
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
NoteDockerイメージビルドの過程がStep1/4~Step4/4までありますが、その過程がイメージID毎に表示されいてることが確認できます。 具体的には、Step1/4は
ae927aa92c77
、Step2/4はa03cf7d07201
、という値になっています。
コメント