Open4

「Dockerコンテナ開発入門」読む

harayuharayu

Dockerfileで使用するインストラクション

  • FROM
    コンテナのベースイメージ指定。

  • WORKDIR
    コンテナ内のカレントディレクトリを指定。指定したディレクトリが存在しない場合は新たに作成される。

  • COPY
    ビルドコンテキストのファイルやディレクトリをコンテナ内にコピーするコマンド。
    ビルドコンテキストについては下記記事が参考になった。
    docker buildコマンドでなんとなく指定しているcontextを理解する

  • RUN
    コンテナイメージビルド時に実行するコマンド。
    パッケージマネージャでのツールのインストールや、アプリケーションのビルド処理などを記載する。

  • CMD
    コンテナ起動時に実行するコマンド。
    アプリケーションそのものを動作させる。

harayuharayu

コンテナを起動してみる

docker container run -it golang:1.23.0
root@22cc11b2072d:/go# echo $SHELL
/bin/bash

docker image内で CMD["bash"] が指定されているので、bashで立ち上がる
https://hub.docker.com/layers/library/golang/1.23.0/images/sha256-89a1b98608f91fe47734cac497c0d7bd0c88239f90cccd00ea47057eb09604e2?context=explore

bash以外で立ち上げたい場合は、コンテナ起動時にdocker container run -it golang:1.23.0 shの様に指定する

上記のようにCMDはコンテナ起動時に上書きすることができるが、ENTRYPOINTを使用することで上書きされない様にすることができる。
ENTRYPOINT・CMDを組み合わせることで、ENTRYPOINTで指定したコマンドにCMDで引数を渡すことができる。
DockerfileのENTRYPOINTとCMDの違いは何でしょうか。 #dockerfile - Qiita

harayuharayu

docker image buildに関してのメモ

  • ホストに存在するdocker imageと同様の部分はキャッシュが使用される。差分だけがbuildされる
docker image build -t ch02/echo:latest .                                
[+] Building 0.2s (10/10) FINISHED                                                                                                                                                                                                                            docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                          0.0s
 => => transferring dockerfile: 183B                                                                                                                                                                                                                                          0.0s
 => [internal] load metadata for docker.io/library/golang:1.23.0                                                                                                                                                                                                              0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                             0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                               0.0s
 => [1/5] FROM docker.io/library/golang:1.23.0                                                                                                                                                                                                                                0.0s
 => [internal] load build context                                                                                                                                                                                                                                             0.0s
 => => transferring context: 29B                                                                                                                                                                                                                                              0.0s
 => CACHED [2/5] WORKDIR /go/src/github.com/gihyodocker/echo                                                                                                                                                                                                                  0.0s
 => CACHED [3/5] COPY ./main.go .                                                                                                                                                                                                                                             0.0s
 => [4/5] COPY ./main.go .                                                                                                                                                                                                                                                    0.0s
 => [5/5] RUN go mod init                                                                                                                                                                                                                                                     0.1s
 => exporting to image                                                                                                                                                                                                                                                        0.0s
 => => exporting layers                                                                                                                                                                                                                                                       0.0s
 => => writing image sha256:12f9befa6e3a18d318bbe2b45364cb79437b8e0f40b8cbfb3a68418d80cd4ac7                                                                                                                                                                                  0.0s
 => => naming to docker.io/ch02/echo:latest      
  • 一つのタグに紐づけられるimageは一つまでなので、タグを新規に付け直した場合は、古いimageのタグは<none>と表示される
 docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
ch02/echo    latest    12f9befa6e3a   9 seconds ago       844MB
<none>       <none>    46a84e8a5bfb   45 minutes ago      844MB
harayuharayu

コンテナのライフサイクル

実行中・停止・破棄という3つの状態に分類される。

  • 実行中
    docker container runで指定されたイメージをもとにコンテが作成され、アプリケーションの実行が開始される。コマンドを一度実行するのみのコンテナの場合は、コマンド実行後、停止の状態に移行する。

  • 停止
    ユーザーが明示的にコンテナを停止する or コンテナで実行されているアプリケーションが正常・異常を問わず終了した場合に自動的に停止する。コンテナ停止後もディスクに残り続ける。

  • 破棄
    頻繁に実行・停止を繰り返す様な場合は、ディスクに残り続けるため不要なコンテナは削除したほうがいい。