はじめに
前回の記事では
Dockerレジストリにあるイメージを pull してそのイメージを使用してコンテナを立てました。
このようにレジストリで提供されている Docker イメージを使用してコンテナをたてることもできますが、
自分で手を加えて自分の使いたい形でコンテナをたてることもできます。
対象読者
-
Dockerfile
を作成してimage
の作成を試したい方」 -
Docker instruction
にどのようなものがあるか知りたい方
目次
Dockerfile
Dockerfile
とは Dockerイメージ の設計図となるもので
テキストファイル形式で作成してそのファイルからイメージを作成することができます。
Sample
イメージを作成するために実際に Dockerfile
を作成していきます。
適当なディレクトリに移動してそのなかで Dockerfile
を作成します。
ディレクトリ内は Dockerfile
のみにします。
(後に出てくるビルドコンテキストというものでカレントディレクトリを指定することが多いため。)
(※ .dockerignore
を作成しファイルパスを記述すれば大丈夫なようです。)
touch Dockerfile
# あとで使用したい copy.txt を作成し編集しておく。
touch copy.txt
# ここではわかりやすいように以下のような文字列を入れておく。
[COPY]でコピーしたファイルです。
# 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
を書きましたが
この Dockerfile
を docker 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.txt
と RUN
命令で作成した 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つは命令はどちらものコンテナ起動時になんのコマンドを実行するのかを決めるコマンド。
-
ENTRYPOINT
はdocker run
時にデフォルトコマンドの上書きができない。 -
上書きできるのは
CMD
で書いた部分のみ
(※ ENTORYPOINT
でコマンドを指定した場合は CMD ["パラメータ1", "パラメータ2"]
と指定することができます。)
参考文献
ADD と COPY の違い
どちらもファイルやフォルダのコピーができる。
違いとしては下記がある。
-
ADD
はコピー時に圧縮ファイルを解凍する -
COPY
はしない
参考文献
後片付け
使用していないイメージコンテナを削除していきます。
docker image prune
docker system prune
おわりに
Dockerfile
の理解をすることによって自分で Dockerfile
を書くことができますし、
プロジェクトで使用している内容を理解することもできるようになります。
とはいえ、馴染みのない instruction
がでてきたり、応用的な使用をしていたりするとその都度調べることにはなります。ただ、基礎的なところを抑えておけば全く読めないということはなくなりますし、メンタル的にも良いかなとも思っています。