コンテナイメージ
• コンテナ化された環境で利⽤するファイルシステムなどをまと
めたもの
• 主な内容物はコンテナ化されるプロセスから参照される Mount
Namespace にマウントされるファイル群の tar アーカイブ
• この tar アーカイブの root を隔離したプロセスに対するルー
トファイルシステムとして pivot_root する
IBUFOBJOUFSO
!"
Slide 26
Slide 26 text
Union ファイルシステム
• 複数の異なるファイルシステムを重ね合わせて利⽤できる仕組
み
• OverlayFS などの実装がある
IBUFOBJOUFSO
!"
Slide 27
Slide 27 text
Union ファイルシステム
• ベースとなる下位ディレクトリ (Lower Dir) に対し、差分を上位ディレクト
リ (Upper Dir) として重ね合わせる
• コンテナイメージに含まれるファイルシステムは Lower Dir、コンテナ上で
変更されるファイルシステムを Upper Dir とする
• Lower Dir は変更されないので1つのコンテナイメージを複数のコンテナ
インスタンスで共有できる
• 変更を個々のコンテナインスタンス毎の Copy on Write レイヤー (Upper
Dir) に適⽤する
IBUFOBJOUFSO
!"
Slide 28
Slide 28 text
Dockerfile
# syntax=docker/dockerfile:1
FROM golang:1.23-bookworm AS builder
WORKDIR /services/blog
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN !"mount=type=cache,target=/root/.cache/go-build \
make build
FROM debian:bookworm
COPY !"from=builder \
/services/blog/bin/server \
/services/blog/bin/server
RUN adduser -D -u 1000 app
USER 1000
ENTRYPOINT ["/services/blog/bin/server"]
• 単純なテキストベースのスクリプ
トファイル
• コンテナイメージを⽣成するため
の命令が記述されている
• イメージビルダによって
Dockerfile がコンテナイメージへ
と変換される
IBUFOBJOUFSO
!"
Slide 29
Slide 29 text
コンテナイメージの構造を覗く
以下の Dockerfile をビルドしてイメージを作成する
FROM ubuntu
RUN echo "hoge" > hoge.txt
RUN rm hoge.txt
作成したイメージを出⼒して解凍する
docker save $CID > image.tar
tar xf image.tar
IBUFOBJOUFSO
!"
レイヤーキャッシュ
# syntax=docker/dockerfile:1
FROM golang:1.23-bookworm AS builder
WORKDIR /services/blog
COPY go.mod go.sum ./ # ͕͜͜มߋ͞Εͨ߹ ↓ ͷ෦Λ࠶࣮ߦ
RUN go mod download
COPY . .
RUN "#mount=type=cache,target=/root/.cache/go-build \
make build
• コンテナイメージのビルド時に
は Lower Dir に対する変更を
Upper Dir として新しいレイヤー
⽤の tar アーカイブを作成する
• ⼀度実⾏した命令は Lower Dir
として残っているので、Upper
Dir による変更だけを⾏えばよ
く、レイヤーキャッシュが利⽤
できる
IBUFOBJOUFSO
!!
Open Container Initiative (OCI)
• コンテナの業界標準を定める団体
• 現在 Runtime Spec, Image Spec, Distribution Spec が定義さ
れている
IBUFOBJOUFSO
!"
Slide 42
Slide 42 text
Open Container Initiative (OCI)
Runtime Specification
• コンテナランタイムの実現すべき挙動が主に定義されている
• コンテナの原則 (The C principles of Standard Containers)
• コンテナのライフサイクルや、コンテナに対して実⾏可能な操作
• 付与する capability, Namespace, cgroup によるリソースの制
限の指定⽅法など
IBUFOBJOUFSO
!"
Slide 43
Slide 43 text
Open Container Initiative(OCI)
The % principles of Standard Containers
• ". Standard operations
• 起動‧停⽌‧削除やスナップショットの取得などの基本的な操作が可能
• L. Content-agnostic
• コンテナに対する操作はコンテナの内容によらず同じ結果になる
• b. Infrastructure-agnostic
• OCI に準拠しているコンテナランタイム上で動くコンテナは、どのような場所やアーキテクチャの上でも同様に動作する
• . Designed for automation
• Ç. Industrial-grade delivery
IBUFOBJOUFSO
!"
イメージのスキャン
Trivy
• https://github.com/aquasecurity/trivy
• Docker イメージ、ファイルシステム、Git リポジトリに対してスキャンができる
• イメージの SBOM からも脆弱性をスキャンできる
$ trivy image !"severity HIGH hatena/apply-for-internship-2020:latest
2020-08-05T08:44:37.496+0900 WARN You should avoid using the :latest tag as it is cached. You need to specify '!"clear-cache' option when :latest image is changed
2020-08-05T08:44:40.616+0900 INFO Detecting Debian vulnerabilities!!$
hatena/apply-for-internship-2020:latest (debian 10.4)
=====================================================
Total: 1 (HIGH: 1)
+-----------+------------------+----------+-------------------+------------------+--------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+-----------+------------------+----------+-------------------+------------------+--------------------------------+
| perl-base | CVE-2020-10878 | HIGH | 5.28.1-6 | 5.28.1-6+deb10u1 | perl: corruption of |
| | | | | | intermediate language state |
| | | | | | of compiled regular expression |
| | | | | | due to!!$ |
+-----------+------------------+----------+-------------------+------------------+--------------------------------+
IBUFOBJOUFSO
!"