以下是一个完整的 **docker-compose.yml**
文件示例,用于部署 PostgreSQL 11 数据库,满足以下要求:
- 同步宿主机系统时间到容器内。
- 挂载数据卷、日志目录和配置文件。
- 支持外部连接访问数据库。
- 将宿主机的端口
**15432**
映射到容器的**5432**
端口。
docker-compose.yml
##这里面写了多个版本的配置,选用其一即可,相关的目录结构 按照配置的映射目录设置即可
version: “3.9” # 版本号
services:
postgres_db: # 服务名称
image: postgres:15.7 # 指定镜像及其版本
container_name: postgres # 指定容器的名称
restart: always # 容器重启策略
environment: # 环境变量
POSTGRES_USER: root # 数据库用户名
POSTGRES_PASSWORD: admin123456 # 数据库密码
POSTGRES_DB: ceshi # 数据库名称
TZ: Asia/Shanghai # 设置容器时区为上海
LANG: zh_CN.UTF-8 # 设置语言支持中文
ports: # 端口映射
- “15432:5432”
volumes: # 数据持久化的配置
- /etc/localtime:/etc/localtime # 时区同步
- /opt/docker-volumes/postgresql/data:/var/lib/postgresql/data # 数据文件
- /opt/docker-volumes/postgresql/log:/var/log/postgresql # 日志文件
- /opt/docker-volumes/postgresql/config/postgresql.conf:/etc/postgresql/postgresql.conf # 配置文件
- /opt/docker-volumes/postgresql/config/pg_hba.conf:/etc/postgresql/pg_hba.conf # 访问控制文件
networks: # 网络配置
- default_net # 加入到 default_net 网络
command: [“postgres”, “-c”, “config_file=/etc/postgresql/postgresql.conf”] # 指定配置文件位置
networks: # 网络
default_net:
external: true
version: "3.9"
services:
postgres:
image: postgres:15.7
container_name: postgres
restart: always # 容器重启策略
ports:
- "15432:5432" # 映射本地的 5432 端口到容器的 15432 端口
environment:
POSTGRES_DB: postgres # 默认数据库
POSTGRES_USER: root # 数据库用户名
POSTGRES_PASSWORD: admin123456 # 数据库密码
PGDATA: /var/lib/postgresql/data/pgdata # 数据文件位置
volumes:
- ./data:/var/lib/postgresql/data # 挂载数据卷,持久化存储
- ./logs:/var/log/postgresql # 挂载日志
- ./config/postgresql.conf:/etc/postgresql/postgresql.conf # 挂载配置文件
- ./config/pg_hba.conf:/etc/postgresql/pg_hba.conf # 挂载访问控制配置
- /etc/localtime:/etc/localtime # 时区同步
command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"] # 指定配置文件位置
networks: # 网络配置
- default_net # 加入到 default_net 网络
networks: # 网络
default_net:
external: true
version: "3.9"
services:
postgres:
image: postgres:11 # 使用 PostgreSQL 11 官方镜像
container_name: postgres11
restart: always
ports:
- "15432:5432" # 宿主机 15432 端口映射到容器 5432
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: admin123456
POSTGRES_DB: testdb # 默认数据库
volumes:
- ./data:/var/lib/postgresql/data # 挂载数据卷
- ./logs:/var/log/postgresql # 挂载日志目录
- ./config/postgresql.conf:/etc/postgresql/postgresql.conf # 配置文件
- ./config/pg_hba.conf:/etc/postgresql/pg_hba.conf # 访问控制配置
- /etc/localtime:/etc/localtime:ro # 同步宿主机系统时间
- /etc/timezone:/etc/timezone:ro # 同步时区信息
command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
networks: # 网络配置
- default_net # 加入到 default_net 网络
networks: # 网络
default_net:
external: true
目录结构
project/
├── docker-compose.yml
├── config/
│ ├── postgresql.conf # PostgreSQL 配置文件
│ └── pg_hba.conf # 访问控制配置文件
├── data/ # 数据卷存储目录
├── logs/ # 日志存储目录
配置文件内容
**config/postgresql.conf**
自定义 PostgreSQL 配置文件,设置外部连接及优化参数。
# Connection Settings
listen_addresses = '*' # 监听所有 IP 地址
port = 5432 # 容器内 PostgreSQL 端口
# Encoding and Locale
lc_messages = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
client_encoding = 'UTF8'
default_text_search_config = 'pg_catalog.simple'
# Logging
logging_collector = on # 启用日志收集
log_directory = '/var/log/postgresql'
log_filename = 'postgresql.log'
log_statement = 'all' # 记录所有 SQL 语句
log_min_duration_statement = 2000 # 慢查询日志阈值为 2 秒
# Resource Management
shared_buffers = 128MB
work_mem = 4MB
maintenance_work_mem = 64MB
**config/pg_hba.conf**
控制数据库连接权限,允许外部连接。
# TYPE DATABASE USER ADDRESS METHOD
# 本地连接
local all all trust
# 外部连接
host all all 0.0.0.0/0 md5
host all all ::/0 md5
启动服务
-
启动服务:
docker-compose up -d
-
检查服务状态:
docker ps
-
验证容器日志是否正常:
docker logs postgres11
测试外部连接
使用 PostgreSQL 客户端(如 psql
)连接:
psql -h localhost -U admin -d mydb -p 15432
输入密码 admin123
后,即可访问数据库。
说明
- 时间同步:
- 挂载
/etc/localtime
和/etc/timezone
,确保容器与宿主机时间一致。
- 日志存储:
- 宿主机
./logs
目录会保存 PostgreSQL 的运行日志。
- 权限管理:
- 配置文件
pg_hba.conf
控制外部连接,确保 IP 地址范围和验证方式符合需求。
- 端口映射:
- 宿主机
15432
映射到容器的5432
,支持外部访问。
此配置适用于开发和生产环境,满足 PostgreSQL 11 的基础功能需求以及外部连接访问需求。