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;
}
}
フロントエンドのビルドと配置
- 依存関係をインストール:
npm install - APIのベースURLとプロキシ設定を環境に合わせて修正
- OAuth設定(GitHub/Gitee等)のクライアントIDとコールバックURLを更新
- ビルド実行:
npm run build - 生成された
distディレクトリの内容を、サーバーのNginx設定で指定したドキュメントルート(/var/www/html/blog等)へアップロード
バックエンドのデプロイ
Mavenを使用してJARファイルを作成し、Dockerイメージとしてビルドします。
application.ymlのデータベース接続情報やRedisパスワードを本番環境用に修正mvn clean package -DskipTestsでパッケージング- JARファイルとDockerfileをサーバーへ転送
- データベースの初期化が必要な場合、スキーマファイルを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