15
10

More than 3 years have passed since last update.

はじめてのDockerfile

Last updated at Posted at 2021-09-05

はじめに

前回の記事では
Dockerレジストリにあるイメージを pull してそのイメージを使用してコンテナを立てました。
このようにレジストリで提供されている Docker イメージを使用してコンテナをたてることもできますが、
自分で手を加えて自分の使いたい形でコンテナをたてることもできます。

  1. ゼロから始めるDocker入門
  2. はじめてのDockerfile ←今回はここ
  3. はじめてのDocker compose

対象読者

  • Dockerfile を作成して image の作成を試したい方」
  • Docker instruction にどのようなものがあるか知りたい方

目次

Dockerfile

Dockerfile とは Dockerイメージ の設計図となるもので
テキストファイル形式で作成してそのファイルからイメージを作成することができます。

Sample

イメージを作成するために実際に Dockerfile を作成していきます。
適当なディレクトリに移動してそのなかで Dockerfile を作成します。
ディレクトリ内は Dockerfile のみにします。
(後に出てくるビルドコンテキストというものでカレントディレクトリを指定することが多いため。)
.dockerignore を作成しファイルパスを記述すれば大丈夫なようです。

ターミナル
touch Dockerfile

# あとで使用したい copy.txt を作成し編集しておく。
touch copy.txt
copy.txt
# ここではわかりやすいように以下のような文字列を入れておく。
[COPY]でコピーしたファイルです。
Dockerfile
# ubuntu image の最新をベースに
FROM ubuntu:latest

# /var/www/html で命令を実行していく(パスの指定は練習なので適当なもので大丈夫です。)
# コンテナ内に入ったときのパスにもなる
WORKDIR /var/www/html

# echo の内容を sample.txt に格納
RUN echo 'sampleです!' > sample.txt

# 前のステップで作成したテキストファイル
#     ホスト   コンテナ
COPY copy.txt copy.txt

# ubuntu の デフォルトコマンド はもとから bash だけど明示的に記述
CMD ["/bin/bash"]

dokcer build .

Dockerfile の記述が終わったら
Dockerfile があるディレクトリ内で次のコマンドを叩きます。

ターミナル
docker build .

すると Dockerfile で記述した命令がステップ毎に実行されていって
image が作成されます。

作成した image を確認します。

ターミナル
# 確認方法①
## イメージ一覧の一番上に作成したイメージがあると思います。
docker images

# 確認方法②
## docker build . したときの最後のあたりにshaからはじまる英数字の羅列の : のあと
## 少々長いですが、docker images で出るものと同じです。

build は構築、
. はビルドコンテキストと呼ばれるものです。(. はカレントディレクトリを示しています。)

docker daemon にこのビルドコンテキスト内を渡しています。
要するにイメージを作成・構築するために Dockerfile を書きましたが
この Dockerfiledocker daemon に渡している、ということです。
(ややこしくなってしまいますが、渡すのは Dockerfile だけではなくビルドコンテキスト内の全てのファイルになることに注意してください。)

dokcer build -f [PATH/Dockerfile] .

Dockerfile をカレントディレクトリに置かなくても build することができます。
それは -f フラグを使用して Dockerfile のあるパスを指定するだけです。

docker run

作成したイメージからコンテナを立ち上げてみます。
(※ 補足ですが、デフォルトコマンドを決めたので bash がなくとも docker run コマンドをしたときに自動的にシェルに入ることはできます。)

docker run -it [image Id] bash

入ったら /var/www/html にいることがわかります。

また ls コマンドで確認したときに COPY 命令でコピーした copy.txtRUN 命令で作成した sample.txt 作成されていることがわかります。

cat など使用して自分が編集した内容と一緒なのか確認もできます。

Docker instruction

instructionとは命令のことです。
Dockerfile に命令を記述し
イメージを構築していきます。

instruction 意味  使用例
FROM 基本的には Dockerfile の書き始めに使用する。用途はイメージの取得で構築するイメージのベースを指定する。 FROM <イメージ名>
RUN イメージレイヤの階層化。Linuxコマンドを実行。 RUN <コマンド>
CMD コンテナ実行時のデフォルトコマンドを指定。 CMD ["/bin/bash"]
ENV 環境変数を示す ENV <キー>=<値>
ADD 追加元ファイル・ディレクトリを追加先に追加。追加元がローカルにあり圧縮ファイルの場合展開し追加される。 ADD <追加元(src)> <追加先(container)>
COPY コピー元ファイル・ディレクトリをコピー先に追加 COPY <コピー元> <コピー先>
ENTRYPOINT docker run 時に実行される。 ENTRYPOINT ["実行ファイル", "パラメータ1", "パラメータ2"]
VOLUME ホストのファイルやフォルダのマウントポイント VOLUME ["/data"]
WORKDIRE RUNやADDなどDocker instructionが実行されるディレクトリの変更 WORKDIR /path/to/workdir

CMD と ENTRYPOINT の違い

この2つは命令はどちらものコンテナ起動時になんのコマンドを実行するのかを決めるコマンド。

  • ENTRYPOINTdocker run 時にデフォルトコマンドの上書きができない。

  • 上書きできるのは CMD で書いた部分のみ

(※ ENTORYPOINT でコマンドを指定した場合は CMD ["パラメータ1", "パラメータ2"] と指定することができます。)

参考文献

ADD と COPY の違い

どちらもファイルやフォルダのコピーができる。

違いとしては下記がある。

  • ADD はコピー時に圧縮ファイルを解凍する
  • COPY はしない

参考文献

後片付け

使用していないイメージコンテナを削除していきます。

docker image prune
docker system prune

おわりに

Dockerfile の理解をすることによって自分で Dockerfile を書くことができますし、
プロジェクトで使用している内容を理解することもできるようになります。

とはいえ、馴染みのない instruction がでてきたり、応用的な使用をしていたりするとその都度調べることにはなります。ただ、基礎的なところを抑えておけば全く読めないということはなくなりますし、メンタル的にも良いかなとも思っています。

参考文献

15
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10