Docker学習記録02(Dockerfileの書き方)

今日も今日とてDockerの学習です。 正直実務入る前なので学習モチベーション落ちてますが、動画は見てればなんとなく理解できるので今の自分にはちょうどよいです。 逆に本は相当気合い入れないと読めないのでだめだ、、、

動画見ながらのメモ書きです。

  • コンソール上だけだと、imageとコンテナがごっちゃになる
  • Dockerfileは、それを見ればどういうコンテナが作られるかが分かる設計図
  • Dockerfileからimageを作るには、$ docker build <ディレクトリ名>
  • オプションなしでbuildするとdangling image(none)
  • build, commit, run
  • コンテナからimageを作るのと、Dockerfileからimageする方が明示的
  • Dockerfileを常にアップデートしないと(誰もわからなくなる)
  • Dockerfileの書き方→FROM, RUN, CMD
  • FROMでベースとなるimageを決定→元となるimageのレイヤーの上に追加するイメージ
  • その上で、RUNでカスタマイズしていく
  • RUN毎にレイヤーが積み重なっていく→Docker imageが大きくなっていく
  • docker imageを小さくするのが大事→レイヤーを作るのはRUN, COPY, ADD
  • パッケージのインストール(Ubuntu)
    • apt-get update:新しいパッケージリストを取得(古いパッケージをインストールしないために)
    • apt-get install <パッケージ名>:指定したパッケージをインストール
  • ベストプラクティス
    • コマンドを&&でつなげる
    • \で改行する
RUN apt-get update && apt-get insatall \
xxx \
yyy \
zzz
  • キャッシュをうまく活用する(パッケージのinstallは時間がかかる)
  • キャッシュはレイヤ毎に保存される
  • キャッシュを使う時はRUNを分ける→最終的には一つにまとめる
  • CMD:コンテナのデフォルトコマンドを指定
  • CMD:Dockerfileの最後に記述
  • 構文→CMD ["executable", "pram1", "param2"]
  • 一つのDockerfileに対してCMDは一つ
  • RUNとCMDの違い→RUNはレイヤーを作るが、CMDは作らない
  • RUNで実行したコマンドはimageとして保存される(パッケージのインストールなど)
  • docker build時にフォルダを指定する理由→フォルダごとDockerデーモンに渡す
  • 指定したフォルダをbuild context(環境・状況)としてデーモンに渡す
  • Dockerのアーキテクチャは、クライアントとサーバに分かれている(あとレジストリ
  • ローカルの場合はクライアントもサーバも同じマシンだが、AWSなどではサーバがAWSに立つイメージ
  • buildに使わないファイルは、build contextの中に入っていても、imageには反映されない
  • build contextの中に不要なファイルがあるとbuildに時間がかかるので普通は入れない
  • imageに反映したいファイルはADDCOPYコマンドが必要
  • COPYはよく使う。ホストにあるファイルをコンテナに渡したいときに便利
  • COPYADDの違い→圧縮ファイルを解凍するどうか。ADDは機能が多い
  • build contextにDockerfileがない場合→$ docker build -f <ファイル名> <指定するディレクトリ>
  • Dockerfileが2つある時などある。build contextとDockerfileは同じフォルダでなくて大丈夫
  • ENTRYPOINTCMD同様にデフォルトコマンドを指定できる。違いは👇
    • run時にコマンドを上書きできない
    • ENTRYPOINTがある場合は、CMDは引数のみ指定する(CMDにコマンドは書かない)
    • run時に上書きできるのはCMDの部分のみ
    • ENTRYPOINTは、コンテナをコマンドのようにして使いたいときに使う →$ docker run <image>を一種のコマンド(lsやpwdなど)として使いたいときにこのように使う
  • ENV環境変数を設定する
  • ENV key1 value or ENV key2=valueという指定の仕方
  • WORKDIR:Docker instructionの実行ディレクトリを変更する
  • Docker instructionは通常はルートディレクトリで実行される。それを変更させるのがWORKDIR
  • WORKDIR <絶対path>
  • WORKDIRで指定した絶対pathのフォルダがなければ、フォルダ作成される

とにもかくにもかめさんの動画が分かりやすすぎて理解が容易です。

twitter.com

それではまた次回!