【初心者向け】Dockerfileの作り方

こんにちは、おくやんです。

このブログでは、開発に役立つノウハウを実践的なコード例と共に紹介しています。

Dockerfileからイメージの作成をしたい!
だけど、どのように書けばいいのかわからない。。。

今回は、このようなお悩みを解決します。

本記事の内容

Dockerfileとは
Dockerfileの作成方法

今回はDockerfileの書き方についてまとめました。

基本を押さえてしまえばだれでも簡単にDockerfileを作成できるようになります。

本記事をとして、理解を深めてください。

Dockerfileとは

Dockerfileとは画像

DockerfileとはDockerイメージを作成するための命令を記述するファイルです。簡単に言うと、イメージを作成するための設計書になります。

Docker Hubで公開されているイメージに、必要なパッケージなどを追加して自分の環境に合うようにカスタマイズして使います。

Dockerイメージとは

Dockerイメージとはコンテナを作成するためのテンプレートのようなものです。Dockerfileをビルドすることで生成されます。

Dockerイメージを起動することでコンテナが生成され、アプリケーションが起動します。

Dockerfileからコンテナ起動までの画像
Dockerfileからコンテナ起動まで

それではDockerfileの作成方法を解説していきます。

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の書き方についてまとめてみました。

各項目の役割はこちらです。

 Dockerfileの項目

FROM ベースとなるイメージの設定
ENV 環境変数の設定
WORKDIR 作業フォルダを指定
RUN コンテナ内で実行するコマンドを指定
EXPOSE 公開するポートを設定
COPY ファイル・フォルダをコピー
ADD ファイル・フォルダをコピー
※ 圧縮ファイルは展開する
※ リモート環境からコピーできる
CMD コンテナ起動時のコマンドを指定
ENTRYPOINT コンテナ起動時のコマンドを指定
※ CMD句と両方指定した場合は、引数としてCMD句の内容が設定される

Dockerfileを作成する際は参考にしてみてください。

最後まで読んでいただき、ありがとうございます。


最新情報をチェックしよう!

Dockerの最新記事8件