Docker

DevOpsコンテナDocker仮想化CI/CDマイクロサービスクラウドインフラ

DevOpsツール

Docker

概要

Dockerは、コンテナ技術のパイオニアとして、アプリケーションとその依存関係をコンテナにパッケージ化し、一貫した実行環境を提供するコンテナ化プラットフォームです。

詳細

Docker(ドッカー)は、2013年にSolomon Hykes率いるdotCloudが開発したオープンソースのコンテナ化プラットフォームです。従来の仮想マシンよりも軽量で高速なコンテナ技術により、「どこでも実行できる」アプリケーションの作成、配布、実行を革新しました。Dockerコンテナは、アプリケーションコードと実行に必要なすべての依存関係(ライブラリ、システムツール、設定)を単一のパッケージにまとめ、開発環境から本番環境まで一貫した動作を保証します。Linux Container(LXC)技術をベースとし、namespace、cgroups、Union File Systemを活用してプロセス分離とリソース管理を実現。Docker Hub、Docker Desktop、Docker Composeなど包括的なエコシステムを提供し、現在GitLab、Spotify、ING、PayPalなど多くの企業で採用されています。コンテナ技術の事実上の標準として、DevOps文化の浸透とマイクロサービスアーキテクチャの普及を加速させた革新的なプラットフォームです。

メリット・デメリット

メリット

  • 一貫した実行環境: 開発から本番まで「どこでも動く」環境の保証
  • 軽量で高速: 仮想マシンより少ないリソースで高速起動
  • ポータビリティ: マルチプラットフォーム対応(Linux、Windows、macOS)
  • スケーラビリティ: 水平スケーリングが容易
  • 豊富なエコシステム: Docker Hub、Compose、Swarmなど充実したツール群
  • DevOps統合: CI/CDパイプラインとの親和性が高い
  • 依存関係の解決: ライブラリやOS依存を完全に分離
  • 開発効率向上: 環境構築時間の大幅短縮

デメリット

  • 学習コスト: Dockerfile、ネットワーク、ボリューム管理の習得が必要
  • セキュリティ懸念: コンテナ間の分離レベルがVMより低い
  • 永続化データ管理: ボリューム設計とバックアップの複雑さ
  • モニタリング: コンテナ固有の監視・ログ管理が必要
  • ライセンス変更: Docker Desktop有償化による企業での影響
  • Linux環境依存: Windows/macOSでは仮想化レイヤーが必要
  • オーケストレーション: 大規模環境では別途Kubernetesなどが必要

主要リンク

書き方の例

Hello World

# Dockerfile
FROM alpine:latest
RUN echo "Hello, Docker World!" > /hello.txt
CMD ["cat", "/hello.txt"]
# ビルドと実行
docker build -t hello-world .
docker run hello-world

Webアプリケーションのコンテナ化

# Node.js アプリケーションの例
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
USER node
CMD ["npm", "start"]
# ビルドと実行
docker build -t my-node-app .
docker run -p 3000:3000 my-node-app

マルチステージビルド

# ビルドステージ
FROM golang:1.20-alpine AS builder
WORKDIR /src
COPY . .
RUN go build -o app main.go

# 実行ステージ
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /src/app /bin/app
CMD ["/bin/app"]

Docker Compose(マルチコンテナアプリケーション)

# docker-compose.yml
version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      - db
      - redis

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:
# Docker Compose実行
docker-compose up -d
docker-compose logs -f web
docker-compose down

ボリュームとネットワーク管理

# ボリューム作成
docker volume create my-data

# カスタムネットワーク作成
docker network create my-network

# ボリュームとネットワーク指定で実行
docker run -d \
  --name my-container \
  --network my-network \
  -v my-data:/data \
  nginx:alpine

Docker CLI 基本操作

# イメージ管理
docker images                    # イメージ一覧
docker pull nginx:alpine         # イメージダウンロード
docker rmi nginx:alpine          # イメージ削除

# コンテナ管理
docker ps                        # 実行中コンテナ一覧
docker ps -a                     # 全コンテナ一覧
docker stop container_name       # コンテナ停止
docker rm container_name         # コンテナ削除

# デバッグ・監視
docker logs container_name       # ログ表示
docker exec -it container_name sh # コンテナ内シェル
docker stats                     # リソース使用状況
docker inspect container_name    # 詳細情報表示