💡

Docker概要図と簡易リファレンス(メモ)

2022/09/08に公開

Docker概要図と簡易リファレンス

コンテナとは何かやメリットは何かなどは理解している前提の自分用メモです。また、ある程度正しいと思いますが、理解優先・解釈不足のため厳密には正しくないと思います。使用Docker version: 20.10

ざっくり

環境構築手順書(Dockerfile)作成 -> 環境イメージ作成 -> 環境イメージからコンテナ作成・稼働

基本的なコンテナ作成手順

  1. ベースOSを決める
  2. 希望する環境を整える手順を模索する
  3. 手順をDockerfileファイルに記述する
  4. Dockerfileからイメージ作成
  5. イメージからコンテナ作成・実行

Docker概要図と対応するコマンド

概要図

Dockerfileをどうやって簡単に作るのか

効率的に安全な Dockerfile を作るには

FROMが図中のImage_A:v1のBase layerに相当する。RUNを記載する毎に図中のModified diff layerが増えていきイメージ全体の容量が増えていく。意味のある操作単位でRUNを記載すると取り扱いやすい。コンテナ上で実行させたいアプリケーションにおいて、コンパイル環境と実行環境で必要となる環境が異なるような場合、マルチステージビルドの記法を用いるとイメージ容量を削減できる。

よく使いそうなDockerfile内コマンドと使い方

公式リファレンス

コマンド 用途 備考
FROM ベースとなるイメージをセット ビルドステージ初期化の意味合いもある
LABEL イメージにメタデータを付与 バージョンや作者名等
ARG Dockerfile内での変数を定義 Dockerfile内だけで有効
ENV コンテナ内の環境変数を定義 コンテナ起動後にも環境変数として有効
RUN 任意のシェルコマンドを実行 /bin/sh -c commandと等価
COPY ローカルファイルをコンテナ内にコピー ADDよりもCOPYが望ましい
ADD リモート含むファイルをコンテナ内にコピー ディレクトリ自動作成や自動解凍される
USER 以降のRUN実行ユーザ指定
WORKDIR 以降の作業ディレクトリを指定 相対パス指定の場合は過去の指定に依存
EXPOSE リッスンポート指定 ポート公開はrun -pで指定の必要あり
VOLUME 変更を検知しないディレクトリ指定 指定への変更はイメージに含まれない
ENTRYPOINT コンテナ実行時のコマンドを定義 Dockerfile内で一度のみ使用可
CMD コンテナ実行時の可変なコマンドや引数を定義 Dockerfile内で一度のみ使用可
# FROM ubuntu  の記述は ubuntu:latest と同等
FROM ubuntu:20.04
LABEL maintainer="scirexs@sample.com"
LABEL version="1.0"
LABEL description="This is multi line \
sample label description."
# ARG_FOOの値は実行時に--build-argで指定する イメージ内にplain textで保存されるため認証情報は指定しない
ARG ARG_FOO
# デフォルト値指定可能,揮発性環境変数としても機能する
ARG DEBIAN_FRONTEND=noninteractive
# 一行で複数の環境変数定義可能
ENV THIS_VERSION=1.0 THIS_DESC="d e s c r i p t i o n"
ENV THIS_MAINTAINER=scirexs@sample.com
# RUNの単位でイメージ内のlayerが構成される=イメージ容量に直結する
RUN apt update \
    && apt upgrade \
    && apt -y install sudo curl \
    && adduser scirexs \
    && gpasswd -a scirexs sudo \
    && echo "scirexs ALL=(ALL:ALL) NOPASSWD: ALL" > "/etc/sudoers.d/dont-prompt-scirexs-for-sudo-password"
# 認証情報指定はbuild引数で指定したidを用いる
RUN --mount=type=secret,id=SECRET_KEY echo scirexs:`cat /run/secrets/SECRET_KEY` | chpasswd
# Dockerfileと同じディレクトリにあるファイルをコピー
COPY . /tmp/
EXPOSE 80
# 本来の用途はデータ永続化volumeを指定すると思われる
VOLUME /home/scirexs

USER scirexs
WORKDIR ~
# ADDの代わりに使用可能なRUN 余計なlayerを増やさず後続処理に繋ぐことが可能
RUN mkdir sample \
    && curl -SL https://www.sample.com/ftp/scirexs.tar.gz | tar -xzf . \
    && echo ${ARG_FOO} > build_arg.txt

# JSON形式のためダブルクオーテーション
ENTRYPOINT ["ping"]
CMD ["192.168.0.111"]

CMD と ENTRYPOINT の連携を理解

個人開発でよく使いそうなオプションと他コマンド

  • docker build . --build-arg ARG_NAME=VAL --secret id=SECRET_KEY --no-cache -t IMG_NAME:TAG
    • -t: 作成イメージにイメージ名を付ける
    • --build-arg: Dockerfile内で定義した ARG ARG_NAME にVAL値を代入する
    • --secret id=SECRET_KEY: 環境変数SECRET_KEYの値を認証情報として用いる
    • --no-cache: キャッシュを使用せずにビルドする
  • docker build . --secret id=secret_key,src=secret_key.txt --no-cache -t IMG_NAME:TAG
    • --secret id=secret_key,src=secret_key: Dockerfile内で --mount=type=secret,id=secret_key を記載した行で /run/secrets/secret_key としてsecret_key.txtの内容が取り扱える
  • docker run -it -u LOGIN_USER -d -p PUBPORT:PORT --rm --name CTR_NAME IMG_NAME:TAG COMMAND
    • -it: 実行したコンテナ環境を対話的に操作する
    • -u LOGIN_USER: ログインユーザ指定
    • -d: バックグラウンド実行
    • -p PUBPORT:PORT: 外部公開ポートPUBPORTをコンテナ内ポートPORTにフォワード
    • --rm: 対話的な操作終了時に自動でコンテナ環境が破棄される(docker rm)
    • --name CTR_NAME: コンテナ環境に名前CTR_NAMEを付ける
  • docker exec -it CTR_NAME bash
    • -it付けずに実行しているコンテナ環境を対話的に操作する
  • docker rmi -f IMG_NAME
    • -f: 強制削除
  • docker export -o EXPORT_PATH
    • -o EXPORT_PATH: 指定したパスに出力する
  • docker commit CTR_NAME IMG_NAME:TAG

  • docker images
    • イメージの一覧確認
  • docker ps -a
    • コンテナの一覧確認
  • docker system df
    • ディスク使用量確認
  • docker image prune
    • 使用していないイメージ削除
  • docker container prune
    • 使用していないコンテナ削除
  • docker system prune
    • 使用していないオブジェクト全削除
  • docker builder prune
    • ビルドキャッシュ削除

参考文献

Discussion