💡
Docker概要図と簡易リファレンス(メモ)
Docker概要図と簡易リファレンス
コンテナとは何かやメリットは何かなどは理解している前提の自分用メモです。また、ある程度正しいと思いますが、理解優先・解釈不足のため厳密には正しくないと思います。使用Docker version: 20.10
ざっくり
環境構築手順書(Dockerfile)作成 -> 環境イメージ作成 -> 環境イメージからコンテナ作成・稼働
基本的なコンテナ作成手順
- ベースOSを決める
- 希望する環境を整える手順を模索する
- 手順をDockerfileファイルに記述する
- Dockerfileからイメージ作成
- イメージからコンテナ作成・実行
Docker概要図と対応するコマンド
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 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"]
個人開発でよく使いそうなオプションと他コマンド
-
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
- ビルドキャッシュ削除
参考文献
- 書籍: イラストでわかるDockerとKubernetes (Software Design plus)
- コンテナ未経験新人が学ぶコンテナ技術入門
- Dockerfile のコマンド一覧
- Dockerfileの"ENV"と"ARG"と"環境変数"について
- Dockerfileを極めて、Dockerマスターになろう!(コマンド簡易リファレンス)
- “bash -c”コマンド実行で子プロセスが作られる時、作られない時
- Dockerfile の ADD と COPY の違いを結論から書く
- DockerfileにてなぜADDよりCOPYが望ましいのか
- DockerfileのADDとCOPY、CMDとENTRYPOINTの違いを整理
- Dockerの使い方
- Docker BuildKit の --secret フラグでイメージビルド時の秘匿情報を環境変数経由で渡せるようになっていた
Discussion