Docker

Dockerfile入門|自分のアプリをコンテナ化する基本

Docker Dockerfile イメージビルド

Dockerfile入門
自分のアプリをコンテナ化する基本

Dockerfileの書き方、主要な命令、ベストプラクティスを解説します。

こんな人向けの記事です

  • 自分のアプリをDockerイメージにしたい人
  • Dockerfileの各命令の意味を知りたい人
  • 効率的なDockerfileの書き方を学びたい人

Step 1Dockerfileとは

Dockerfileは、Dockerイメージの構築手順を記述したテキストファイルです。ベースイメージの指定、依存パッケージのインストール、アプリのコピー、起動コマンドなどを定義します。

Step 2基本的なDockerfile

Pythonアプリケーションの例です。

Dockerfile
# ベースイメージの指定
FROM python:3.13-slim

# 作業ディレクトリの設定
WORKDIR /app

# 依存ファイルを先にコピー(キャッシュ活用)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションのコピー
COPY . .

# ポートの公開
EXPOSE 8000

# 起動コマンド
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Step 3主要な命令一覧

命令説明
FROMベースイメージの指定FROM python:3.13
WORKDIR作業ディレクトリの設定WORKDIR /app
COPYファイルのコピーCOPY . .
RUNビルド時にコマンド実行RUN pip install -r requirements.txt
CMDコンテナ起動時のコマンドCMD ["python", "app.py"]
EXPOSE公開ポートの宣言EXPOSE 8000
ENV環境変数の設定ENV DEBUG=false
ARGビルド時の引数ARG VERSION=1.0
VOLUMEボリュームのマウントポイントVOLUME /data

Step 4イメージのビルドと実行

ターミナル
# イメージのビルド
docker build -t myapp:latest .

# コンテナの実行
docker run -d -p 8000:8000 --name myapp myapp:latest

# ビルドキャッシュを使わずにビルド
docker build --no-cache -t myapp:latest .

Step 5docker-compose.ymlとの連携

docker-compose.yml
services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_DB: mydb
      POSTGRES_PASSWORD: password
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

Step 6ベストプラクティス

  • 軽量なベースイメージを使う: slimalpineを選ぶとイメージサイズが小さくなる
  • レイヤーキャッシュを活用: 変更頻度の低いファイル(requirements.txt等)を先にCOPYする
  • .dockerignoreを使う: 不要なファイル(.git、node_modules等)をビルドから除外する
  • RUN命令をまとめる: レイヤー数を減らしてイメージサイズを小さくする
.dockerignore
.git
__pycache__
*.pyc
.env
node_modules