Dockerはアプリケーションをコンテナと呼ばれる標準化された単位でパッケージ化・実行する技術です。「自分のPCでは動くのに本番環境では動かない」という問題を解決し、現代のソフトウェア開発・デプロイを根本から変えました。
Dockerのインストール
# macOS(Docker Desktopを使用)
brew install --cask docker
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
# インストール確認
docker --version
docker run hello-world
基本的なDockerコマンド
# イメージの取得
docker pull node:20-alpine
# コンテナの実行
docker run -p 3000:3000 node:20-alpine
# バックグラウンドで実行
docker run -d --name my-app -p 3000:3000 node:20-alpine
# 実行中のコンテナ一覧
docker ps
# すべてのコンテナ一覧
docker ps -a
# コンテナの停止
docker stop my-app
# コンテナの削除
docker rm my-app
# ログの確認
docker logs my-app
# コンテナ内でコマンド実行
docker exec -it my-app sh
Dockerfileの書き方
# Node.js アプリケーションのDockerfile例
FROM node:20-alpine
# 作業ディレクトリの設定
WORKDIR /app
# 依存関係のインストール(キャッシュ効率化)
COPY package*.json ./
RUN npm ci --only=production
# アプリケーションのコピー
COPY . .
# ビルド(TypeScriptのコンパイル等)
RUN npm run build
# 非rootユーザーで実行(セキュリティ)
USER node
# ポートの公開
EXPOSE 3000
# 起動コマンド
CMD ["node", "dist/index.js"]
docker-composeで複数コンテナを管理
# docker-compose.yml
version: '3.8'
services:
# Node.jsアプリ
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
- redis
# PostgreSQL
db:
image: postgres:16-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
# Redis
redis:
image: redis:7-alpine
ports:
- "6379:6379"
# Nginx(リバースプロキシ)
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/ssl/certs
depends_on:
- app
volumes:
postgres_data:
# docker-composeの主要コマンド
# 起動
docker-compose up -d
# 停止
docker-compose down
# ログ確認
docker-compose logs -f
# 特定サービスの再ビルド
docker-compose up -d --build app
本番環境のベストプラクティス
- マルチステージビルド:ビルド環境と実行環境を分けてイメージサイズを削減
- 非rootユーザーで実行:セキュリティリスクの低減
- .dockerignore:不要なファイルをビルドコンテキストから除外
- ヘルスチェック:コンテナの正常稼働を監視
- 環境変数の管理:シークレット情報はDocker Secretsや外部ツールで管理
Dockerをマスターしてクラウドエンジニアとしてのキャリアを築きたい方はAWSクラウド入門ガイドもご覧ください。