Dockerの説明:Dockerfilesを使用したイメージの構築の自動化
ステータス:非推奨
この記事は廃止され、メンテナンスされなくなりました。
理由
この記事の手法は時代遅れであり、Dockerのベストプラクティスを反映していない可能性があります。
代わりに参照してください
序章
Docker コンテナーは、baseイメージを使用して作成されます。 イメージは、オペレーティングシステムの基本に過ぎない基本的なものにすることも、起動可能な高度なビルド済みアプリケーションスタックで構成することもできます。
Dockerを使用してイメージを構築する場合、実行される各アクション(つまり、 apt-get installなどのコマンドを実行すると、前のレイヤーの上に新しいレイヤーが形成されます。 これらのベースイメージを使用して、新しいコンテナを作成できます。
このDigitalOceanの記事では、このプロセスを可能な限り自動化する方法について説明し、 Dockerfiles を介してDockerとコンテナーを最大限に活用するためのベストプラクティスと方法を示します。コンテナーを構築するためのスクリプト、ステップバイ-ベースイメージから自動的に、レイヤーごとにステップ。
用語集
1. Dockerの概要
2. Dockerfiles
3. Dockerfile構文
- 構文とは何ですか?
- Dockerfileの構文例
4. Dockerfileコマンド
- 追加
- CMD
- エントリーポイント
- ENV
- 公開
- から
- メンテナ
- 走る
- ユーザー
- 音量
- WORKDIR
5. Dockerfileの使用方法
6. Dockerfileの例:MongoDBをインストールするためのイメージの作成
- 空のDockerfileの作成
- ファイルとその目的の定義
- 使用するベースイメージの設定
- メンテナの定義(作成者)
- アプリケーションリポジトリリストの更新
- MongoDBをダウンロードするための引数とコマンドの設定
- MongoDBのデフォルトポートの設定
- Dockerfileの保存
- 私たちの最初のイメージを構築する
- MongoDBインスタンスの実行
Dockerの概要
Dockerプロジェクトは、いくつかのLinuxカーネル機能の上に構築された、連携して動作する高レベルのツールを提供します。 目標は、開発者とシステム管理者がアプリケーションを(すべての依存関係を組み合わせて)移植し、システムとマシン間で実行できるようにすることです頭痛の種。
Dockerは、安全なLXCベースの(つまり、 Linux Containers)「Dockercontainers」と呼ばれるアプリケーション用の環境。 これらのコンテナーは、 Dockerイメージを使用して作成されます。これは、コマンドを手動で実行するか、Dockerファイルを介して自動的に実行することで構築できます。
注: Dockerとそのパーツについて詳しく知るには(例: Dockerデーモン、CLI、イメージなど)、プロジェクトの紹介記事をチェックしてください: Ubuntu16.04にDockerをインストールして使用する方法。
Dockerfiles
各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コマンド(手順)
現在、DockerにイメージをビルドさせるためにDockerfilesに含めることができるコマンドのセットは約12種類あります。 このセクションでは、Dockerfileの例に取り組む前に、それらすべてを個別に説明します。
注:前のセクション(Dockerfile構文)で説明したように、これらのコマンドはすべてリストされます(つまり、 連続して、単一のプレーンテキストファイル内(つまり Dockerfile)、実行したい順序で(つまり、 実行)dockerデーモンによってイメージを構築します。 ただし、これらのコマンドの一部(例: MAINTAINER)は、実行ではなく定義の値(つまり、 いくつかの追加情報)。
追加
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
コマンドCMDは、RUNと同様に、特定のコマンドを実行するために使用できます。 ただし、RUNとは異なり、ビルド中は実行されませんが、ビルド中のイメージを使用してコンテナがインスタンス化されるときに実行されます。 したがって、実行される初期のデフォルトコマンドと見なす必要があります(つまり、 実行)イメージに基づいてコンテナを作成します。
明確にするために: CMDの例は、RUNを使用して既にインストールされているコンテナーの作成時にアプリケーションを実行することです(例: イメージ内でapt-getinstall…)を実行します。 CMDで設定されたこのデフォルトのアプリケーション実行コマンドがデフォルトになり、作成中に渡されたコマンドに置き換わります。
例:
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"
エントリーポイント
ENTRYPOINT引数は、イメージを使用してコンテナが作成されるたびに使用される具体的なデフォルトアプリケーションを設定します。 たとえば、イメージ内に特定のアプリケーションをインストールし、このイメージを使用してそのアプリケーションのみを実行する場合は、ENTRYPOINTで指定でき、そのイメージからコンテナーが作成されるたびに、アプリケーションがターゲットになります。
ENTRYPOINTをCMDと組み合わせると、CMDから「アプリケーション」を削除し、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
ENVコマンドは、環境変数(1つ以上)を設定するために使用されます。 これらの変数は、スクリプトとアプリケーションが同様にコンテナ内でアクセスできる「キー値」のペアで構成されています。 Dockerのこの機能は、プログラムを実行するための非常に大きな柔軟性を提供します。
例:
# Usage: ENV key value
ENV SERVER_WORKS 4
公開
EXPOSEコマンドは、指定されたポートを関連付けて、コンテナー内で実行中のプロセスと外界(つまり、 ザ・ホスト)。
例:
# Usage: EXPOSE [port]
EXPOSE 8080
Dockerネットワーキングについて学ぶには、Dockerコンテナーネットワーキングドキュメントをチェックしてください。
から
FROMディレクティブは、Dockerfilesの他のすべての中でおそらく最も重要です。 ビルドプロセスを開始するために使用するベースイメージを定義します。 以前に作成した画像を含め、どの画像でもかまいません。 ホストでFROMイメージが見つからない場合、Dockerは Docker Hub または他のコンテナーリポジトリからイメージを見つけようとします(そしてダウンロードします)。 これは、Dockerfile内で宣言された最初のコマンドである必要があります。
例:
# Usage: FROM [image name]
FROM ubuntu
メンテナ
ファイルのどこにでも設定できるコマンドの1つは、上で宣言した方がよいでしょうが、MAINTAINERです。 この非実行コマンドは作成者を宣言するため、画像の作成者フィールドを設定します。 それにもかかわらず、FROMの後に来るはずです。
例:
# Usage: MAINTAINER [name]
MAINTAINER authors_name
走る
RUNコマンドは、Dockerfilesの中心的な実行ディレクティブです。 引数としてコマンドを取り、それを実行して画像を形成します。 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
WORKDIRディレクティブは、CMDで定義されたコマンドを実行する場所を設定するために使用されます。
例:
# Usage: WORKDIR /path
WORKDIR ~/
Dockerfilesの使用方法
Dockerfilesの使用は、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の最終結果を段階的に入力します。
注: Dockerfileの編集を開始した後、以下のセクションのすべてのコンテンツと引数は、 Docker構文の例と説明に従って、その中に連続して書き込まれます(追加されます)。 ] セクション。 このウォークスルーの最新のセクションで、最終結果がどのようになるかを確認できます。
空の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インスタンスの実行
ビルドしたイメージを使用して、最後のステップに進むことができます。選択した名前を使用して、内部でMongoDBインスタンスを実行するコンテナーを作成します(必要に応じて-name [name] )。
docker run -name my_first_mdb_instance -i -t my_mongodb
注:名前が設定されていない場合は、を使用してすべてのコンテナーを一覧表示することで取得できる複雑な英数字のIDを処理する必要があります。 docker ps -l
.
注:コンテナから自分を切り離すには、エスケープシーケンスを使用します CTRL+P
に続く CTRL+Q
.
楽しみ!