Dockerfileとは、Dockerイメージを作成するためのテキストファイルです。Dockerfileにはコンテナのデプロイに必要な手順やコマンドが記述されています。
当記事はDockerfileを初めて使うユーザー向けにDockerfileの作り方と使い方を解説します。
Dockerのインストール方法(mac版)は別記事で解説しているので、こちらをご覧ください。
https://www.engineer-gari.tech/mac-docker-install/
Dockerfileの例
以下でDockerfileの例を示します。以下を実行することで、コンテナ内にpython3,pip3をインストールし、ローカル環境で開発しているtest.pyを実行できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#ベースイメージとしてUbuntu 22.04を指定 FROM ubuntu:22.04 #必要なパッケージ情報を更新し、Python3とpip3をインストール RUN apt-get update \ && apt-get install -y python3 python3-pip \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* #ローカルのtest.pyをコンテナ内の/appディレクトリにコピー COPY test.py /app/test.py #ワーキングディレクトリを設定 WORKDIR /app #test.pyをデフォルトで実行 CMD ["python3", "test.py"] #ワーキングディレクトリを設定 WORKDIR /app test.pyをデフォルトで実行 CMD ["python3", "test.py"] |
Dockerfileのコマンド
Dockerifileはコマンド 引数
の形式で記述します。以下が主なコマンドです。
コマンド | 説明 | 例 |
---|---|---|
FROM | ベースとなるDockerイメージを指定します。Dockerfileで必須です。 | FROM ubuntu:22.04 |
RUN | docker build 時に指定したコマンドを実行します。 | RUN apt-get update && apt-get install -y python3 |
COPY | ローカルのファイルやディレクトリをコンテナ内にコピーします。 | COPY test.py /app/test.py |
ADD | COPY に似ていますが、ローカルにないファイル(URLなど)からのダウンロードやアーカイブ展開ができます。セキュリティ面を考えると COPY がおすすめです。 | ADD https://example.com/file.tar.gz /app/ |
CMD | コンテナ起動時に実行されるデフォルトのコマンドを指定します。docker build 時には実行されません。Dockerfile内で1つのみ記述可能です(複数ある場合は最後のみ)。 | CMD ["python3", "app.py"] |
ENTRYPOINT | 引数を上書きせず、常に実行されるコマンドを指定します。CMD と併用した場合はENTRYPOINT が先に実行され、CMD は引数として利用される。 | ENTRYPOINT ["python3"] |
WORKDIR | コンテナ内の作業ディレクトリを指定します。 | WORKDIR /app |
ENV | 環境変数を設定します。 | ENV APP_ENV production |
EXPOSE | コンテナがリッスンするネットワークポートを指定します(公開には-p オプションが必要)。 | EXPOSE 8080 |
VOLUME | データを永続化するためのボリュームを指定します。 | VOLUME /data |
ARG | ビルド時に使用する引数を定義します。docker build で値を渡せます。 | ARG APP_VERSION=1.0 |
Dockerfileを利用することのメリット
Dockerfileの利用により以下を実現可能です。
イメージ作成の自動化
Dockerfileを使用することで、コンテナイメージの作成プロセスを自動化できます。Dockerfileを作成し、docker buildコマンドを実行すればDockerイメージが作成され、利用が可能になります。
管理が容易
テキストファイルであるため、作成や編集、バージョン管理が簡単にできます。例として利用したいOSやアプリのDockerイメージがEOSを迎えても、バージョンアップ時は新しいバージョンに数字を入れ替えるのみでDockerイメージの編集が完了です。
またlatestを指定しておけば、いつでも最新のDockerイメージを利用できます。
再現性が高い
同じDockerfileを使用することで、Dockerが利用できる環境であれば、異なるデバイス、OSでもでも同一のコンテナを利用可能です。
例としてWindows環境で実行したいアプリをLinux環境で開発するとします。それぞれでDockerが使えるのであればLinuxで開発したDockerfileを移動すれば同じアプリの実行、挙動が可能です。
Dockerfileを別環境で利用するパターン
Dockerfileは上記のメリットを活かし、以下2つのパターンで別環境での利用が想定されます。
Dockerfileを持って行き、docker build
でイメージ化して使う
Dockerfileそのものを移動させて、移動先でイメージ化を行って利用するパターンです。
このパターンは移動させるのはDockerfileのみのため、テキストのみの小さいサイズのファイルを移動させるのみで済みます。
また移動先で、Dockerfileを修正して利用することも可能であり、柔軟性が高いです。
Dockerfileを作った環境でdocker build
をし、docker save
でイメージとして持ち運ぶ
もう一つのパターンはイメージファイルを持っていくパターンです。
先述したDockerfileを移動する方法に比べて、ファイルサイズが大きいことや移動先で開発ができないデメリットがあります。
しかし、ネットワーク環境などの要因でdocker build
が満足に行えない環境では有効です。また、イメージをそのまま利用してほしいケースなどでは優れたパターンといえます。