はじめに
Dockerの世界にて「イメージは読み取り専用のコンテナテンプレート」ですが、
例えば以下のように元のイメージをベースに修正を加えたものを新たなテンプレートとしたいケースがあります。
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/ubuntu latest d131e0fa2585 5 days ago 102 MB
本記事ではその流れを簡単に説明します。
コマンド実行環境
ホスト環境 | Red Hat Enterprise Linux Server 7.6 |
---|
変更を加えたコンテナから作成
例えばubuntuイメージからコンテナ作成を行い、そのコンテナ内でルートディレクトリにhogeファイルを作成したとします。
以下がそのコンテナです。
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a0b8fce71874 ubuntu "/bin/bash" 2 days ago Exited (0) 52 seconds ago friendly_dijkstra
コンテナを別イメージとして保存するコマンドはdocker container commitとなります。
Usage: docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith")
-c, --change list Apply Dockerfile instruction to the created image (default [])
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
必須な引数は変更を加えたコンテナIDです。
ちなみにイメージ名(リポジトリ名)を引数として与えずに実行すると名称が none になります。
今回は新たなイメージ名をubuntu-hogeとして実行しました。
# docker container commit a0b8fce71874 ubuntu-hoge sha256:0c73ea9ac03407439ccc7f191b8a81a0aaa229085ec03284b0380f8.......
コンテナは変化していませんが
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a0b8fce71874 ubuntu "/bin/bash" 2 days ago Exited (0) 6 minutes ago friendly_dijkstra
イメージは追加されています。別名保存できました。
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu-hoge latest 0c73ea9ac034 38 seconds ago 127 MB docker.io/ubuntu latest d131e0fa2585 5 days ago 102 MB
念のため起動/ログインして確認しますが確かに必要な変更(hogeの存在)が確認できます。
# docker run -t -i ubuntu-hoge root@4a5afdb266af:/# ls bin boot dev etc hoge home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
また、変更を加えたコンテナを元にするわけではないですが、変更する手順が整備されている場合は以下のようなことも可能です。
Dockerfileからイメージを作成
以下のようなDockerfileと名付けた設定ファイルを用意します。
# cat Dockerfile FROM ubuntu RUN touch hogehogee
これは文字通り ubuntuというイメージからtouch hogehogeというコマンドを実行したイメージを用意することを指します。
このファイルが配置されたディレクトリ上でbuildコマンドを実行します。イメージ名を引数にとります。
# docker build -t ubuntu-hogehoge . Sending build context to Docker daemon 6.293 MB Step 1/2 : FROM ubuntu ---> d131e0fa2585 Step 2/2 : RUN touch hogehogee ---> Running in 60a31707863a ---> 48e79c2a6ffc Removing intermediate container 60a31707863a Successfully built 48e79c2a6ffc
以下のようにイメージが作成されていることが分かります。別名保存できました。
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu-hogehoge latest 48e79c2a6ffc 16 seconds ago 102 MB ubuntu-hoge latest 0c73ea9ac034 2 hours ago 102MB docker.io/ubuntu latest d131e0fa2585 5 days ago 102 MB
念のため起動/ログインして確認しますが確かに必要な変更(hogehogeの存在)が確認できます。
# docker run -t -i ubuntu-hogehoge root@b34edd0ff03d:/# ls bin boot dev etc hogehogee home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
終わりに
イメージを作成する二つのパターンについて解説を行いました。
説明は最小の記載に留めましたが例えば「docker build --help」とコマンドを押下すれば数多くのオプションが確認できたりと、かなり奥が深い内容です。
それらを理解するとっかかりに、本記事がなれば幸いです。