DockerイメージはDockerfileというファイルを作成し、それをbuildコマンドで読み込ませることでDockerイメージにすることができます。
【関連記事】
・Dockerの基本的な動作(Dockerfileを使わない)
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を作成
1 2 3 4 5 6 7 8 9 |
$ vi Dockerfile -----------------------------作成 FROM ubuntu RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server ----------------------------- |
buildコマンドを実行
1 2 3 |
$ docker build -f Dockerfile -t build:sample . |
コマンドの解説をすると-fオプションでファイル名を指定することで「Dockefile」以外のファイルを読み込むことができます。
-tオプションではタグをつけることができます。
タグを確認してみると以下のようになります。
1 2 3 4 5 |
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE build sample 21bd85b3e011 11 seconds ago 889MB |
そして最後の「.」(ドット)について。
これはカレントディレクトリ以下をDockerfileのコンテント(Dockerfile内の命令からアクセス可能なファイルやディレクトリの範囲)として指定するよということになります。
具体的にはカレントディレクトリ配下のファイルとディレクトリをtarballにまとめてDockerデーモンへ送信しています。
試してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
## 空のディレクトリで実行 $ cd /tmp/sapmle_docker $ time docker build -f ./Dockerfile.dev -t build:sample . Sending build context to Docker daemon 2.048kB ・ ・(省略) ・ real 0m5.175s user 0m0.096s sys 0m0.044s $ ## /tmpで実行 $ cd /tmp $ time docker build -f ./Dockerfile.dev -t build:sample . Sending build context to Docker daemon 9.216kB ・ ・(省略) ・ real 0m5.920s user 0m0.111s sys 0m0.054s $ ## /で実行 $ cd / $ time docker build -f ./Dockerfile.dev -t build:sample . error checking context: 'no permission to read from '/dev/disk0''. ・ ・(省略) ・ real 25m47.980s user 0m22.749s sys 1m39.197s $ |
上記からもわかりますようにかなりの違いがあります。(ルートディレクトリで実行したものはエラーで止まってしまいましたが)
ちなみにコンテント の外にあるファイルなどはDockerファイルをADDなどでDockerコンテナに置くことはできません。
Dockerファイルを置くフォルダはADDするファイルなどだけにして置く必要があります。
ENTRYPOINTとCMDの違い
そもそもRUNとの違いでいうと、RUNはDockerイメージを作成するのに使うコマンド。
ENTRYPOINTとCMDは作成されたイメージが起動されるときに実行されるコマンドです。
ENTRYPOINTの書式は以下の2種類があります。
1 2 3 4 |
ENTRYPOINT ["executable", "param1", "param2"] (シェルを介さずに実行:exec form。推奨される記法。) ENTRYPOINT command param1 param2 (シェルを介して実行:shell form) |
ENTRYPOINTを複数記述した場合には最後のENTRYPOINTが有効になります。
シェルを介して実行した場合にはコマンドは/bin/shの子プロセスとして動作します。(/bin/shがプロセスID 1でその子プロセスとなる)
ここで起こることは「docker stop」や「docker kill」のコマンドを実行したときにプロセスID 1のファイルにシグナルを送るのでデーモンなどを起動したときにシグナルを受け付けないということが起こります。
CMDの書式は以下の3種類です。
1 2 3 4 5 |
CMD ["executable","param1","param2"] (シェルを介さずに実行:exec form。推奨される記法。) CMD ["param1","param2"] (ENTRYPOINTのデフォルト引数として動作する) CMD command param1 param2 (シェルを介して実行:shell form) |
CMDを複数記述した場合には最後のCMDが有効になります。
ENTRYPOINTと似ていますがCMD目的はdocker runを行う際に実行されるデフォルトのコマンドを指定することです。
docker runコマンドでコマンド引数を渡した場合はデフォルトのCMDの値でなく引数の値が有効になります。
Dockerイメージを起動してログイン
特に以下の作業が必須なわけではありませんが、Dockerfile作成の時にはログインしてのトライエラーも必要な時がありますので記載しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE build sample 21bd85b3e011 About a minute ago 889MB $ docker run -d -it 21bd85b3e011 bash 189191a4daab720fbe65a856c5658ffc14ce14e3436eb9729c1feab7fcd27403 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 189191a4daab 21bd85b3e011 "bash" 12 seconds ago Up 11 seconds tender_darwin $ docker exec -it 189191a4daab bash root@189191a4daab:/# |
上記はまとめて書きましたがこちらで一通りの作業は完了です。
コマンドなどを試しながらDockerfileを作成していきましょう。
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。
お問い合わせやご依頼・ご相談など