こんにちは!今回は、Dockerの基本をマスターした方向けに、より実践的な内容をお届けします。
「Dockerコマンドは分かったけど、実際の開発ではどう使えばいいの?」
「Dockerfileって難しそう…」
「複数のコンテナを一緒に使いたいんだけど…」
そんな疑問をお持ちの方にぴったりの内容です!
今回参考にするのは、小笠原種高さんの「仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん」です。この書籍では、Dockerfileの書き方からDocker Composeの実用的な使い方まで、実務で本当に使える知識が詳しく解説されています。
この記事を読み終える頃には、あなたも自信を持ってDockerfileを書き、Docker Composeで複数コンテナを管理できるようになっているはずです!
Dockerfileとは何か?基本を理解しよう
Dockerfileの役割と重要性
Dockerfileは、Dockerイメージを自動的に構築するためのテキストファイルです。
「なぜDockerfileが必要なの?」と思う方もいるかもしれません。
確かに、Docker Hubから既存のイメージをダウンロードして使うこともできます。でも、実際の開発では:
- 自分のアプリケーションを含むイメージが欲しい
- 特定のライブラリや設定が必要
- チーム全員が同じ環境で開発したい
こんな場面が必ずあります。そこで活躍するのがDockerfileなんです!
イメージとDockerfileの関係
分かりやすく例えると:
レシピ(Dockerfile)→ 料理(イメージ)
Dockerfileは「イメージの作り方を書いたレシピ」です。
このレシピに従って材料(ベースイメージ、アプリケーションコード、設定ファイルなど)を組み合わせることで、完成した料理(カスタムイメージ)ができあがります。
Dockerfileを使うメリット
再現性
同じDockerfileからは、必ず同じイメージが作られます。
バージョン管理
GitでDockerfileを管理すれば、環境の変更履歴も追跡できます。
自動化
CI/CDパイプラインに組み込んで、イメージビルドを自動化できます。
ドキュメント化
Dockerfileを見れば、どんな環境なのかが一目で分かります。
Dockerfileの書き方をマスターしよう
Dockerfileの基本構文
Dockerfileは、命令文を順番に書いたテキストファイルです。
基本的な構造を見てみましょう:
# ベースイメージを指定
FROM ubuntu:20.04
# メンテナーの情報
LABEL maintainer="your-email@example.com"
# パッケージのインストール
RUN apt-get update && apt-get install -y \
python3 \
python3-pip
# 作業ディレクトリの設定
WORKDIR /app
# ファイルのコピー
COPY . /app
# 依存関係のインストール
RUN pip3 install -r requirements.txt
# ポートの公開
EXPOSE 8000
# 起動時のコマンド
CMD ["python3", "app.py"]
「うわ、なんか複雑…」と思うかもしれませんが、大丈夫です!
一つずつ説明していきますね。
よく使う命令文の解説
FROM – ベースイメージの指定
FROM python:3.9
「Pythonがインストール済みのイメージを土台にする」という意味です。
RUN – コマンドの実行
RUN pip install flask
イメージ作成時にコマンドを実行します。
COPY – ファイルのコピー
COPY app.py /app/
ホストのファイルをイメージ内にコピーします。
WORKDIR – 作業ディレクトリの設定
WORKDIR /app
以降のコマンドの実行場所を指定します。
EXPOSE – ポートの公開
EXPOSE 8000
「このコンテナは8000番ポートを使うよ」という宣言です。
CMD – デフォルトコマンド
CMD ["python", "app.py"]
コンテナ起動時に実行されるコマンドです。
実際にDockerfileを作ってみよう
簡単なWebアプリケーションのDockerfileを作ってみましょう。
プロジェクト構成
my-app/
├── Dockerfile
├── app.py
└── requirements.txt
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Docker!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
requirements.txt
Flask==2.0.1
Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
これで、docker build -t my-app .
でイメージを作成できます!
Docker Composeで複数コンテナを管理
Docker Composeとは何か
Docker Composeは、複数のDockerコンテナを定義・実行するためのツールです。
「なぜ複数のコンテナが必要なの?」
実際のWebアプリケーションでは:
- Webサーバー(アプリケーション)
- データベース(MySQL、PostgreSQLなど)
- キャッシュサーバー(Redis)
- ロードバランサー(Nginx)
など、複数のサービスを組み合わせることがほとんどです。
これらを一つ一つ手動で起動するのは大変ですよね。Docker Composeなら、一つのコマンドですべてのサービスを起動できます!
docker-compose.ymlの書き方
Docker Composeの設定は、docker-compose.ymlファイルに記述します。
基本的な構造を見てみましょう:
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- db
environment:
- DATABASE_URL=postgresql://user:password@db:5432/myapp
db:
image: postgres:13
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
複数サービスの連携方法
上の例では、以下のように連携しています:
webサービス
- 現在のディレクトリのDockerfileからビルド
- ホストの8000番ポートとコンテナの8000番ポートを接続
- dbサービスに依存
dbサービス
- PostgreSQLの公式イメージを使用
- 環境変数でデータベースの設定
- ボリュームでデータを永続化
ネットワーク
Docker Composeが自動的にネットワークを作成し、サービス同士が通信できるようになります。
実務で役立つDocker活用パターン
開発環境の構築
課題:新しいメンバーが参加するたびに、環境構築で半日かかる…
解決:Docker Composeで開発環境を定義!
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=myapp_dev
ports:
- "3306:3306"
redis:
image: redis:alpine
ports:
- "6379:6379"
これでdocker-compose up
一発で、完全な開発環境が起動します!
データベースとアプリケーションの連携
実際のアプリケーション開発では、データベースとの連携が必須ですね。
ポイント:
- 環境変数で接続情報を管理
- ボリュームでデータを永続化
- depends_onで起動順序を制御
services:
web:
build: .
environment:
- DB_HOST=db
- DB_USER=myapp
- DB_PASSWORD=secret
depends_on:
- db
db:
image: postgres:13
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=myapp
- POSTGRES_PASSWORD=secret
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
本番環境への展開
開発環境で動いたアプリケーションを、本番環境にデプロイする際も、Dockerなら簡単です!
マルチステージビルドを使って、本番用に最適化されたイメージを作成できます:
# 開発段階
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# 本番段階
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
トラブルシューティングと最適化
よくあるエラーと対処法
「no such file or directory」エラー
原因:COPYコマンドでファイルパスが間違っている
# ❌ 間違い
COPY app.py /nonexistent/
# ✅ 正しい
COPY app.py /app/
「port already in use」エラー
原因:ポートが既に使用されている
# 使用中のポートを確認
docker ps
# 不要なコンテナを停止
docker stop container_name
「build context is too large」エラー
原因:不要なファイルも一緒にビルドしようとしている
解決:.dockerignoreファイルを作成
node_modules/
.git/
*.log
.DS_Store
パフォーマンス最適化のコツ
レイヤーキャッシュを活用
# ❌ 非効率
COPY . /app
RUN pip install -r requirements.txt
# ✅ 効率的
COPY requirements.txt /app/
RUN pip install -r requirements.txt
COPY . /app
マルチステージビルドで軽量化
開発に必要なツールを本番イメージに含めない!
適切なベースイメージ選択
- alpine版:軽量だが、互換性に注意
- slim版:バランスが良い
- full版:機能豊富だが重い
まとめと次のステップ
お疲れさまでした!この記事では、以下の内容を学習しました:
✅ Dockerfileの書き方をマスター
✅ Docker Composeで複数コンテナ管理
✅ 実務での活用パターンを理解
✅ トラブルシューティングの方法
次に学ぶべきこと:
Kubernetes
より大規模なコンテナ運用に必要です。
CI/CDパイプライン
GitHubActionsなどと組み合わせた自動デプロイ。
監視・ログ管理
本番運用には欠かせません。
セキュリティ
コンテナのセキュリティベストプラクティス。
より深く学びたい方へ
今回参考にした「仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん」では、これらの内容がさらに詳しく、図解付きで解説されています。
実践的なハンズオンも豊富なので、「読んで終わり」ではなく、「実際に手を動かして覚える」ことができます。
Docker Composeの次のステップとして、ぜひKubernetesにも挑戦してみてください!
きっと、「コンテナ技術って面白い!」と感じられるはずです。
コメント