Dockerイメージをビルドする

Dockerfileを使って独自のDockerイメージを作成する手順をまとめました。

Dockerfileとは

Dockerリポジトリから元となるDockerイメージをPullして、コンテナを起動し、必要なアプリをインストールして、設定をして・・・といった一連の流れをコードにまとめたファイルです。
dockerfileを使えば、自分独自のカスタマイズされたDockerイメージを作成できるため、環境構築負荷の軽減が期待できます。

コマンド

dockerfileに対して使うコマンド(抜粋)

コマンド 内容
docker build -t [イメージ名]:[タグ名] [dockerfileの格納場所]dockerfileに沿って、ローカルにDockerイメージを作成

dockerfile内に記述できるコマンド(抜粋)

コマンド内容
FROM [Dockerリポジトリのイメージ名]カスタマイズの元となるDockerイメージをDockerリポジトリからPull
LABEL [キー]=[値]Dockerイメージにメタデータを追加
ADD
COPY
ファイルやディレクトリを追加
RUNFROMでPullしたイメージから作成したコンテナ内のシェルで実行
→docker build用の設定
ENTRYPOINTイメージから作成したコンテナ内のシェルでコマンドを実行
→docker run用の設定
CMD独自イメージから作成したコンテナ内のシェルでコマンドを実行
もしくは
ENTRYPOINTの引数として使用
WORKDIR作業ディレクトリを指定
ENV環境変数を指定
USER作業ユーザーを指定
EXPOSEコンテナ側のポートを解放(外部からはアクセス不可)
VOLUMEコンテナ内のマウントポイントを指定

ENTRYPOINTとCMDの関係性

ENTRYPOINTとCMDの関係性を簡単にまとめました。

ENTRYPOINTがある場合
 docker runに引数がある場合
  :docker runの引数をENTRYPOINTの引数として扱う
 docker runに引数がない場合
  CMDがある場合
   :CMDをENTRYPOINTの引数として扱う
  CMDがない場合
   :ENTRYPOINTをそのまま実行

ENTRYPOINTがない場合
 docker runに引数がある場合
  :docker runの引数をコマンドとして扱う
 docker runに引数がない場合
  CMDがある場合
   :CMDをコマンドとして扱う
  CMDがない場合
   :特に何もしない

サンプル

dockerfileでnginxをカスタマイズしたイメージを作成して実行してみます。

作業ディレクトリを作成

下記ファイル・ディレクトリ構成を作成します。

.
├── customize
│   └── index.html
└── dockerfile

index.htmlを準備

ここではnginxのトップページをカスタマイズしてみたいと思いますので、
そのトップページ用のファイル(index.html)を準備します。

dockerfileを準備

FROM nginx:latest
LABEL vender="mitikusa-engineer.com"
COPY ./customize/index.html /usr/share/nginx/html/index.html
ARG USERNAME=docker_user
ARG GROUPNAME=docker
ARG UID=77777
ARG GID=77777
ARG PASSWORD=docker_pass
RUN groupadd -g $GID $GROUPNAME
RUN useradd -l -m -g $GID -u $UID -G sudo $USERNAME
RUN echo $USERNAME:$PASSWORD | chpasswd
RUN echo "$USERNAME   ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
EXPOSE 80

1行目  :最新のnginxイメージをPull
2行目  :ラベルを付ける(docker inspectコマンドで確認)
3行目  :カスタマイズしたトップページでデフォルトを上書き
4~8行目:ユーザー作成用の環境変数
9行目  :ユーザーグループの作成
10行目 :ユーザーの作成
11行目 :パスワード変更
12行目 :sudoをパスワードなしで実行可能にする

dockerfileをビルド

sudo docker build -t mynginx:v1.0 -f dockerfile .
※-f:dockerfile名を明示的に指定できる

dockerイメージが完成したことを確認します。

sudo docker images

コンテナに指定ユーザーでログインできることを確認

sudo docker exec -it --user=docker_user mynginx_cont /bin/bash

コンテナを作成・起動し、nginxが起動していることを確認

sudo docker run -dit -p 80:80 --name mynginx_cont mynginx:v1.0
# 仮想環境に作成した場合
http://[仮想環境のIPアドレス]:80/
# ホストPCに作成した場合
http://localhost:80/