Docker Compose는 멀티 컨테이너 스택을 한 파일로 설명하고 한 명령으로 실행합니다. 이것은 배포 가이드입니다. 아직 안 했다면 먼저 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에 바인딩해 두세요. 웹 트래픽을 서비스하는 것은 무엇이든 전용 IP 요금제가 필요합니다. UFW 방화벽과 함께 쓰세요.
한 IP 뒤에 스택 전체를 두려면 여러 서비스 자체 호스팅을 보세요. 약 1분이면 root, NVMe, KYC 없음, 암호화폐로 결제.
댓글
아직 댓글이 없습니다. 첫 번째가 되세요.