Dockerfileとは?
アプリの実行に必要なコンテナの情報をコードで管理することができます。このファイルや実行するアプリケーションからDockerコンテナの元となるイメージ(Dockerイメージ)を作ることができます。(Dockerイメージのビルド)
作成したDockerImageはDockerHub等のレジストリに登録して全世界の人に使ってもらうことも可能ですし、非公開とすることも可能ですし、ローカルのみで使うことも可能です。(普通の企業で開発する場合は非公開でリポジトリに登録することが多いでしょう。)
Dockerコンテナとは?
Dockerイメージを元に作成されます。具現化されたアプリやファイルシステムが実行されている状態です。
Dockerイメージとは?
コンテナの実行に必要なファイル群(プログラム本体/ライブラリ/ミドルウェア/OS/ネットワーク設定等)を格納したディレクトリのことでコンテナ作成時のテンプレートになります。なお、一つのDockerイメージから複数のDockerコンテナを作成することができます。詳しくは下記の記事でも解説しています。
用途
Railsでの開発
一般的なRuby on Railsを利用したアプリケーションの開発とかではAPサーバ(Ruby、Railsや各種アプリ専用のミドルウェアが入っているサーバ)の構築のみDockerfileで自作のイメージを使用してコンテナを作り、それ以外のサーバ(DB、S3、セッション管理サーバ、メールサーバ等)は既にあるイメージをそのまま使って作ることが多いでしょう。
なお、Dockerfile自体もDockerHubにあるイメージをベース(rubyイメージ等)として作りますし、複数のイメージ(ruby、node等)をインポートして作成することも多いです。あくまで実務ではDockerfileはベースイメージを各案件むけにカスタマイズするために使うものと見た方が良いと思います。
Dockerfileの書き方
Docker独自のDSL(ドメイン固有言語)を使って記述します。FROMやCOPY等の様々なインストラクション(命令)が用意されています。
FROM [Dockerイメージ名] [タグ(イメージのバージョン)]
ベースとなるDockerイメージ(OS)はここに定義します。Dockerfileでイメージをビルドする際はまずFROMで指定されたイメージをダウンロードして実行します。
FROMの参照先
最初にDockerイメージを「Docker Hub」というレジストリを検索します。
タグ
Dockerイメージ自体はハッシュを持っていて一意に識別することはできますが、ハッシュを指定して取得するのは困難なので任意のバージョンを指定してDockerイメージのバージョンを指定します。言語のイメージであれば言語バージョンとかがDockerイメージのバージョンになったりします。
COPY
Dockerを動作させているホストOS上のファイルやディレクトリをDockerコンテナ内にコピーするコマンドです。
ADD
COPYと似ていますが少し用途が異なります。COPYとは下記の点で異なります。通常ADD命令は名前からは動作を想像しにくいのでベストプラクティスとしてCOPY命令を使います。ADD命令に備わった機能が必要な場合のみADD命令を使用するようにします。
- tarで展開されたファイルをコピー時に自動で展開する。
- コピー元にURLを指定した場合はURLからダウンロードしてコピー先に転送します。
RUN
Dockerコンテナ内で任意のコマンドを実行できる仕組みです。(例えば、chmodでシェルスクリプトの実行権限を与える等)、アプリケーションの設定の更新や配置をするイメージでアプリ自体は実行させません。
CMD
出来上がったイメージをDockerコンテナとして実行する前に、コンテナ内で実行するプロセスを定義する。コンテナ起動時に一回だけ実行され、RUNと違いアプリケーション自体を実行させるイメージです。
ENTRYPOINT
CMDと同じくコンテナ内で実行するプロセスを指定するインタラクションです。CMDと違いコンテナで実行するデフォルトのプロセスを指定できます。CMDの引数はENTRYPOINTで指定する引数となります。
用途
Dockerイメージの作成者側でコンテナの用途をある程度制限したい場合に使えるコマンドです。
LABEL
Dockerイメージの作成者の記名に使います。
ENV
Dockerfileを元に作成したDockerコンテナ内で使える環境変数を指定します。
OSに持たせた方が良いもの(Dockerfile外でも使用するもの)を指定します。(例えば、タイムゾーン、ロケール、HOMEなど)
ARG
ビルド時に情報を埋め込むために使用します。イメージビルドの時だけ使用できる特殊な環境変数です。
OSに持たせる必要がないもの(Dockerfile内でしか使用しないもの)は、ENVではなくARGを使うようにします。(例えばインストールするパッケージの情報など)
WORKDIR
Dokerfile内で指定した命令(RUN、ADDなど)を実行する作業ディレクトリです。
EXPOSE ポート番号
ポートを開けることができます。
コマンド
Dockerfileを作成した後に実行するコマンド等に関しては下記で解説しております。
基本的には「docker image build」でDockerイメージを作成して、「docker container run」で作成したコンテナを実行します。
この記事へのコメントはありません。