ウェブサイト検索

Dockerの説明:イメージのビルドを自動化するためのDockerfileの使用


ステータス: 廃止された

この記事は廃止され、もはや維持されていません。

理由

この記事の技術は時代遅れであり、Dockerのベストプラクティスを反映していない可能性があります。

別の方法で見る

  • Dockerエコシステム: 一般的なコンポーネントの紹介
  • Dockerfile リファレンス
  • Dockerfileを書くためのベストプラクティス

紹介

Docker コンテナは 基本 イメージを使用して作成されます。イメージは、オペレーティングシステムの基本的な要素だけを含む単純なものもあれば、起動の準備が整った高度なプリビルドアプリケーションスタックを含むこともあります。

Dockerで画像を構築する際に、実行される各アクション(例えば、apt-get installなどのコマンド)は、前のレイヤーの上に新しいレイヤーを形成します。これらのベースイメージは、新しいコンテナを作成するために使用できます。

このDigitalOceanの記事では、このプロセスをできる限り自動化する方法と、Dockerおよびコンテナを最大限に活用するためのベストプラクティスや手法を示します。具体的には、基本イメージから自動的に、段階的かつ層ごとにコンテナを構築するためのスクリプトであるDockerfilesについてです。

用語集

1. Dockerの概要

2. Dockerfile

3. Dockerfileの構文

  1. 構文とは何ですか?
  2. Dockerfileの構文例

4. Dockerfile コマンド

  1. 追加する
  2. コマンド
  3. エントリーポイント
  4. 環境
  5. 暴露する
  6. から
  7. メンテイナー
  8. 走れ
  9. ユーザー
  10. ボリューム
  11. 作業ディレクトリ

5. Dockerfileの使い方

6. Dockerfileの例: MongoDBをインストールするためのイメージの作成

  1. 空のDockerfileを作成する
  2. ファイルとその目的の定義
  3. 使用するベースイメージの設定
  4. メンテイナー(著者)の定義
  5. アプリケーションリポジトリリストの更新
  6. MongoDBをダウンロードするための引数とコマンドの設定
  7. MongoDBのデフォルトポートを設定する
  8. Dockerfileを保存する
  9. 最初の画像を作成する
  10. MongoDBインスタンスの実行

Dockerの概要

Dockerプロジェクトは、いくつかのLinuxカーネル機能の上に構築された相互に連携する高レベルのツールを提供します。目的は、開発者とシステム管理者がアプリケーションをすべての依存関係とともに移植し、システムやマシンで頭痛のない状態で実行できるようにすることです。

Dockerは、アプリケーション用の安全なLXCベース(つまりLinuxコンテナ)環境である「Dockerコンテナ」を作成することによってこれを達成します。これらのコンテナは、手動でコマンドを実行するか、Dockerfileを通じて自動的に構築することによって生成されるDockerイメージを使用して作成されます。

注意: Dockerおよびその構成要素(例:Dockerデーモン、CLI、イメージなど)について詳しく知りたい場合は、プロジェクトの導入記事「Ubuntu 16.04にDockerをインストールして使用する方法」をご覧ください。

ドッカーファイル

各Dockerfileはスクリプトであり、さまざまなコマンド(命令)と引数が順に記述されて、基本イメージに対して自動的にアクションを実行し、新しいイメージを作成(または形成)するために使用されます。これらは物事を整理するために使用され、プロセスの開始から終了までを簡素化することで、デプロイメントに大いに役立ちます。

Dockerfileは、ビルドプロセスが開始されるイメージを定義することから始まります。その後、さまざまな方法、コマンド、引数(または条件)が続き、それに対して新しいイメージが提供され、Dockerコンテナを作成するために使用されます。

Dockerfileの内容をさまざまな方法でdockerデーモンに提供することで、イメージを構築するために使用できます(詳細は使い方セクションに説明されています)。

Dockerfile 構文

Dockerfileについて話す前に、その構文とそれが実際に何を意味するのかを簡単に確認しましょう。

構文とは何ですか?

非常に簡単に言うと、プログラミングにおける構文とは、アプリケーションが手順(すなわち、関数や命令の集合)を実行するために必要なコマンド、引数、その他すべてを整理するための構造を意味します。

これらの構造は、明確に定義されたルールに基づいており、それに従ってプログラマーが任意のコンピュータアプリケーション(例:インタプリタ、デーモンなど)とインターフェースをする必要があります。スクリプト(すなわち、実行するタスクの系列を含むファイル)が正しく構造化されていない場合(すなわち、文法が間違っている場合)、コンピュータプログラムはそれを解析することができません。解析は、入力を通過して、何が意味されているのかを理解することを最終的な目標として概ね理解することができます。

Dockerfile はシンプルでクリーン、かつ明瞭な構文を使用しており、作成や使用が非常に簡単です。特に、適切に書かれたアプリケーションのソースコードのようにコメントを挿入できるため、自己説明的に設計されています。

