Dockerfileの概要

Dockerfileは、Dockerイメージの作成方法・プロビジョニング方法を定義できるもの。
(アプリケーションが動作するOS環境の作りかたを定義できる)

まず、Dockerの最大のメリットをおさらいすると、「本番環境へランタイムごとデリバリー可能」ということ。Githubなどで管理するソースコードに加え、動作環境丸ごと本番へ提供できるので「本番へデプロイしたらうまく動作しない!」なんてことはない。インフラエンジニアとの戦争に終止符を打つことができる。

基本的なDockerファイル作成の流れ

ローカル開発時

大前提としては、DockerfileファイルはDocker-composeで管理します。アプリ開発時は、複数のDockerfileを用いて開発を行うのが一般的なので、Docker-compose導入を前提としてDockerfileを作成する。(例えばアプリの動作するウェブサーバーのDockerfile、データベースのホスト用のDockerfile等)

  1. Dockerfileを作成
  2. イメージ(OS)に対してパッケージをインストールしアプリ動作環境を作る
  3. 適宜環境変数を設定し、Dev, Prdなどでアプリの動作を切り替え
  4. ローカルのディレクトリをマウントさせる(同期させる)
  5. マウントしたディレクトリのソースを編集しゴリゴリ開発
  6. githubなどへプッシュし開発メンバーへ共有

本番公開

私はECS, Fargate構成が好きなので普段こうしています。(詳しい解説は割愛します、そのうち別の記事で載せます)

  1. Githubのmasterブランチへのコミットマージでリリースタグを作成
  2. リリースタグ作成によりAws CodePipelineを発火
  3. Code BuildでDockerをビルドしECRへプッシュ
  4. Code DeployでECSへデプロイ

 
もちろん。EC2にDockerコンテナーをデーモン起動させれば、もちろんEC2やその他のOSで起動可能。でもLambdaなどの使い捨てOSでは不可能なので注意。

Dockerfileのサンプルと解説

下記はよく作成するDockerfileのケース。Volumeの指定などはDocker-composeで行うので、Dockerfileでは行わない。

FROM httpd

RUN echo "build start!"

COPY index.html /usr/local/apache2/htdocs

EXPOSE 80

CMD ["apachectl", "-D", "FOREGROUND"]
項目 説明
FROM 元になるイメージを指定します。タグ指定しない場合はlatestとなる。
COPY 指定のディレクトリへコンテナーへマウント。ADDよりこっちがCOPYが推奨みたい。
ADD COPYと異なるのは、tar展開などを自動的にやってくれるところ。
CMD Dcoker runの時に実行。docker runの引数で上書きできる。
ENTRYPOINT CMDの、docker runの引数で上書きできないやつ。(--entrypointであれば上書き可能)
ENV OSに環境変数を与える。
EXPOSE コンテナが接続用にリッスンするポートを指定。(Apache等なら80とする)
RUN いろんなコマンドを実行できう
WORKDIR コンテナー内の作業ディレクトリを指定。

まとめ

Dockerって便利だけど小規模開発では大げさな気もするので、使用する際はプロジェクトの規模で検討したいところ。小規模な開発やスタートアップであれば、正直API GatewayとLambda、フロントエンドはSPAであればS3とCloudFrontなどの選択肢もある。