fbpx

Ebook連載:『5分x10回で学ぶ 開発者のためのDocker コンテナ入門』第3章 –Dockerfile でのコンテナイメージのビルド
#docker #DX #Mirantis #コンテナ

コンテナ化はDXの第一歩に最適な取り組みです。これから10回にわたってMirantis社が発行するEbook「Learn Containers 5 Minutes at a Time An introductory guide for developers」 (Eric Gregory著)を翻訳・編集し、チャプターごとにCL LABで公開していきます。本稿はその第3章です。皆さまのクラウドネイティブジャーニーやアプリケーションのモダナイズの一助になれば幸いです。

目次

  • 第1章 コンテナとは?
  • 第2章 コンテナの作成・調査・削除
  • 第3章 Dockerfile でのコンテナイメージのビルド
  • 第4章 イメージレジストリ
  • 第5章 ボリュームと永続的なストレージ
  • 第6章 コンテナネットワークとコンテナのポートの開設
  • 第7章 コンテナ化アプリの実行
  • 第8章 ユーザ定義ネットワーク上のマルチコンテナアプリケーション
  • 第9章 Docker Compose
  • 第10章 Webアプリをコンテナサービスとして構築する

第3章: Dockerfile でのコンテナイメージのビルド

前章では、コンテナの作成・調査・削除の練習をしました。新しいコンテナを作成する際には、コンテナイメージという基盤の上にコンテナを構築しました。今回はコンテナイメージが何であるか、どのように機能するか、そしてDockerfileからどのようにイメージをビルドできるかを探ってみましょう。

コンテナイメージとは?

コンテナイメージとは写真のようなもので、コンテナのファイルシステムの静止状態を保存したスナップショットです。

これまでは、新規でコンテナを作る場合、alpineというコンテナイメージから作り始めていました。 これは、Alpine LinuxというLinuxディストリビューションの素のバイナリとライブラリのみを含むファイルシステムのスナップショットです。このオープンソースのLinuxディストリビューションは、非常に軽量なのでコンテナ化に適しています。コンテナを迅速かつ効率的に起動するために必要なものだけで構成されているので、新しいプロセスを実行するコンテナを迅速に作成したい場合、alpineイメージは素晴らしい選択となります。

ここにコンテナイメージの有用性を垣間見ることができます。分離されたファイルシステム上でプロセスを実行するために、全く新しいシステムをインストールして設定する必要はありません。その代わり、たった1つのコマンドで、前もって用意されたベースイメージを呼び出すことができるのです。

すでにお分かりのように、コンテナイメージは新しいキャンバス以上のものを提供することができます。ファイルシステムの状態をイメージに取り込むことができれば、より複雑な前提条件があらかじめ用意されている状態をキャプチャできます。その他にもコンテナイメージによって次のようなことが可能になります。

  • 複雑な処理を実行するコンテナの複製を簡単に作成できる
  • 開発のためのより高度な「積み木 」を形にすることができる
  • 組織全体で使用するソフトウェアモジュールの「信頼できるソース」として機能する、コンテナイメージリポジトリを作成できる

本書で紹介するように、コンテナイメージで培われるモジュール性は、ソフトウェアの開発・デプロイ方法を大きく変える可能性があります。

Dockerfileを使ったコンテナイメージの作成

コンテナイメージの作成には、システム上のコンテナに基づいてコンテナイメージを作成する方法があり、この方法は別の章で紹介します。本章では、別のアプローチとして、Dockerfileを使用してイメージをビルドする方法を紹介します。

Dockerfileは、コンテナを作成するための一連の命令で、すべてシンプルなテキストファイルで記述します。Dockerfileでは、起動するベースイメージだけでなく、インストールするアプリケーションや実行するプロセスも指定できます。そのため、より複雑な作業を簡単に再現できる 「レシピ 」として使用可能です。

実際にどのように見えるか確認してみましょう。コンテナエンジンが起動していることを確認し、ターミナルを立ち上げてください。次のコマンドを実行します。

% docker container run alpine curl google.com

