コンテナイメージ

本セクションで学習すること #

  • コンテナイメージの概要
  • Dockerfile を使ったコンテナイメージの作成
  • イメージレジストリを使ったコンテナイメージの共有

コンテナイメージとは #

コンテナイメージから実行中のコンテナを作成しました。使用したコンテナイメージは、イメージレジストリから取得したものです。一般的に使用されているソフトウェアアプリケーション用のコンテナイメージは数多くありますが、自分のアプリケーション用にコンテナイメージを作成することの方が多いでしょう。

先に説明した通り、コンテナイメージとは、アプリケーションを配布するためのパッケージメカニズムであり、アプリケーションの実行に必要なアプリケーションソフトウェア、オペレーティングシステムファイル、ライブラリ、その他のソフトウェアを含んでいます。

コンテナイメージを作成するには、例えば既存のイメージを使ってコンテナを起動し、変更を加え、その結果を新しいコンテナイメージとして保存する方法もありますが、今回は典型的な手法であるDockerfile を用いた方法を見ていきます。

Dockerfile #

~/greeting-v1 に移動します。

cd ~/exercises/greeting-v1

Dockerfileは、新しいコンテナイメージを作成するベースイメージの詳細と、それを作成するための手順を定義しています。Dockerfile の内容を表示します。

cat Dockerfile
FROM busybox:latest
COPY hello goodbye /
CMD [ "/hello" ]
  • FROM 命令は、ベースイメージの名前を指定します。
  • COPY 命令は、ローカルディレクトリからイメージにファイルをコピーするために使用されます。
  • CMD 命令は、コンテナイメージが明示的なコマンドを指定せずに実行された場合に実行されるコマンドを設定するために使用します。

まとめると、busybox をベースイメージとし、その上にhello およびgoogbye というシェルスクリプト(単なるecho 1行)をコピーし、コンテナ起動時に(何も指定しなければ)そのスクリプトを起動する、というイメージです。

Dockerfileの命令を使ってコンテナイメージを構築するには、次のように実行します。

docker build -t greeting .

-t でイメージの名前を指定し、"." はDockerfile のパスを指定しています。

コンテナイメージを実行するには、次のように実行します。

docker run --rm greeting

あるいは、別のコマンドを実行するには、次のようにします。

docker run --rm greeting /goodbye

Dockerfileで使用できる命令の完全なリストについては、Dockerfile リファレンスを参照してください。

https://docs.docker.com/engine/reference/builder/

イメージの共有 #

独自のカスタムコンテナイメージを作成した後、それを別のホストOS で実行する必要がある場合には、そのイメージを配布する方法が必要になります。

コンテナイメージを配布する一般的な方法は、イメージレジストリにプッシュすることです。イメージレジストリにプッシュされたコンテナイメージは、他のホストにプルして実行することができます。このためには、Docker Hub などのパブリックなイメージレジストリを使用するか、 Harbor など独自のプライベートなイメージレジストリを使用することができます。

イメージをイメージレジストリにプッシュするには、まずそのイメージレジストリにログインする必要があります。

このワークショップの環境では、すでにログインしている自分のプライベートイメージレジストリを持っています。もし自分でやるのであれば、docker loginコマンドを使ってイメージレジストリの場所を指定します。すると、ログイン情報の入力を求められます。

次に、コンテナイメージにイメージレジストリの名前を組み込んだ名前をタグ付けする必要があります。この時点でのイメージの名前はgreetingなので、イメージレジストリの名前を含む名前をタグ付けするには、次のように実行する必要があります。

NS=$(kubectl config view -o jsonpath='{.contexts[].context.namespace}')
上記コマンドはハンズオンのセッションによって異なるレジストリの名前の一部を取得しています。
docker tag greeting:latest ${NS}-registry.tdc-priv-prod-1e19974.tanzu-labs.esp.vmware.com/greeting:latest

イメージをイメージレジストリにプッシュするには、次のように実行します。

docker push ${NS}-registry.tdc-priv-prod-1e19974.tanzu-labs.esp.vmware.com/greeting:latest

イメージレジストリへの適切なアクセス権を持つ人は、次のように実行して、イメージを別のホストでプルすることができます。

docker pull ${NS}-registry.tdc-priv-prod-1e19974.tanzu-labs.esp.vmware.com/greeting:latest