Dockerfileを使った基本的なDockerの動作

DockerイメージはDockerfileというファイルを作成し、それをbuildコマンドで読み込ませることでDockerイメージにすることができます。

Dockerfileではベースイメージの他にコマンドなどを指定することで、様々なカスタマイズされたイメージを作ることができます。

Dockerfileで使えるコマンド

基本はこちらの公式ドキュメントを参照です。
http://docs.docker.jp/engine/reference/builder.html

コマンド一覧は以下に記載します。

コマンド 意味
FROM ベースとなるDockerイメージを指定する。
ENV 環境変数を設定する。
ARG buildを行う際の引数を設定する。デフォルト値を持つこともできる。
LABEL Dockerイメージにメタデータをつけることができる。
RUN Shellの実行をする。
WORKDIR 基点となるディレクトリを指定する。設定されているとRUN、CMD、ENTRYPOINT、COPY、ADDで相対パスが指定された場合の基点となる。
ADD ファイルやディレクトリ及び指定されたURLリソースをコンテナの指定されたパスにコピーする。圧縮形式のファイル(tar、gzip、bzip2、xz)は解凍されてコピーされる。
COPY ファイルやディレクトリをコンテナの指定されたパスにコピーする。圧縮形式のファイルは解凍されずにコピーされる。
EXPOSE 特定のネットワーク・ポートをコンテナが実行時にリッスンすることをDockerに伝える。ただし実行時には正しく-pオプションでdockerホストとのポートを接続する必要はある。
ENTRYPOINT コンテナ起動時に実行するコマンドを指定する。
CMD NTRYPOINTと同じでコンテナ起動時に実行するコマンドを指定する。ENTRYPOINTと併用した場合はデフォルトのパラメーター設定としてふるまう。
VOLUME 指定した名前でマウントポイントを作成し、他のホストやコンテナから外部マウント可能なボリュームにする。

 

Dockerfileを作成

 

buildコマンドを実行

 

コマンドの解説をすると-fオプションでファイル名を指定することで「Dockefile」以外のファイルを読み込むことができます。

-tオプションではタグをつけることができます。

タグを確認してみると以下のようになります。

 

そして最後の「.」(ドット)について。

これはカレントディレクトリ以下をDockerfileのコンテント(Dockerfile内の命令からアクセス可能なファイルやディレクトリの範囲)として指定するよということになります。

具体的にはカレントディレクトリ配下のファイルとディレクトリをtarballにまとめてDockerデーモンへ送信しています。

試してみます。

 

上記からもわかりますようにかなりの違いがあります。(ルートディレクトリで実行したものはエラーで止まってしまいましたが)

ちなみにコンテント の外にあるファイルなどはDockerファイルをADDなどでDockerコンテナに置くことはできません。

Dockerファイルを置くフォルダはADDするファイルなどだけにして置く必要があります。

 

ENTRYPOINTとCMDの違い

そもそもRUNとの違いでいうと、RUNはDockerイメージを作成するのに使うコマンド。
ENTRYPOINTとCMDは作成されたイメージが起動されるときに実行されるコマンドです。

ENTRYPOINTの書式は以下の2種類があります。

 

ENTRYPOINTを複数記述した場合には最後のENTRYPOINTが有効になります。

シェルを介して実行した場合にはコマンドは/bin/shの子プロセスとして動作します。(/bin/shがプロセスID 1でその子プロセスとなる)

ここで起こることは「docker stop」や「docker kill」のコマンドを実行したときにプロセスID 1のファイルにシグナルを送るのでデーモンなどを起動したときにシグナルを受け付けないということが起こります。

 

CMDの書式は以下の3種類です。

 

CMDを複数記述した場合には最後のCMDが有効になります。

ENTRYPOINTと似ていますがCMD目的はdocker runを行う際に実行されるデフォルトのコマンドを指定することです。

docker runコマンドでコマンド引数を渡した場合はデフォルトのCMDの値でなく引数の値が有効になります。

 

Dockerイメージを起動してログイン

特に以下の作業が必須なわけではありませんが、Dockerfile作成の時にはログインしてのトライエラーも必要な時がありますので記載しておきます。

上記はまとめて書きましたがこちらで一通りの作業は完了です。

コマンドなどを試しながらDockerfileを作成していきましょう。