Docker & Kubernetes 入門 #4
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
- mynginx : docker build でビルドしたイメージ
- 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 について記載します。