こんにちは、おくやんです。
このブログでは、開発に役立つノウハウを実践的なコード例と共に紹介しています。
だけど、どのように書けばいいのかわからない。。。
今回は、このようなお悩みを解決します。
本記事の内容
今回はDockerfileの書き方についてまとめました。
基本を押さえてしまえばだれでも簡単にDockerfileを作成できるようになります。
本記事をとして、理解を深めてください。
Dockerfileとは
DockerfileとはDockerイメージを作成するための命令を記述するファイルです。簡単に言うと、イメージを作成するための設計書になります。
Docker Hubで公開されているイメージに、必要なパッケージなどを追加して自分の環境に合うようにカスタマイズして使います。
Dockerイメージとは
Dockerイメージとはコンテナを作成するためのテンプレートのようなものです。Dockerfileをビルドすることで生成されます。
Dockerイメージを起動することでコンテナが生成され、アプリケーションが起動します。
それではDockerfileの作成方法を解説していきます。
Dockerfileの作成方法
Dockerfileの作成方法について、下記の設定例をもとに解説していきます。
Dockerfile
# ①ベースとなるイメージの決定
FROM ruby:3.1.2-alpine3.15
# ②環境変数の設定
ENV LANG="ja_JP.UTF-8"
ENV APP_HOME="/app"
# ③作業フォルダを指定
WORKDIR $APP_HOME
# ④イメージをビルドするコマンドを実行
RUN apk update \
&& apk upgrade \
&& apk --update add \
tzdata \
postgresql-dev \
libstdc++ \
libressl \
libc6-compat \
libxml2-dev \
libxslt-dev \
zlib-dev \
yaml \
yaml-dev \
openssh \
ruby-json \
nodejs \
yarn \
vim \
git \
bash \
&& cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
&& rm -rf /var/cache/apk/*
RUN gem update --system \
&& gem install bundler --no-document
# ⑤公開するポートを設定
EXPOSE 3000
内容を解説していきます。
①ベースとなるイメージの決定
FROM ruby:3.1.2-alpine3.15
FROMではベースとなるイメージを設定します。
イメージはDocker Hubから探しましょう。
設定例では軽量なalpineを利用しています。alpine以外にもCentOSなど環境にあったイメージを利用可能です。
②環境変数の設定
ENV LANG="ja_JP.UTF-8"
ENV APP_HOME="/app"
ENVは環境変数の設定を行います。下記フォーマットで指定します。
ENV [key]=[value]
設定した環境変数はコンテナ上やDockerfile内のコマンドにて使用可能です。
③作業フォルダを指定
WORKDIR $APP_HOME
WORKDIRでは各命令を実行する作業フォルダを指定します。指定フォルダが存在しない場合は自動で作成されます。
環境変数を使って指定することも可能です。
設定例では環境変数を利用し、「/app」に設定しています。
④イメージをビルドするコマンドを実行
RUN apk update \
&& apk upgrade \
&& apk --update add \
tzdata \
・・・
RUNではコンテナ内で実行するコマンドの指定が可能です。
設定例ではパッケージのインストールや、ファイルのコピーを行っています。
⑤公開するポートを設定
EXPOSE 3000
EXPOSEでポート指定すると、対象ポートはコンテナ上でLISTENするようになります。
ただし、EXPOSEで指定しただけでは公開されません。公開するには「docker run -p」やdocker-compose.ymlに設定する「ports」でホスト上のポートとコンテナ上のポートをマッピングする必要があります。
docker-compose.ymlの書き方については下記を参照ください。
>> 【初心者向け】docker-compose.ymlの書き方を調べてみた
その他よく利用される命令
これ以外にも、よく使われる命令を解説していきます。
ファイル・フォルダをコピー
COPY nginx.conf.template /etc/nginx/nginx.conf.template
# もしくは
ADD nginx.conf.template /etc/nginx/nginx.conf.template
COPYやADDは、ファイルやフォルダをコピーを行います。
どちらもコンテナ上にファイル・フォルダをコピーできますが、ADDには下記の特徴があります。
ADDの特徴
・リモート環境からコピーができる(コピー元にhttps://xxxx…を指定できる)
それぞれの違いをまとめます。
COPY | ADD | |
---|---|---|
ファイル展開 | 展開しない | 展開する |
リモート環境からのコピー | コピーできない | コピーできる |
コンテナ起動時のコマンドを指定
CMD /bin/sh -c "nginx -g 'daemon off;'"
# もしくは
ENTRYPOINT /bin/sh -c "nginx -g 'daemon off;'"
ENTRYPOINTやCMDは、コンテナを起動した際に実行するコマンドを指定します。
共に指定した場合は、ENTRYPOINTの引数としてCMDの内容が設定されます。
ENTRYPOINTとCMDを併用する場合には、意図した動作になっているか注意が必要です。
まとめ: Dockerfileを実際に書いて動かしてみよう
今回はDockerfileの書き方についてまとめてみました。
各項目の役割はこちらです。
Dockerfileの項目
FROM | ベースとなるイメージの設定 |
ENV | 環境変数の設定 |
WORKDIR | 作業フォルダを指定 |
RUN | コンテナ内で実行するコマンドを指定 |
EXPOSE | 公開するポートを設定 |
COPY | ファイル・フォルダをコピー |
ADD | ファイル・フォルダをコピー ※ 圧縮ファイルは展開する ※ リモート環境からコピーできる |
CMD | コンテナ起動時のコマンドを指定 |
ENTRYPOINT | コンテナ起動時のコマンドを指定 ※ CMD句と両方指定した場合は、引数としてCMD句の内容が設定される |
Dockerfileを作成する際は参考にしてみてください。
最後まで読んでいただき、ありがとうございます。