Dockerfileの構文例

Dockerfileの構文は、コメントとコマンド+引数という2種類のメインラインブロックで構成されています。

Line blocks used for commenting
command argument argument ..

簡単な例:

Print "Hello docker!"
RUN echo "Hello docker!"

Dockerfileコマンド(指示)

現在、DockerfileがDockerにイメージをビルドさせるために含むことができる約12種類の異なるコマンドセットがあります。このセクションでは、それらすべてを個別に説明し、Dockerfileの例に取り組む前に解説します。

注意: 前のセクション(Dockerfile構文)で説明したように、これらのコマンドはすべて、単一のプレーンテキストファイル(つまり、Dockerfile)内に連続して(つまり、書かれて)リストされる必要があります。それらが実行される順序で、dockerデーモンによってイメージをビルドするために実行されます。ただし、これらのコマンドのいくつか(例:MAINTAINER)は、実行を構成しないため、適切だと思う場所に配置できます(ただし、常にFROMコマンドの後です)。それはあくまで定義の値(つまり、追加情報)だからです。

追加する

ADDコマンドは2つの引数を受け取ります:ソースとデスティネーションです。基本的に、ホストのソースからコンテナのファイルシステム内の設定されたデスティネーションにファイルをコピーします。ただし、ソースがURL(例: http://github.com/user/file/)の場合、そのURLの内容がダウンロードされてデスティネーションに配置されます。

例 :

Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder

コマンド

CMDコマンドは、RUNと同様に、特定のコマンドを実行するために使用できます。しかし、RUNとは異なり、ビルド中には実行されず、ビルドされたイメージを使用してコンテナがインスタンス化される際に実行されます。そのため、イメージに基づいてコンテナが作成されるときに実行される(すなわち、実行される)初期のデフォルトコマンドと考えるべきです。

明確にするために:CMDの例は、イメージ内でRUN(例:RUN apt-get install ...)を使用して既にインストールされたコンテナの作成時にアプリケーションを実行することです。このCMDで設定されたデフォルトのアプリケーション実行コマンドはデフォルトになり、作成時に渡されたコマンドを置き換えます。

例 :

Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

エントリーポイント

ENTRYPOINT引数は、イメージを使用してコンテナが作成されるたびに使用される具体的なデフォルトアプリケーションを設定します。例えば、イメージ内に特定のアプリケーションをインストールし、そのアプリケーションだけを実行するためにこのイメージを使用する場合、ENTRYPOINTを使ってそれを明示することができます。その場合、このイメージからコンテナが作成されるたびに、あなたのアプリケーションがターゲットになります。

ENTRYPOINTをCMDと組み合わせると、CMDから「application」を削除し、「arguments」のみを残してENTRYPOINTに渡すことができます。

例 :

Usage: ENTRYPOINT application "argument", "argument", ..
Remember: arguments are optional. They can be provided by CMD
          or during the creation of a container.
ENTRYPOINT echo

Usage example with CMD:
Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo  

環境

ENVコマンドは、環境変数(1つ以上)を設定するために使用されます。これらの変数は「キーと値」のペアで構成され、コンテナ内のスクリプトやアプリケーションによってアクセス可能です。このDockerの機能は、プログラムを実行するための膨大な柔軟性を提供します。

例 :

Usage: ENV key value
ENV SERVER_WORKS 4

暴露する

EXPOSEコマンドは、コンテナ内で実行されているプロセスと外部(すなわちホスト)との間でネットワーク接続を可能にする指定されたポートを関連付けるために使用されます。

例 :

Usage: EXPOSE [port]
EXPOSE 8080

Dockerのネットワーキングについて学ぶには、Dockerコンテナネットワーキングのドキュメントを確認してください。

から

FROMディレクティブは、Dockerfileのすべてのディレクティブの中で最も重要なものの一つです。これは、ビルドプロセスを開始するために使用するベースイメージを定義します。それは、以前に作成したイメージを含む任意のイメージである可能性があります。ホスト上でFROMイメージが見つからない場合、Dockerはそれを<強調>Docker Hubや他のコンテナリポジトリから探して(ダウンロードして)試みます。これは、Dockerfile内で最初に宣言されるべきコマンドです。

例 :

Usage: FROM [image name]
FROM ubuntu

メンテイナー

ファイル内のどこにでも設定できるコマンドの1つは、MAINTAINERです - ただし、ファイルの先頭に宣言した方が良いでしょう。この実行されないコマンドは、著者を宣言し、画像の著者フィールドを設定します。それでも、FROMの後に来る必要があります。

例 :

Usage: MAINTAINER [name]
MAINTAINER authors_name

走れ

RUNコマンドは、Dockerfileの中心的な実行指令です。それはコマンドを引数として受け取り、それを実行してイメージを形成します。CMDとは異なり、実際にイメージを構築するために使用されます(前のコミットされたレイヤーの上に別のレイヤーを形成します)。

例 :

Usage: RUN [command]
RUN aptitude install -y riak

ユーザー

USERディレクティブは、構築中のイメージに基づいてコンテナを実行するために設定されるUID(またはユーザー名)を指定するために使用されます。

例 :

Usage: USER [UID]
USER 751

ボリューム

VOLUMEコマンドは、コンテナからホストマシン上のディレクトリへのアクセスを有効にするために使用されます(つまり、マウントすることを意味します)。

例 :

Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

作業ディレクトリ

WORKDIRディレクティブは、CMDで定義されたコマンドが実行される場所を設定するために使用されます。

例 :

Usage: WORKDIR /path
WORKDIR ~/

Dockerfileの使用方法

Dockerfileを使用することは、Dockerデーモンがそれを実行するのと同じくらい簡単です。スクリプトを実行した後の出力は、新しいDockerイメージのIDになります。

使用法 :

Build an image using the Dockerfile at current location
Example: docker build -t [name] .
docker build -t my_mongodb .    

Dockerfileの例: MongoDBをインストールするためのイメージを作成する

このDockerfileの最終セクションでは、Dockerfileドキュメントを作成し、MongoDBコンテナを実行するために使用できるDockerイメージを作成する最終結果を得るために、段階的にそれを埋めていきます。

注意: Dockerfileの編集を開始したら、以下のセクションからのすべての内容と引数は、私たちの例とDocker構文セクションの説明に従って、順次それに追加(追記)される必要があります。この walkthrough の最新のセクションで最終結果がどのようになるかを見ることができます。

空のDockerfileを作成する

nano テキストエディタを使って、Dockerfile の編集を始めましょう。

nano Dockerfile

ファイルとその目的の定義

必須ではありませんが、このファイルが何であるか、何を目的としているかを自分自身と他の人が理解できるようにすることは、常に良い習慣です。そのために、私たちはDockerfileを華やかなコメント(#)で始めて、それを説明します。

############################################################
Dockerfile to build MongoDB container images
Based on Ubuntu
############################################################

使用するベースイメージの設定

Set the base image to Ubuntu
FROM ubuntu

メンテイナー(著者)の定義

File Author / Maintainer
MAINTAINER Example McAuthor

MongoDBをダウンロードするための引数とコマンドの設定

################## BEGIN INSTALLATION ######################
Install MongoDB Following the Instructions at MongoDB Docs
Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

Update the repository sources list
RUN apt-get update

Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen

Create the default data directory
RUN mkdir -p /data/db

##################### INSTALLATION END #####################

MongoDBのデフォルトポートを設定する

Expose the default port
EXPOSE 27017

Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"]

Set default container command
ENTRYPOINT usr/bin/mongod

Dockerfileを保存する

すべてをファイルに追加したら、保存して終了する時間です。CTRL+Xを押し、その後Yを押してDockerfileを確認し、保存します。

最終的なファイルはこのようになるべきです:

############################################################
Dockerfile to build MongoDB container images
Based on Ubuntu
############################################################

Set the base image to Ubuntu
FROM ubuntu

File Author / Maintainer
MAINTAINER Example McAuthor

################## BEGIN INSTALLATION ######################
Install MongoDB Following the Instructions at MongoDB Docs
Ref: http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

Add the package verification key
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

Add MongoDB to the repository sources list
RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/mongodb.list

Update the repository sources list
RUN apt-get update

Install MongoDB package (.deb)
RUN apt-get install -y mongodb-10gen

Create the default data directory
RUN mkdir -p /data/db

##################### INSTALLATION END #####################

Expose the default port
EXPOSE 27017

Default port to execute the entrypoint (MongoDB)
CMD ["--port 27017"]

Set default container command
ENTRYPOINT usr/bin/mongod

最初の画像を作成する

以前の説明を使って、私たちはdockerを使って最初のMongoDBイメージを作成する準備ができました!

docker build -t my_mongodb .

注意:ここでの-t [name]フラグは、画像にタグを付けるために使用されます。ビルド中に他に何ができるかについてもっと学ぶには、docker build --helpを実行してください。

MongoDBインスタンスの実行

私たちが構築したイメージを使用して、今、最終ステップに進むことができます。それは、任意の名前を使用して(必要に応じて -name [name] を使用して)MongoDB インスタンスを内部で実行しているコンテナを作成することです。

docker run -name my_first_mdb_instance -i -t my_mongodb

注: 名前が設定されていない場合、docker ps -lを使用してすべてのコンテナをリストアップすることで取得できる複雑な英数字のIDを処理する必要があります。

注意: コンテナから切り離すには、エスケープシーケンス CTRL+P の後に CTRL+Q を使用してください。

楽しんで!

提出者: O.S. Tezer

関連記事: