Dockerの概要と、RailsをはじめとするWebアプリについて、Docker化の手順についてまとめました。
Dockerとは?(概要)
- 従来であれば、ホストPCの環境に合わせてパッケージやライブラリをインストールし、環境構築を行うがdockerを使用することにより、ホスト側の環境を気にする事なくポータブルな環境構築を可能にしたコンテナ型プラットフォーム。
用語 |
説明 |
Dockerfile |
イメージの設計図、イメージ作成の際、Dockerfileにより実行されるコマンド、ディレクトリが決定される。コードはINSTRUCTION(指示) arguments(引数) の順番で記述する |
Image |
Dockerリポジトリにアップロードされているイメージもあるが、自ら作成したDockerfileにより、利用したい実行環境に合わせたイメージを作成することができる |
Container |
イメージを基に作成された実行環境、中身はDocker engine上で動いており、起動時に設定された以外のホストPCの動作環境の影響を受けない |
Docker-compose.yml |
複数のコンテナを同時に扱うための設定ファイル、このファイルからコンテナを起動することにより、複数のコンテナの接続・連携によりWebアプリを動作させることができる |
Docker化の手順
- Dockerレジストリ(DockerHubなど)より、ベースとなるイメージをPull
- ホストPCでPullしたイメージを実行し、作成したコンテナの中で、Webアプリを実行。その際実行に必要となるパッケージのリストアップを忘れずに行う
- Dockerfileの作成、ベースイメージのPullと、そこに必要なパッケージのインストール、ディレクトリの同期、ファイルの追加などコードの記述を行う
- (Webアプリのコンテナとデータベースコンテナなど、立ち上げるコンテナがそれぞれ複数の場合)予め立ち上げる複数のコンテナ情報を記述した、docker-compose.ymlを作成する。
各INSTRUCTION解説
Dockerコマンドだけでも、それだけで記事が一つ書けるくらいボリュームがありますが、今回はDockerfileとdocker-compose.ymlファイル構成に焦点を当て、まとめてみました。
用語 |
解説 |
FROM |
ベースとなるイメージを決定(DockerfileはFROMから書き始める) |
RUN |
コマンドを実行、RUN毎にLayerが作られる |
CMD |
["executable", "params1", "params2"] コンテナのデフォルトコマンドを指定、原則Dockerfileの最後に記述、一つのDockerfileに一つだけ記述 |
COPY |
ホストPCからファイルを渡す事ができる |
ADD |
COPYと同じくホストPCからファイルを渡すことができるが、圧縮(アーカイブ)ファイルを解凍したい場合に使用する事が多い |
ENV |
<キー名> <値> (若しくは <キー名>=<値>) 環境変数を設定 |
WORKDIR |
<絶対パスを指定> Docker instruction(ex.RUNコマンド)の実行ディレクトリを変更する、&&で繋げてコマンドを記述した場合は移動先でコマンドが実行される。なお指定されたパスの先に対象のファイルが無ければ、対象ファイルを自動生成する |
(参考:デフォルトではRUNコマンドは全てroot直下で実行される)
RUNとCMDの違い
- CMDはimageをrunした際に初めて実行される(Doker imageの中には記述されない)
- RUNはLayerを作る、CMDはLayer作らない
COPYとADDの違い
- 単純にファイルやフォルダをコピーする場合はCOPYを使用
- tarの圧縮ファイルをコピーして解凍したいときはADDを使用
CMDとENTRYPOINTの違い
- ENTRYPOINT ["executable"] デフォルトのコマンドを指定する事ができる
- docker runコマンドでコマンドを上書き出来るのはCMDコマンドのみ
- 但し、ENTRYPOINTを記述した場合、続いてCMDを使用する場合はCMDはENTRYPOINTで指定したコマンドの引数(オプション)のみを記述することになる CMD [
"executable", "params1", "params2"]
- 実際にはdocker run コマンドで引数を指定して上書きコマンドを実行する際に利用する事が多い
Dockerfileの効率の良い作成方法
- 前提:DockerfileのINSTRUCTION : RUN, COPY, ADDにはDocker imageのサイズを肥大化させるlayerを追加する機能もあるため、Dockerfile内の記述数を最小限にする。そのために、コマンドを&&で繋げる・バックスラッシュで改行する
- 作成途中は都度都度RUNでレイヤーを作成しながらfileを作成していく。完成後、コードのリファクタリングを行い、RUNの記述を最小限にしてスマートなDockerfileを目指す。
(参考) RailsプロジェクトのDocker化におけるDockerfile(左)とdocker-compose.yml(右)のコード解説
Dockerfileもしくはdocker-compose.yml作成後の起動と停止
- Dockerfileから起動する場合は、Webアプリのルートディレクトリ(ビルドコンテキストとも言う)に移動し、docker build .コマンドを実行によりイメージを作成し、docker runコマンドによりコンテナを起動(停止はdocker stopコマンド)
- docker-compose.ymlファイルから起動する場合は、docker-compose upコマンドでコンテナの立ち上げてWebアプリを起動する。(停止はdocker-compose stop、コンテナの停止と削除を一度に実行する場合はdocker-compose downコマンド)