![Dockerイメージをビルドする](https://mitikusa-engineer.com/wp-content/uploads/2023/06/Docker-1024x538.png)
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 | ファイルやディレクトリを追加 |
RUN | FROMで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
![](https://mitikusa-engineer.com/wp-content/uploads/2022/06/WS000010-2.jpg)
コンテナに指定ユーザーでログインできることを確認
sudo docker exec -it --user=docker_user mynginx_cont /bin/bash
![](https://mitikusa-engineer.com/wp-content/uploads/2022/06/WS000001-6.jpg)
コンテナを作成・起動し、nginxが起動していることを確認
sudo docker run -dit -p 80:80 --name mynginx_cont mynginx:v1.0
# 仮想環境に作成した場合
http://[仮想環境のIPアドレス]:80/
# ホストPCに作成した場合
http://localhost:80/
![](https://mitikusa-engineer.com/wp-content/uploads/2022/06/WS000000-8.jpg)