今更ながらDockerについて整理してみる[Dockerfile]
経緯
手元のmacで動かすコマンド例については前回まとめました。
で、そこの最後でコンテナの中で実行したlibraryやファイルの操作をdocker commitコマンドでイメージにする方法を記載した。
でも、それだとDockerイメージの構成要素がわからなくなってしまうため、基本的にはその方法ではイメージを作成はしないようだ。
というか、実務ではそうやってイメージを作って環境設定ができたらDockerfileに清書するような感覚のようである。
ということでDockerfileについて書く
1. Dockerfileを作成する
概要
docker commitで作成したイメージは構成レイヤーがわかりづらい。 Dockerfileを使用すれば明確化できる。
まずはdocker hubのpublicイメージを元にdockerファイルをみにいく
最低限のDockerImageを作成
まずは最低限のdockerfileを書く
FROM ubuntu:latest # テストファイルを作成 RUN touch test
次にbuildのコマンドを打つ
$ docker build -t <name> <directory>
- -t
を除くと、dangling imageができる - -f ... buildcontextにDockerfileがない場合や、環境に応じてDockerfileを使い分けている場合
dirctoryはDockerfileがある場所を指す(大抵はカレントディレクトリの.でOK)
2. インストラクション
Dockerfileにおける、FROM, RUN, COMMANDなどのステートメントのこと
(1) FROM
- ベースイメージを登録
- alpine
- ubuntuなどが多い
(2) RUN
- linuxコマンドを実行
- RUN(COPY / ADD)ごとにレイヤーが作成される
- && コマンドの連結
- \で改行が可能
- レイヤーに変更がなければホスト側に残っているキャッシュが使用される
- libraryのinstall と application codeのinstallは別のlayerにした方がいい。(更新頻度が違うので)
- aptには-yオプションを入れる
FROM ubuntu:latest RUN apt-get update && apt-get install -y curl nginx
(3) CMD
CMD ["executable", "param1", "param2" ... ]
(4) COPY
- buildコンテキスト内のファイルをImageにコピーする
- 使用頻度が高い
FROM ubuntu:latest RUN mkdir /new_dir COPY something /new_dir/
(5) ADD
- ADDは高機能
- ADDの用途はtarファイルの圧縮と解凍の際に使用することが多い
- 基本的にはCOPYを使用した方がいい
FROM ubuntu:latest ADD compressed.tar /
- 参考)tar圧縮
$ tar -cvf compressed.tar sample_package/
(6) ENTRYPOINT
- docker runのときに使用するコマンドを書く
- docker run コマンドの第二引数で上書きできない
- コマンドはENTRYPOINTでオプションはCMDで書く
- CMDに書いたオプションは上書き可能
FROM ubuntu:latest RUN touch test ENTRYPOINT [ "ls" ] CMD ["--help"]
(7) ENV
環境変数をDockerImageに設定する
FROM ubuntu:latest ENV key1 value ENV key2=value ENV key3="v a l u e" key4=v\ a\ l\ u\ e ENV key5 v a l u e
(7) WORKDIR
以下のDockerfileだと3つめのRUNはrootディレクトリで実行される Image上でのworkingディレクトリを移動する。
FROM ubuntu:latest RUN mkdir sample_folder RUN cd sample_folder RUN touch sample
cdを有効にしたいなら以下
FROM ubuntu:latest WORKDIR sample_folder RUN touch sample
ディレクトリがない場合は、作成もしてくれる。
3. Dockerfileの作り方のイメージ
1.curlとnginxをinstall
FROM ubuntu:latest RUN apt-get update && apt-get install -y curl nginx
2.作成した後でcvsが必要だと気づいた場合は以下のようにRUNをわけることで、curlとnginxのinstallのレイヤーはキャッシュが使われる
FROM ubuntu:latest RUN apt-get update && apt-get install -y curl nginx RUN cvs
3.全て完了したら一つのRUNにまとめてレイヤーの圧縮を図る
FROM ubuntu:latest RUN apt-get update && apt-get install -y \ curl \ nginx \ cvs
4. docker buildコマンドについて
構成要素
- docker client
- docker daemon
- network, volume等のdocker objectとの連携を行っている
- docker host
- docker resistory
build context
- buildするときの環境
- Dockerfile以下の階層にビルドに使用しないファイルはおかない。
参考) ファイル名の取得
$ du -sh <file名>