# Running TimescaleDB with Docker This document describes how to run **TimescaleDB** as a Docker container using a simple and production-friendly setup. The goal is to run PostgreSQL + TimescaleDB in a containerized environment with persistent storage, while keeping the database accessible only to internal services. The full script is provided at the end. --- ## What are we trying to achieve? With this setup, we want to: - Run TimescaleDB as a Docker container - Use a pinned image version for reproducibility - Persist database data across restarts - Avoid exposing database ports publicly - Keep database access limited to internal services This approach works well for backend APIs, analytics workloads, and time-series use cases. --- ## General approach In this setup: - The official `timescale/timescaledb` Docker image is used - Database credentials are provided via environment variables - Data is persisted using a named Docker volume - The container is attached to an **internal Docker network** > In this example, the network is called `app-net`. > This is a personal preference and can be replaced with any Docker network > that fits your architecture. This keeps the setup **simple**, **secure**, and easy to maintain. --- ## Prerequisites Before running the script: - Docker is installed - A Docker network already exists for internal communication - You are familiar with managing secrets outside the script (recommended) > Example network creation: > `docker network create app-net` --- ## Step 1: Running Bash in safe mode The script starts with strict Bash options enabled: - Exit immediately on errors - Fail on undefined variables - Catch errors in pipelines This prevents silent failures and is a best practice for infrastructure scripts. --- ## Step 2: Defining database configuration The following parameters are defined as variables: | Variable | Description | |------------|---------------------------------| | `DB` | Database name | | `USER` | Database user | | `PASSWORD` | Database password | | `CONTAINER`| Docker container name | | `IMAGE` | TimescaleDB Docker image version| > In production, credentials should be managed via > `.env` files, Docker secrets, or a secrets manager. --- ## Step 3: Starting the TimescaleDB container The container is started with: - A persistent volume for database data - Environment variables for initial database setup - Attachment to the internal Docker network (`app-net`) Internal services on the same network can connect to the database using the container name as the hostname. --- ## Full Bash script (copy & paste) ```bash #!/usr/bin/env bash set -euo pipefail # ============================================================ # TimescaleDB setup script (bash) # ============================================================ # ------------------------------------------------------------ # Base variables # ------------------------------------------------------------ DB="postgres" USER="admin" PASSWORD="PASSWORD" CONTAINER="timescaledb" IMAGE="timescale/timescaledb:2.24.0-pg18" # ------------------------------------------------------------ # Start TimescaleDB container # ------------------------------------------------------------ docker run -d \ --name "$CONTAINER" \ --network app-net \ -e POSTGRES_PASSWORD="$PASSWORD" \ -e POSTGRES_USER="$USER" \ -e POSTGRES_DB="$DB" \ -v timescale_data:/var/lib/postgresql/data \ "$IMAGE" echo "TimescaleDB is up 🚀 (image: $IMAGE)"