そのため、変更したコンテナを保持するためには、変更後のコンテナのイメージの作成が必要です。
イメージの作成方法は手順さえわかれば難しくありません。やってみましょう!
・コンテナからイメージを作成する手順
・DockerFileからイメージを作成する手順
・イメージの構造
・DockerFileの構造、命令、作り方
1.イメージの作成方法は2通り
イメージの作成方法は、次の2パターンあります。
①コンテナから作る
②DockerFileから作る
1.1.コンテナからイメージを作る
コンテナからイメージを作る方法は、現在のコンテナをアーカイブするようなことになります。
ベースとなるコンテナを起動し、シェルで操作したり、ファイルを追加したり、システムを構築するなどの修正を加えた後、そのコンテナからイメージを作成します。
この方法はイメージの作成が簡単に行えますが、ベースとなるイメージからどのような変更が加えられたか?がわからない!というデメリットがあります。
もし、悪意を持った人が作成したイメージであれば、怖くて使えないですよね?なので、通常はDockerFileからイメージを作成することが一般的です。
1.2.DockerFileからイメージを作る
DockerFileとは、ベースとなるイメージに、どのような変更を加えるか?を記述したファイルのことです。
要はイメージの設計書みたいなものと思ってください。
DockerFileはフォーマットや命令が決まっており、多少覚える作業はありますが、どのような変更が加えられているか?が一目でわかることがメリットです。
①コンテナからイメージを作成する方法
②DockerFileからイメージを作成する方法
DockerFileからイメージを作る方法は、変更内容がわかるというメリットがある。
2.イメージの構造
イメージの作り方を学ぶ準備として、まずはイメージの構造を理解しましょう。
イメージはレイヤー構造となっています。ベースとなるイメージの上に、どんなファイルを加えるか?どんな命令を実行するか?といった変更差分を重ねた階層構造となっています。また、環境変数などの情報はメタファイルに保存されます。
また、イメージはデータのサイズを抑えるために、変更差分しか収録しないファイル構造となっています。
例えば、ubuntuイメージにAという変更を加えた場合、Aという差分だけイメージに保存されます。
さらに「ubuntu + A」のイメージに、Bという変更を加えると、Bという差分だけイメージに保存されます。
つまに共通のベースのイメージ(ここではubuntu)は、イメージに含まれないためサイズが軽量になります。
ちなみに、「docker history」コマンドでイメージのレイヤーを確認できます。試しにnginxイメージがどのようなレイヤー構造になっているか確認してみましょう。
「CREATED BY」のフィールドが、ベースのイメージに対して、変更された操作となります。
ホストPCのターミナル : ubuntuコンテナのレイヤー確認
% docker history ubuntu:20.04
IMAGE CREATED CREATED BY SIZE COMMENT
3048ba078595 7 weeks ago /bin/sh -c #(nop) CMD [“/bin/bash”] 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ADD file:a8303c80b47ec165c… 65.7MB
<missing> 7 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 7 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ARG RELEASE 0B
3.コンテナからイメージを作成する
コンテナからイメージを作成する手順は次の3ステップです。
例として、ubuntuコンテナにviをインストールして、イメージ化してみます。
Step1 ubuntuコンテナの起動
ベースとするubuntuコンテナを起動します。コンテナ名は「my-ubuntu」とします。
起動時コマンドにbashを指定して、bash操作ができる状態になっていることを確認してください。
念の為、whichコマンドでviがインストールされていないことを確認します。
% docker container run -it –name my-ubuntu ubuntu bash
root@1e9732bc9862:/# which vi
Step2 viのインストール
viのインストールは次のコマンドを順に実行します。
root@1e9732bc9862:/# apt update -y
root@1e9732bc9862:/# apt install vim -y
viをインストール後、whichコマンドでviがインストールされていることを確認します。
root@1e9732bc9862:/# which vi
/usr/bin/vi
Step3 コンテナからイメージを作る
viをインストールしたコンテナが出来たので、イメージを作っていきます。
まずは、bash操作を終了します。
root@1e9732bc9862:/# exit
exit
次に「docker commit」コマンドでイメージを作ります。
docker commit [CONTAINER] IMAGE:TAG
作成するイメージ名は「ubuntu」タグを「20.04-vi」とします。
% docker commit my-ubuntu ubuntu:20.04-vi
sha256:8e07b897a3a2e4d66cfd771f690b136d1f8688168…
イメージが作成されたことを「docker image ls」コマンドで確認します。
% docker image ls
REPOSITORY TAG IMAGE ID CREATED
ubuntu 20.04-vi 8e07b897a3a2 43 seconds ago
最後に、作成したイメージからコンテナを起動して、viがあらかじめインストールされていることを確認します。
% docker container run -it ubuntu:20.04-vi bash
root@9749defa5048:/# which vi
/usr/bin/vi
4.DockerFileからイメージを作成する
DockerFileとは、イメージの設計書のようなものです。
ベースとなるイメージにどんな変更を加えるか?を記述します。
DockerFileのフォーマットや命令の詳細はこちらの記事を参考。
今回はDockerFileからイメージの作成手順を学ぶことにフォーカスを当てるため、
シンプルなDockerFileを作成して、実際にイメージを作ってみます。
作成するイメージの概要
作成するイメージは「3.コンテナからイメージを作る」と同様に、ubuntuイメージに「vi」をインストールしたものをイメージとして作成します。イメージのレイヤー構造としては次のようになります。
イメージの作成は次の手順で行います。
最後にイメージの中身も確認して、DockerFileに記載したレイヤー構造になっていることを確認します。
Step1. DockerFileの作成
ホストマシンの任意のフォルダを作成して、DockerFileというファイルを作ります。
今回は「myImage」というフォルダを作成します。
% mkdir myImage
% cd myImage
% touch Dockerfile
Step2. DockerFileへ命令を追加
今回はubuntuイメージにviをインストールするので、テキストエディタでDockerFileを次のような記述して保存してください。
FROM ubuntu:20.04
RUN apt update -y && apt install vim -y
「FROM」がベースとなるイメージを指定する命令
「RUN」が実行するコマンド。このRUNで実行した内容がレイヤーとなります。
今回はベースのイメージが「ubuntu:20.04 」
実行する命令が「apt update」「apt install -y vi」
なので、以下のような2つのレイヤー構造となります。
ちなみに、「RUN」命令が1つのレイヤーとなるので、次のように2行で記述すると、レイヤーが増えることになります。出来るだけ「RUN」命令は1行で書きましょう。
FROM ubuntu:20.04
RUN apt update -y
RUN apt install vim -y
Step2. イメージのビルド
Dockerfileを作成したら、「docker image build」コマンドでイメージを作成します。
docker image build [URL] --tag [REPOSITORY:TAG] --name [FILENAME]
※--tag 出力するイメージの[イメージ名:タグ名]を設定
※--name 「Dockerfile」以外のファイルを使う場合に指定する
カレントディレクトリに「Dockerfile」があることを確認して、「docker image build」コマンドを実行します。
作成するイメージ名とタグ名は「ubuntu:20.04-vi」とします。
% ls
Dockerfile
% docker image build –tag ubuntu:20.04-vi .
[+] Building 0.0s (6/6) FINISHED docker:desktop-linux
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from docfile 0.0s
=> => transferring dockerfile: 93B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:20.04 0.0s
=> [1/2] FROM docker.io/library/ubuntu:20.04 0.0s
=> CACHED [2/2] RUN apt update -y && apt install vim -y 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:10bfbcd92cdc29e94d528e6a00f3436a59fb2f61d966a68bb6735fb0821db015 0.0s
=> => naming to docker.io/library/ubuntu:20.04-vi
Step3. 作成したイメージの確認
docker image buildが成功したら、実際にイメージが作成されているか確認してみましょう。
「docker image ls」でイメージの一覧が表示されます。
先ほど作成したイメージ「ubuntu:20.04-vi」が一覧にあることが確認できます。
ホストPCのターミナル : 作成したイメージの確認
% docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04-vi 10bfbcd92cdc 2 days ago 167MB
最後にイメージの中身を確認してみましょう。
「docker history」コマンドで、イメージのレイヤーを確認しましょう。
RUN命令で追加した「apt update」「apt instal vi」のレイヤーが確認できます。
ホストPCのターミナル : イメージのレイヤー確認
% docker history ubuntu:20.04-vi
IMAGE CREATED CREATED BY SIZE COMMENT
10bfbcd92cdc 2 days ago RUN /bin/sh -c apt update -y && apt install … 102MB buildkit.dockerfile.v0
<missing> 7 weeks ago /bin/sh -c #(nop) CMD [“/bin/bash”] 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ADD file:a8303c80b47ec165c… 65.7MB
<missing> 7 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 7 weeks ago /bin/sh -c #(nop) LABEL org.opencontainers.… 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ARG LAUNCHPAD_BUILD_ARCH 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ARG RELEASE 0B
5. DockerFileの命令一覧
※執筆中
6. イメージの配布方法
イメージはファイルではないので、そのままでは配布できません。
そのため、配布するためにはイメージをtarファイルへ変換する必要があります。
dockerイメージの保存
「docker image save」コマンドでイメージからtarファイルを作成します。
docker image save -o [TAR FILENAME] IMAGE
※ -o 出力するTARファイル名を指定
docker image save myUbuntu-20.04-vi.tar ubuntu:20.04-vils
myUbuntu-20.04-vi.tar
dockerイメージファイルの読み込み
その逆は、「docker image load」でtarファイルをイ:メージへ戻します。
docker image load -i [TAR FILENAME]
※ -i 読み込むイメージのファイル
Loaded image: ubuntu:20.04-vi
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04-vi 10bfbcd92cdc 2 days ago 167MB