前回の演習を踏まえると、このコマンド文は、alpine イメージを基盤に新しいコンテナを作成し、google.com を引数として、サーバとの間でデータを転送する curl ツールを実行します。その結果、この引数で指定したアドレスからダウンロードされた HTML が表示されるでしょう。

しかしHTMLの表示の代わりに、次のように出力される可能性があります。

docker: Error response from daemon: OCI runtime create
failed: container_linux.go:380: starting container
process caused: exec: "curl": executable file not found in $PATH: unknown.

これは「この新しいコンテナには curl がインストールされていないので、何を要求されているか分からない」という意味です。

この問題を解決する為にDockerfile を修正します。 curlerという新しいフォルダを作成し、そのフォルダの中に拡張子が無いDockerfileという空のファイルを作成します。作成方法がわからない場合は、フォルダ内で touch Dockerfile というコマンドを実行し、お好みのエディタで作成されたDockerfileを開いてください。

Dockerfileに以下の行を追加して保存します。

FROM alpine:latest
RUN apk update
RUN apk add curl

このレシピは、コンテナエンジンに最新版のalpineイメージを基にイメージをビルドし、alpineのパッケージマネージャ apk を実行させます。そして、利用可能なパッケージの apk のインデックスを更新し、curl のパッケージを追加するように指示しています。つまりcurl ツールをインストールしているのです。

この手順でイメージを作成し、Dockerfile を実行しましょう。次のコマンドを実行します。

% docker image build -t curler .

このコマンドは Docker エンジンに新しいイメージをビルドするよう指示し、-t は --tag の略語で、イメージに curler という名前を付けるために使用しています。最後に、ピリオドはイメージに使用する Dockerfile の場所を Docker に知らせます。この場合、現在の作業ディレクトリを指しています。

コマンドが実行されると、コンテナエンジンは指示に基づいてイメージをビルドします。実際には、各ステップ毎に一連のイメージを素早くビルドし、ローカルのイメージセレクションに追加します。

% docker image ls

上記のコマンドを実行するとビルドしたイメージを確認できます。表示されるイメージは環境によって異なりますが、その中に curler イメージが表示され、以下のような出力になるはずです。

REPOSITORY TAG IMAGE ID CREATED
curler latest a46b2fdd95c9 1 minute ago
nginx latest 605c77e624dd 6 weeks ago
alpine latest c059bfaa849c 2 months ago
...

それでは実際に使ってみましょう。次のコマンドを実行してください。

% docker container run curler curl google.com

先ほどと同じように、google.com をパラメータとしてcurl を実行しようとしています。今回の実行結果は次のようになるはずです。

<h1>301 Moved</h1>
The document has moved
<a href="http://www.google.com/">here</a>.

成功です! google.comのアドレスから、とてもシンプルなプレースホルダーのHTMLをダウンロードしました。

この章はここまでです。コンテナをクリーンアップすることを忘れないでください。また、ローカルイメージの中から新しい curler イメージを削除したい場合は、 curler イメージに依存しているコンテナをすべて削除してから、次のコマンドを実行します。

% docker image rm curler

今回はここまでです。

本Blogの動画はこちら

次章では、イメージの活用と管理について深掘りしていきます。

※Docker Enterprise事業は2019年11月14日にMirantis社によって買収されました。
当時のDocker Enterprise製品は、現在は下記のように名称変更されています。

Mirantis製品に関するお問い合わせはこちら

Mirantisについて
Mirantisは、Fortune 1000 企業の 2/3 以上にコンテナやマルチクラウドの導入を加速させ、データセンター運用のストレスを取り除く支援をしています。日本では、クリエーションラインと提携し、Kubernetes、OpenStack、その他のオープンクラウドテクノロジーを、現地語でのサポートやサービスとともに提供しています。Mirantis Kubernetes Engine(旧Docker Enterprise)および関連製品を含む、深い技術的専門知識とベンダーにとらわれない柔軟なプラットフォームが、お客様から選ばれています。
詳細は www.mirantis.com でご確認ください。

新規CTA