DamienKarrus’s blog

プログラミングとクライミングの足跡

オリジナルイメージ(1)イメージの作成 Docker入門-9

イメージの作り方

イメージの作り方には2種類ある。

  1. コンテナから作成
    コンテナから作成する場合はベースコンテナに修正を加え、新しいイメージとしてアウトプットする。簡単ではあるが、どこにどう手を加えたかの履歴が残らない為、一般にこの方法は利用されない。
  2. Dockerfileから作成 ベースイメージに修正手順(Dockerfile)と修正ファイルを添付して、新しいイメージとしてビルドする。Dockerfileを修正することにより、イメージの修正が可能。
    イメージの作成にあたりDockerの流儀に従うこと。主に次の6点である。
    (1) 1つのコンテナは1つの処理しかしない
    1つのコンテナは1つの処理しかしない
    DBとappは分ける。ただ1つの処理といってもApachePHPは連携して動作するので分けられない。
    (2) 利用するポートを明確にする
    このイメージがどのポートを経由して外部と接続するかを明確にする(後述のEXPOSE参照)。
    (3) 永続化すべき場所を明確にする
    利用者がファイルを置く場所(マウントポイント)を明確にしておく(後述のVOLUME参照)。
    設定は環境変数で渡す
    (4) 設定を受け取るときは環境変数で受け渡しを行う。
    (5) ログは標準出力に出す
    標準出力に出しておけば利用者はdocker logsコマンドで確認できるようになる。
    (6) メインプログラムが終了してしまうとコンテナも終了する
    メインプログラムは終了せずに動き続けないといけない(後述のCMDやENTRYPOINT参照)。

    Dockerfileからイメージを作る

    ApacheのDocumentRootにindex.htmlをいれたイメージを作ってみる。
    (1)作業用ディレクトリを作り必要なファイルを準備する
$ mkdir work
$ cd work
$ cp ../index.html .

Dockerfileをつくる

$ cat Dockerfile
FROM httpd
COPY index.html /usr/local/apache2/htdocs/

ビルドする

$ docker build -t myimage01 .
    ↑ container はつけない!
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM httpd
latest: Pulling from library/httpd
Digest: sha256:b7907df5e39a98a087dec5e191e6624854844bc8d0202307428dd90b38c10140
Status: Downloaded newer image for httpd:latest
 ---> faed93b28859
Step 2/2 : COPY index.html /usr/local/apache2/htdocs/
 ---> c4aaa7d4ecb4
Successfully built c4aaa7d4ecb4
Successfully tagged myimage01:latest

できたイメージを確認する

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
myimage01    latest    c4aaa7d4ecb4   3 minutes ago   144MB

docker history で詳細情報を確認してみる

$ docker history myimage01
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
c4aaa7d4ecb4   37 minutes ago   /bin/sh -c #(nop) COPY file:0d571419f6b9efc0…   62B

できたイメージを利用する

$ docker container run -dit --name myimage -p 8080:80 myimage01

動作確認出来たらコンテナとイメージを削除

$ docker container stop myimage
$ docker container rm myimage
$ docker image rm myimage01

次の記事

damienkarrus.hatenablog.com