Dockerを活用したブログシステムの本番環境構築ガイド

Dockerコマンドリファレンス

コンテナ管理において頻繁に使用するDockerコマンドの一覧です。

コマンド 概要
docker pull リポジトリからイメージを取得
docker build Dockerfileからイメージを作成
docker images ローカルイメージ一覧を表示
docker rmi ローカルイメージを削除
docker run コンテナの作成と起動
docker ps 稼働中のコンテナ一覧を表示
docker stop/start コンテナの停止/起動
docker logs コンテナのログを出力
docker exec 稼働中のコンテナでコマンドを実行
docker network ネットワークの管理

インフラ構成の構築

MySQLのデプロイ

既存のコンテナを削除し、新しい設定でMySQLコンテナを起動します。データ永続化のため、ボリュームのマウント設定が必須です。

# 古いコンテナの削除
docker rm -f blog-db

# MySQLコンテナの起動
docker run -d \
  --name blog-db \
  -p 3306:3306 \
  -e TZ=Asia/Tokyo \
  -e MYSQL_ROOT_PASSWORD=root_password \
  -v /opt/data/mysql:/var/lib/mysql \
  -v /opt/config/mysql:/etc/mysql/conf.d \
  mysql:8.0

Redisのデプロイ

設定ファイルを作成し、永続化設定を有効にして起動します。

# ディレクトリと設定ファイルの準備
mkdir -p /opt/redis/{data,conf}
cd /opt/redis/conf
wget http://download.redis.io/redis-stable/redis.conf

redis.confの主な変更点:

  • bind 127.0.0.1 -> コメントアウト(外部接続許可)
  • protected-mode no
  • daemonize no (Docker環境では必須)
  • requirepass my_secure_pass
  • appendonly yes
# コンテナ起動
docker run -d \
  --name blog-redis \
  -p 6379:6379 \
  -v /opt/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v /opt/redis/data:/data \
  --network app-network \
  redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes

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

Javaアプリケーション用のDockerfileを作成し、ビルドと実行を行います。

Dockerfile:

FROM openjdk:17-jdk-slim
LABEL maintainer="dev-team"
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

WORKDIR /app
COPY target/blog-service.jar app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

ビルドと実行:

cd /opt/java-app
# イメージビルド
docker build -t blog-service:latest .

# コンテナ起動
docker run -d \
  --name blog-backend \
  --network app-network \
  -p 8080:8080 \
  -v /opt/logs:/app/logs \
  blog-service:latest

本番環境への展開手順

環境構築

サーバー要件は2vCPU、2GBメモリ、MySQL/Redis/RabbitMQ稼働環境とします。以下の手順でDockerおよびDocker Composeを導入します。

# Docker Composeのインストール
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

NginxによるHTTPS設定

