Docker & Kubernetes 入門 #4

Kenta Kosugi
6 min readSep 10, 2019

--

Docker イメージ

Docker & Kubernetes 入門 #3 では、nginx のイメージを利用して docker コンテナを起動しました。その際、ローカルに nginx:1.17 のイメージが存在していなかったため、Docker Hub からダウンロードするログが出力されていました。

以下のコマンドを投入して、Mac にダウンロードされたイメージ・自分で作成したイメージを見ることができます。

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.17 5a3221f0137b 3 weeks ago 126MB

REPOSITORY、TAG、IMAGE ID、SIZE を確認することができます。

Docker イメージを作成するには

Docker イメージを作成するには主に Dockerfile というテキストベースのファイルを作成し、docker build コマンドを投入することで Docker イメージを作成できます。

Docker イメージを自作

Docker イメージを作成するために専用のディレクトリを作成します。
kkosugiの箇所はユーザーごとに異なります。

$ mkdir ~/Documents/docker/mynginx
$ cd ~/Documents/docker/mynginx/
$ pwd
/Users/kkosugi/Documents/docker/mynginx

nginx に載せる HTML ファイルを作成します。

$ echo "<html><title>Hello World</title><body><h1></h1></body></html>" > index.html

続いて、Dockerfile を作成します。以下の内容をコピー & ペーストして、名前を Dockerfile として保存してください。この Dockerfile は /usr/share/nginx/html に、自作の HTML ファイル (index.html) をコピーしています。

つまり、 このイメージを起動すると nginx によって Hello World が返却されるページを作っています。

FROM nginx:1.17
COPY index.html /usr/share/nginx/html/index.html

Dockerfile を置いたディレクトリで docker build コマンドを投入します。

$ docker build -t mynginx:v1 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM nginx:1.17
---> 5a3221f0137b
Step 2/2 : COPY index.html /usr/share/nginx/html/index.html
---> af478af8f014
Successfully built af478af8f014
Successfully tagged mynginx:v1

docker images コマンドを利用して今作成したイメージを見てみます。

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx v1 af478af8f014 About a minute ago 126MB
nginx 1.17 5a3221f0137b 3 weeks ago 126MB
  1. mynginx : docker build でビルドしたイメージ
  2. nginx : Docker Hub から pull してきたイメージ

1 のイメージは build 時に -t オプションで mynginx:v1 を付与したものですが、REPOSITORY が mynginx、TAG が v1 になっているのが確認できます。

試しに今作成した Docker イメージを起動してみましょう。

$ docker run --name mynginx -p 8080:80 mynginx:v1

ブラウザで http://localhost:8080 にアクセスしてみます。

Hello World が出力されました。
control + c で Docker コンテナを終了しておきましょう。

Docker イメージ

実は Docker のイメージは複数のレイヤーで作成されています。

上記は Docker Hub にある nginx:1.17 のイメージに自分で作成した HTML ファイルを追加したコマンドが上乗せされた図を表しています。Dockerfile の一行がイメージのレイヤーになっています。

以下のコマンドを実行して実際のレイヤーを確認してみます。

$ docker history mynginx:v1
IMAGE CREATED CREATED BY SIZE COMMENT
af478af8f014 15 minutes ago /bin/sh -c #(nop) COPY file:d3c0cb088db4fe33… 62B
5a3221f0137b 3 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
<missing> 3 weeks ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 3 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B
<missing> 3 weeks ago /bin/sh -c set -x && addgroup --system -… 56.8MB<missing> 3 weeks ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=0.3.5 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.17.3 0B
<missing> 3 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:330bfb91168adb4a9… 69.2MB

Docker Hub からイメージを pull する際は、このレイヤーごとにパラレルでダウンロード処理が走る上、ローカルに存在している共通したレイヤーは再利用されるため、ネットワーク帯域を無駄に食うなんてことがないようになっています。差分だけダウンロードされるイメージです。

次回

次回は Persitent Volume について記載します。

--

--

Kenta Kosugi
Kenta Kosugi

Written by Kenta Kosugi

Javaアプリケーションサーバーの開発からCORBA製品のサポート、QA、証券外務員(第一種免許)、ストレージ屋、アーキテクト、SaaS屋と一貫性のない道を歩んでいます。Red Hatに復帰しました。

No responses yet