Docker イメージ作成ステップバイステップ

DockerBeginner
オンラインで実践に進む

はじめに

この包括的な Docker チュートリアルは、開発者と DevOps 専門家に、Docker イメージの作成、管理、理解に関する重要な知識を提供します。イメージの構成要素、レイヤー構造、実践的な実装技術を探求することで、学習者はコンテナ化とアプリケーションパッケージングの実践的なスキルを習得します。

Docker イメージの基礎

Docker イメージとは?

Docker イメージは、コンテナを作成するために使用される読み取り専用のテンプレートです。事前に設定されたソフトウェア環境、アプリケーションコード、依存関係、および実行時設定を含んでいます。Docker イメージは、異なるシステム間で一貫性があり再現可能なアプリケーション環境をデプロイするための設計図として機能します。

Docker イメージの主要な構成要素

graph TD A[Docker イメージ] --> B[ベースレイヤー] A --> C[アプリケーションレイヤー] A --> D[設定レイヤー]
構成要素 説明
ベースレイヤー 基礎となるオペレーティングシステム Ubuntu 22.04
アプリケーションレイヤー ソフトウェアと依存関係 Python 3.9、nginx
設定レイヤー 実行時設定 環境変数

基本的な Docker イメージの作成

シンプルな Python ウェブアプリケーションイメージを作成する例を次に示します。

## プロジェクトディレクトリを作成
mkdir docker-demo
cd docker-demo

## Dockerfile を作成
touch Dockerfile

## Dockerfile の内容
cat > Dockerfile << EOL
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3 python3-pip
WORKDIR /app
COPY app.py .
RUN pip3 install flask
EXPOSE 5000
CMD ["python3", "app.py"]
EOL

## サンプルの Flask アプリケーションを作成
cat > app.py << EOL
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Docker イメージの例"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOL

## Docker イメージをビルド
docker build -t python-web-app .

イメージレイヤーとストレージ

Docker イメージは、複数の読み取り専用のレイヤーで構成されています。Dockerfile の各指示は新しいレイヤーを作成し、効率的なストレージと迅速なイメージ作成を可能にします。イメージがビルドされると、Docker はこれらのレイヤーをキャッシュして、ビルド時間を最適化し、ディスク容量の使用量を削減します。

イメージの識別

Docker イメージは、以下の情報で一意に識別されます。

  • リポジトリ名
  • タグ
  • イメージ ID

例:ubuntu:22.04 または python-web-app:latest

Docker イメージの構築

Dockerfile: イメージ作成の設計図

Dockerfile は、Docker イメージの構築手順を記述したテキストファイルです。各手順はイメージ内に新しいレイヤーを作成し、環境、依存関係、アプリケーションの設定を定義します。

graph TD A[Dockerfile] --> B[ベースイメージ] A --> C[依存関係のインストール] A --> D[アプリケーションコードのコピー] A --> E[実行時の設定]

Dockerfile の指示の種類

指示 目的
FROM ベースイメージを指定 FROM ubuntu:22.04
RUN コマンドを実行 RUN apt-get update
COPY ファイルをイメージにコピー COPY app/ /application
WORKDIR 作業ディレクトリを設定 WORKDIR /app
EXPOSE ネットワークポートを定義 EXPOSE 8080
CMD コンテナのデフォルトコマンド CMD ["python", "app.py"]

実践的な Docker イメージ構築例

## プロジェクト構造を作成
mkdir -p /tmp/docker-nodejs-app
cd /tmp/docker-nodejs-app

## Dockerfile を作成
cat > Dockerfile << EOL
FROM node:16-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
EOL

## package.json を作成
cat > package.json << EOL
{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}
EOL

## シンプルな Express サーバーを作成
cat > server.js << EOL
const express = require('express');
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
  res.send('Docker イメージ構築の例');
});

app.listen(PORT, () => {
  console.log($(Server running on port ${PORT}));
});
EOL

## Docker イメージをビルド
docker build -t nodejs-web-app .

## イメージの作成を確認
docker images

イメージ構築コンテキスト

構築コンテキストは、Dockerfile と参照されるファイルが含まれるディレクトリです。Docker は、イメージ構築中にこのディレクトリ全体を Docker デーモンに送信し、包括的なイメージ作成を可能にします。

マルチステージビルド

マルチステージビルドでは、単一の Dockerfile 内で複数の FROM ステートメントを使用して、ビルド時依存関係と実行時環境を分離することで、より小さく効率的なイメージを作成できます。

イメージ管理テクニック

Docker イメージ最適化戦略

効率的なイメージ管理は、イメージサイズを削減し、レイヤー数を最小限に抑え、イメージ作成と保存のためのベストプラクティスを実装することです。

graph TD A[イメージ管理] --> B[サイズ削減] A --> C[レイヤー最適化] A --> D[イメージバージョン管理] A --> E[レジストリ管理]

イメージサイズ削減テクニック

テクニック 説明
Alpine ベースイメージ 最小限の Linux ディストリビューション FROM alpine:3.15
マルチステージビルド ビルドと実行環境を分離 複数の FROM ステートメント
.dockerignore 不要なファイルを排除 大きなファイル転送を防ぐ

Docker イメージライフサイクル管理

## ローカルイメージ一覧
docker images

## 使用されていないイメージの削除
docker image prune

## イメージのタグ付けとバージョン管理
docker tag original-image:latest myregistry/image:v1.0

## Docker レジストリへのプッシュ
docker push myregistry/image:v1.0

## 特定のイメージバージョンをプル
docker pull myregistry/image:v1.0

高度なイメージ最適化例

## 最適化された Dockerfile を作成
cat > Dockerfile << EOL
## Python アプリケーションのためのマルチステージビルド
FROM python:3.9-alpine AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.9-alpine
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY . .
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
CMD ["python", "app.py"]
EOL

## requirements ファイルを作成
cat > requirements.txt << EOL
flask==2.1.0
gunicorn==20.1.0
EOL

## 最適化されたイメージをビルド
docker build -t optimized-python-app:slim .

## イメージサイズを分析
docker images | grep optimized-python-app

Docker レジストリ管理

Docker レジストリは、集中型のイメージ保存と配布を提供します。バージョン管理、アクセス制御、開発チームや環境間での効率的なイメージ共有をサポートします。

イメージレイヤーのキャッシュ

Docker は、イメージレイヤーをキャッシュして、後続のビルドを高速化します。Dockerfile の指示を、変更頻度の低い順に並べることで、再構築時間を最小限に抑え、イメージ作成プロセスを最適化します。

まとめ

Docker イメージは、現代のソフトウェアデプロイメントにおいて、アプリケーションとその依存関係を効率的にパッケージ化するための重要な要素です。イメージ作成技術を習得し、レイヤーの仕組みを理解し、Dockerfile の指示を活用することで、開発者は開発ワークフローを効率化し、異なるシステム間で信頼性があり移植性の高いアプリケーション環境を確立できます。