SSL証明書(Nginx用)を取得し、/etc/ssl/certs 配下に配置します。Nginxの設定例は以下の通りです。HTTP(80番)へのアクセスはHTTPS(443番)へリダイレクトします。

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    # Frontend Server
    upstream frontend {
        server 127.0.0.1:8080;
    }

    # HTTPS Configuration for Blog
    server {
        listen       443 ssl;
        server_name  blog.example.com;

        ssl_certificate      /etc/ssl/certs/blog.example.com.pem;
        ssl_certificate_key  /etc/ssl/certs/blog.example.com.key;
        ssl_protocols TLSv1.2 TLSv1.3;

        location / {
            root   /var/www/html/blog;
            index  index.html;
            try_files $uri $uri/ /index.html;
        }

        location /api/ {
            proxy_pass http://frontend/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    # Admin Server
    server {
        listen       443 ssl;
        server_name  admin.example.com;

        ssl_certificate      /etc/ssl/certs/admin.example.com.pem;
        ssl_certificate_key  /etc/ssl/certs/admin.example.com.key;
        ssl_protocols TLSv1.2 TLSv1.3;

        location / {
            root   /var/www/html/admin;
            index  index.html;
            try_files $uri $uri/ /index.html;
        }

        location /api/ {
            proxy_pass http://frontend/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    # File Storage Server
    server {
        listen       443 ssl;
        server_name  files.example.com;

        add_header 'Access-Control-Allow-Origin' 'https://blog.example.com';
        ssl_certificate      /etc/ssl/certs/files.example.com.pem;
        ssl_certificate_key  /etc/ssl/certs/files.example.com.key;

        location / {
            root /var/uploads/;
        }
    }

    # HTTP to HTTPS Redirect
    server {
        listen       80;
        server_name  blog.example.com admin.example.com files.example.com;
        return 301 https://$host$request_uri;
    }
}

フロントエンドのビルドと配置

  1. 依存関係をインストール: npm install
  2. APIのベースURLとプロキシ設定を環境に合わせて修正
  3. OAuth設定(GitHub/Gitee等)のクライアントIDとコールバックURLを更新
  4. ビルド実行: npm run build
  5. 生成されたdistディレクトリの内容を、サーバーのNginx設定で指定したドキュメントルート(/var/www/html/blog等)へアップロード

バックエンドのデプロイ

Mavenを使用してJARファイルを作成し、Dockerイメージとしてビルドします。

  1. application.ymlのデータベース接続情報やRedisパスワードを本番環境用に修正
  2. mvn clean package -DskipTests でパッケージング
  3. JARファイルとDockerfileをサーバーへ転送
  4. データベースの初期化が必要な場合、スキーマファイルをMySQLコンテナへインポートします
# データベースインポート例
docker cp schema.sql blog-db:/tmp/
docker exec -i blog-db mysql -uroot -proot_password < /tmp/schema.sql

Docker Composeによる一括デプロイ

以下のdocker-compose.ymlを使用して、関連するすべてのサービス(App, DB, Redis, MQ, Nginx)を一括管理・起動します。環境変数は.envファイルで管理します。

version: '3.8'

services:
  app:
    build: ./backend
    image: blog-backend:prod
    container_name: blog-backend
    restart: always
    depends_on:
      - db
      - cache
      - mq
    volumes:
      - app-logs:/app/logs
      - upload-data:/uploads
    ports:
      - "8080:8080"
    networks:
      - backend-net

  db:
    image: mysql:${MYSQL_VERSION}
    container_name: blog-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      TZ: Asia/Tokyo
    volumes:
      - mysql-data:/var/lib/mysql
      - ./init:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    networks:
      - backend-net

  cache:
    image: redis:${REDIS_VERSION}
    container_name: blog-redis
    restart: always
    command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
    volumes:
      - redis-data:/data
    networks:
      - backend-net

  mq:
    image: rabbitmq:${RABBITMQ_VERSION}
    container_name: blog-rabbitmq
    restart: always
    environment:
      RABBITMQ_DEFAULT_USER: ${MQ_USER}
      RABBITMQ_DEFAULT_PASS: ${MQ_PASSWORD}
    ports:
      - "5672:5672"
      - "15672:15672"
    networks:
      - backend-net

  web:
    image: nginx:${NGINX_VERSION}
    container_name: blog-nginx
    restart: always
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./frontend/dist/blog:/var/www/html/blog:ro
      - ./frontend/dist/admin:/var/www/html/admin:ro
      - /etc/ssl/certs:/etc/ssl/certs:ro
      - upload-data:/var/uploads
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - app
    networks:
      - backend-net

volumes:
  mysql-data:
  redis-data:
  app-logs:
  upload-data:

networks:
  backend-net:
    driver: bridge

定義ファイルの準備が完了したら、以下のコマンドでデプロイを実行します。

docker-compose up -d --build

トラブルシューティングを行う場合は、各サービスのログを確認します。

docker-compose logs -f app

タグ: Docker nginx MySQL redis RabbitMQ

5月22日 06:51 投稿