Docker初心者がDockerfileについて勉強した時のメモです。
Dockerfileとは?
- Docker imageの設計図 DockerfileからDocker imageを作る。
- Dockerfileという名のテキストファイル。
- INSTRACTION argument 形式で記載する。
- DockerfileはDockerfileという名前で必ず作る。
Dockerfileのinstruction
FROM
- ベースとなるイメージを決定する。
- DokerfileはFROMから書き始める。
- FROMの上にLayerが積み重なっていくイメージ。
- 指定するのは基本OSを指定することが多い。
Dockerfile
FROM ubuntu:latest
RUN
- Linux コマンドを実行してくれる。
- RUNを使うことで好きなようにカスタマイズできる。
- RUN毎にLayerができる。
Dockerfile
FROM ubuntu:latest
RUN touch test
RUN echo 'hello world' > test
Layerを最小限にするために
- DockerfileではRUN毎にimage Layerが作成されるので、RUNを連発するとdocker imageのサイズが大きくなってしまう。
- 解決策は、&&で繋げて1行にまとめる。バックスラッシュ( \ )で改行すると見やすくなる。
Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install\
xxx\
yyy\
apt-get update
: 新しいパッケージを取得。
apt-get install <package>
: をインストール。
cache
- RUNで一度インスールしたパッケージは、インストール後まとめておくことで後から他のパッケージをRUNで追加した時キャッシュを使ってくれる。
- キャッシュを使うことで再度実行することなく追加したパッケージ分だけRUNを実行してくれる。
この場合、新しくzzz
というパッケージを新しく追加。
※ -y
はインストール時インタラクティブな質問に対して全てyesで実行してくれる。
Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
xxx\
yyy\
RUN apt-get install -y zzz
インストール後1行にまとめることで次回からキャッシュを使ってくれる。
Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
xxx\
yyy\
zzz
CMD
- CMDはコンテナのデフォルトのコマンド。
- 原則Dockerfileの最後に記述。
CMD ["実行可能なコマンド", "コマンドの引数1", "コマンドの引数2"]
Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
xxx\
yyy\
zzz
CMD ["/bin/bash"]
RUNとCMDの違いは?
- RUNはimage Layerを作るがCMDは作らない
Dockerfileをbuildする
DockerfileをbildしてDocker imageを作る。
$ docker bulid <directory>
buildするにはそのファイルまで移動してからbuildするのが一般的。
現在いる場所(current directory)の場合は.
$ docker bulid .
buildしたimageはdangling image(noneで表示されるタグのついていないimage)なので名前をつけることができる。
$ docker build -t <name> <directory>
Dockerfile詳細
$ docker buildの挙動
build
時に指定したbuild contextをDocker demonに渡している。
Docker demon
- コンテナやdocker imegeなどDockerオブジェクトと呼ばれるものを管理もの。
- クライアントはCLIツールを使ってDocker demonにコマンドを投げそれを解釈しDocker demonがイメージのビルドやコンテナの起動などを行っている。
build context
- Dokerfileが入ったフォルダのこと。
- Docker imageをbuildする時、build contextをDocker demonに渡し、build contextの内のDockerfileと他のファイルを使ってDocker imageを作成する。
- 基本buildに使わないファイルはbuild contextに入れない。
続き
参考