Docker Compose一键部署PostgreSQL数据库:从镜像拉取到容器配置 1. 为什么选择Docker Compose部署PostgreSQL每次搭建开发环境最头疼的就是处理各种依赖和配置。三年前我在一个新项目上手动安装PostgreSQL光是处理不同系统的依赖问题就花了整整一天。直到发现Docker Compose这个神器现在部署一个PostgreSQL数据库只需要5分钟。Docker Compose的优势在于环境隔离不会污染主机环境不同项目可以用不同版本的PostgreSQL一键启停开发时docker-compose up下班时docker-compose down配置即代码所有配置都写在docker-compose.yml里可以纳入版本控制快速迁移换个电脑只要拷贝yml文件就能还原完全相同的环境实测在MacBook Pro M1上从零开始到数据库可用仅需拉取镜像1分30秒取决于网络容器启动3秒健康检查2秒2. 准备工作安装Docker全家桶2.1 安装Docker引擎不同系统的安装方式# Ubuntu/Debian sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # CentOS/RHEL sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io # Mac (推荐使用Homebrew) brew install --cask docker安装后需要将当前用户加入docker组sudo usermod -aG docker $USER newgrp docker # 立即生效2.2 安装Docker Compose现在推荐使用docker compose插件v2版本# Linux系统 DOCKER_CONFIG${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose chmod x $DOCKER_CONFIG/cli-plugins/docker-compose # 验证安装 docker compose version注意如果遇到权限问题可以尝试将下载的二进制文件放到/usr/local/bin/目录下3. 编写docker-compose.yml文件3.1 基础版配置创建一个项目目录并编写docker-compose.ymlmkdir pg-demo cd pg-demo touch docker-compose.yml基础配置模板version: 3.8 services: postgres: image: postgres:15-alpine container_name: pg-container environment: POSTGRES_USER: admin POSTGRES_PASSWORD: securepassword123 POSTGRES_DB: app_db ports: - 5432:5432 volumes: - pg_data:/var/lib/postgresql/data healthcheck: test: [CMD-SHELL, pg_isready -U admin] interval: 5s timeout: 5s retries: 5 volumes: pg_data:关键参数说明image推荐使用alpine版本体积小仅200MB左右environment必须设置POSTGRES_PASSWORDvolumes将数据持久化到宿主机避免容器删除后数据丢失healthcheck确保数据库完全启动后再接受连接3.2 高级配置模板针对生产环境的优化配置services: postgres: image: postgres:15-alpine deploy: resources: limits: cpus: 2 memory: 2G environment: POSTGRES_USER: admin POSTGRES_PASSWORD: securepassword123 POSTGRES_DB: app_db PGDATA: /var/lib/postgresql/data/pgdata # 性能调优参数 POSTGRES_INITDB_ARGS: --encodingUTF-8 --localeC # 连接配置 MAX_CONNECTIONS: 100 SHARED_BUFFERS: 512MB EFFECTIVE_CACHE_SIZE: 1536MB ports: - 5432:5432 volumes: - pg_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: [CMD-SHELL, pg_isready -U admin] interval: 10s timeout: 5s retries: 5 logging: driver: json-file options: max-size: 10m max-file: 3性能调优建议shared_buffers设置为物理内存的25%effective_cache_size设置为物理内存的50-75%work_mem每个连接的工作内存建议4-32MB4. 启动与管理PostgreSQL容器4.1 启动服务在项目目录下执行docker compose up -d会看到类似输出[] Running 2/2 ✔ Network pg-demo_default Created ✔ Volume pg-demo_pg_data Created ✔ Container pg-container Started4.2 常用管理命令查看容器状态docker compose ps查看日志docker compose logs -f postgres停止服务docker compose down # 保留数据卷 docker compose down -v # 删除数据卷4.3 连接数据库使用psql客户端连接docker exec -it pg-container psql -U admin -d app_db或者从外部用GUI工具如DBeaver连接Host: localhostPort: 5432Database: app_dbUsername: adminPassword: securepassword1235. 数据持久化与备份5.1 数据卷管理查看数据卷docker volume inspect pg-demo_pg_data输出会显示数据在宿主机上的实际存储位置例如/var/lib/docker/volumes/pg-demo_pg_data/_data5.2 备份与恢复手动备份docker exec pg-container pg_dump -U admin -Fc app_db backup.dump从备份恢复cat backup.dump | docker exec -i pg-container pg_restore -U admin -d app_db5.3 自动备份方案在docker-compose.yml中添加备份服务services: backup: image: postgres:15-alpine depends_on: - postgres volumes: - ./backups:/backups environment: PG_HOST: postgres PG_USER: admin PG_PASSWORD: securepassword123 PG_DATABASE: app_db command: bash -c while true; do pg_dump -h $$PG_HOST -U $$PG_USER -d $$PG_DATABASE -Fc /backups/backup_$$(date %Y%m%d_%H%M%S).dump sleep 86400 done6. 常见问题排查6.1 连接失败问题如果遇到连接问题检查步骤确认容器正在运行docker compose ps检查端口映射docker port pg-container查看日志中的错误信息docker compose logs postgres6.2 性能优化如果发现查询慢可以进入容器查看当前配置docker exec -it pg-container bash psql -U admin -c SHOW ALL;调整shared_buffers等参数后重启服务6.3 数据恢复如果误删数据可以从备份恢复docker compose down docker volume rm pg-demo_pg_data docker compose up -d cat backup.dump | docker exec -i pg-container pg_restore -U admin -d app_db7. 扩展功能7.1 初始化SQL脚本在docker-compose.yml同目录下创建init.sqlCREATE EXTENSION IF NOT EXISTS uuid-ossp; CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW() );然后在docker-compose.yml中挂载volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql7.2 主从复制配置主库配置services: postgres-master: image: postgres:15-alpine environment: POSTGRES_USER: replicator POSTGRES_PASSWORD: replicationpass POSTGRES_DB: app_db WAL_LEVEL: logical MAX_WAL_SENDERS: 8 WAL_KEEP_SIZE: 1GB从库配置postgres-replica: image: postgres:15-alpine depends_on: - postgres-master environment: POSTGRES_USER: replicator POSTGRES_PASSWORD: replicationpass POSTGRES_DB: app_db WAL_LEVEL: replica HOT_STANDBY: on command: bash -c until pg_isready -h postgres-master; do sleep 1; done pg_basebackup -h postgres-master -U replicator -D /var/lib/postgresql/data -P -R exec docker-entrypoint.sh postgres 8. 安全最佳实践密码管理不要在yml文件中直接写密码改用环境变量文件echo POSTGRES_PASSWORD$(openssl rand -base64 32) .env在docker-compose.yml中引用environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}网络隔离networks: internal: internal: true定期更新docker compose pull docker compose up -d备份验证docker run --rm -v ./backups:/backups postgres:15-alpine \ pg_restore -l /backups/latest.dump