Docker Compose はマルチコンテナのスタックを1つのファイルで記述し、1コマンドで実行します。これはデプロイのハウツーです。まだなら先に Docker をインストール。AI エージェント向けのスタック(エージェント + ベクトル DB + Redis)は AI エージェント向け docker-compose を参照。
1. スタック:アプリ + データベース + リバースプロキシ
# /opt/stack/docker-compose.yml
services:
app:
image: your/app:latest
restart: unless-stopped
env_file: [.env]
depends_on: [db]
# no ports: — reached only through the proxy below
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes: ["pg:/var/lib/postgresql/data"] # internal only
caddy: # HTTPS automatically
image: caddy:2
restart: unless-stopped
ports: ["80:80", "443:443"] # the only public entrypoint
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
volumes: { pg: {}, caddy_data: {} }
シークレットは .env に置き、compose ファイルには決して置きません:
# /opt/stack/.env (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string
最小限の Caddyfile はドメインをアプリにプロキシし、HTTPS を自分で取得します:
app.yourdomain.com {
reverse_proxy app:8080
}
2. 立ち上げる
cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app
各サービスの restart: unless-stopped + 起動時に有効化した Docker = スタックは再起動後に自分で戻ってきます。
3. 日常のコマンド
docker compose pull && docker compose up -d # update images
docker compose down # stop the stack
docker compose restart app # restart one service
みんなが間違える部分:公開ポート
Docker はポートを iptables 経由 で公開するので、ports: ["5432:5432"] を持つコンテナは、閉じたつもりの UFW ファイアウォールの背後でもインターネットから到達できます。公開するのは 公開エントリーポイントだけ(80/443 のプロキシ)。データベースやキャッシュは compose ネットワークか 127.0.0.1 にバインドしておきます。Web トラフィックを配信するものには 専用 IP プラン が必要です。UFW ファイアウォール と組み合わせてください。
1つの IP の背後にスタック全体を置くなら 複数サービスをセルフホスト を参照。約1分で root、NVMe、KYC なし、暗号資産で支払い。
コメント
まだコメントはありません。最初になりましょう。