from 30

30歳からwebエンジニアになったけど、思ったよりも苦しいので、その苦闘の記録をば

今更ながらDockerについて整理してみる[Dockerfile]

経緯

手元のmacで動かすコマンド例については前回まとめました。

で、そこの最後でコンテナの中で実行したlibraryやファイルの操作をdocker commitコマンドでイメージにする方法を記載した。

でも、それだとDockerイメージの構成要素がわからなくなってしまうため、基本的にはその方法ではイメージを作成はしないようだ。

というか、実務ではそうやってイメージを作って環境設定ができたらDockerfileに清書するような感覚のようである。

ということでDockerfileについて書く

1. Dockerfileを作成する

概要

docker commitで作成したイメージは構成レイヤーがわかりづらい。 Dockerfileを使用すれば明確化できる。

まずはdocker hubのpublicイメージを元にdockerファイルをみにいく f:id:kohski:20201205162515p:plain

最低限の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" ... ]
  • デフォルトコマンドの定義
  • ubuntu:latestの場合は"/bin/bash"
  • 原則最後に記載
  • 原則一つ
  • RUNと異なりCMDはレイヤーを作らない

(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名>