Docker入門 第7回 カスタムイメージの作り方

Docker基礎
コンテナは削除すると、コンテナ内で編集したファイルなど全て削除されてしまいます。
そのため、変更したコンテナを保持するためには、変更後のコンテナのイメージの作成が必要です。
イメージの作成方法は手順さえわかれば難しくありません。やってみましょう!
この章で学ぶこと
・コンテナからイメージを作成する手順
・DockerFileからイメージを作成する手順
・イメージの構造
・DockerFileの構造、命令、作り方

1.イメージの作成方法は2通り

イメージの作成方法は、次の2パターンあります。
①コンテナから作る
②DockerFileから作る

1.1.コンテナからイメージを作る

コンテナからイメージを作る方法は、現在のコンテナをアーカイブするようなことになります。
ベースとなるコンテナを起動し、シェルで操作したり、ファイルを追加したり、システムを構築するなどの修正を加えた後、そのコンテナからイメージを作成します。

この方法はイメージの作成が簡単に行えますが、ベースとなるイメージからどのような変更が加えられたか?がわからない!というデメリットがあります。

もし、悪意を持った人が作成したイメージであれば、怖くて使えないですよね?なので、通常はDockerFileからイメージを作成することが一般的です。

1.2.DockerFileからイメージを作る

DockerFileとは、ベースとなるイメージに、どのような変更を加えるか?を記述したファイルのことです。
要はイメージの設計書みたいなものと思ってください。

DockerFileはフォーマットや命令が決まっており、多少覚える作業はありますが、どのような変更が加えられているか?が一目でわかることがメリットです。

イメージの作成方法は2通りある。
①コンテナからイメージを作成する方法
②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がインストールされていないことを確認します。

ホストPCのターミナル : ubuntuコンテナの起動
% docker container run -it –name my-ubuntu ubuntu bash
root@1e9732bc9862:/# which vi

Step2 viのインストール

viのインストールは次のコマンドを順に実行します。

ubuntuコンテナ内のターミナル : viのインストール
root@1e9732bc9862:/# apt update -y

root@1e9732bc9862:/# apt install vim -y

viをインストール後、whichコマンドでviがインストールされていることを確認します。

ubuntuコンテナ内のターミナル : viのインストール確認
root@1e9732bc9862:/# which vi
/usr/bin/vi

Step3 コンテナからイメージを作る

viをインストールしたコンテナが出来たので、イメージを作っていきます。
まずは、bash操作を終了します。

ubuntuコンテナ内のターミナル : bash操作の終了
root@1e9732bc9862:/# exit
exit

次に「docker commit」コマンドでイメージを作ります。

docker commit [CONTAINER] IMAGE:TAG

作成するイメージ名は「ubuntu」タグを「20.04-vi」とします。

ホストPCのターミナル : 「my-ubuntuコンテナ」からイメージを作成
% docker commit my-ubuntu ubuntu:20.04-vi
sha256:8e07b897a3a2e4d66cfd771f690b136d1f8688168…

イメージが作成されたことを「docker image ls」コマンドで確認します。

ホストPCのターミナル : 作成したイメージの確認
% docker image ls
REPOSITORY  TAG           IMAGE ID              CREATED
ubuntu             20.04-vi   8e07b897a3a2    43 seconds ago

最後に、作成したイメージからコンテナを起動して、viがあらかじめインストールされていることを確認します。

ホストPCのターミナル : 作成したイメージ「ubuntu:20.04-vi」に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」というフォルダを作成します。

ホストPCのターミナル : Dockerfileの作成
% mkdir myImage
% cd myImage
% touch Dockerfile

Step2. DockerFileへ命令を追加

今回はubuntuイメージにviをインストールするので、テキストエディタでDockerFileを次のような記述して保存してください。

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行で書きましょう。

Dockerfileの記述。RUN命令を2行で書いた場合
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」とします。

ホストPCのターミナル : イメージのビルド
% 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ファイル名を指定
ホストPCのターミナル : イメージを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 読み込むイメージのファイル
docker image load -i myUbuntu-20.04-vi.tar

Loaded image: ubuntu:20.04-vi

 

docker image ls
REPOSITORY   TAG        IMAGE ID       CREATED        SIZE
ubuntu       20.04-vi   10bfbcd92cdc   2 days ago    167MB

タイトルとURLをコピーしました