PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 内部结构深度解析 —语法、实现与实战案例(20)

Docker安装PostgreSQL数据库

通过Docker安装PostgreSQL的详细步骤:

1. 准备工作Docker安装好

2. 创建目录结构

bash 复制代码
# 创建数据目录和配置文件目录
sudo mkdir -p /opt/docker/postgresql/data
sudo mkdir -p /opt/docker/postgresql/conf
sudo mkdir -p /opt/docker/postgresql/backup
sudo mkdir -p /opt/docker/postgresql/init-scripts

# 设置目录权限
sudo chmod -R 755 /opt/docker/postgresql
sudo chown -R 1000:1000 /opt/docker/postgresql  # PostgreSQL默认使用1000用户

3. 拉取PostgreSQL镜像

bash 复制代码
# 拉取最新版PostgreSQL
docker pull postgres:latest

# 或者拉取特定版本(推荐)
docker pull postgres:15
docker pull postgres:14

# 查看已下载的镜像
docker images | grep postgres

运行结果

sql 复制代码
[root@bigdata110 ~]# docker pull postgres:14
14: Pulling from library/postgres
396b1da7636e: Pull complete 
df99dde7a2ce: Pull complete 
ebe96321c519: Pull complete 
d96c43fbe073: Pull complete 
30e8f8f521a6: Pull complete 
ac50ae4061b8: Pull complete 
9e4942515cbe: Pull complete 
3c130fd26323: Pull complete 
e1aae68944e7: Pull complete 
622e9f89b7c1: Pull complete 
4f65b495f312: Pull complete 
1fbe2e6ff4cd: Pull complete 
a54df5b8698c: Pull complete 
5864878960ff: Pull complete 
Digest: sha256:445df84770a5a99d141a79700f2806313bf9569ffa08a71f055b28702859a981
Status: Downloaded newer image for postgres:14
docker.io/library/postgres:14
[root@bigdata110 ~]# docker images | grep postgres
postgres                                            14                  cbf8bd7050db   8 days ago      442MB

4. 运行PostgreSQL容器

基本运行方式:

bash 复制代码
# 运行PostgreSQL容器(最简单的方式)
docker run -d \
  --name postgres \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=123456 \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_DB=postgres \
  postgres:14

运行结果

sql 复制代码
[root@bigdata110 ~]# docker run -d \
>   --name postgres \
>   -p 5432:5432 \
>   -e POSTGRES_PASSWORD=123456 \
>   -e POSTGRES_USER=postgres \
>   -e POSTGRES_DB=postgres \
>   postgres:14
b209cbdba9e2c5dbb7e5ab18720c0f795d58d412a0191598fdca14b3c883684e

推荐的生产环境运行方式:

bash 复制代码
# 停止并删除之前的容器(如果存在)
docker rm -f postgres

# 运行PostgreSQL容器(带数据持久化)
docker run -d \
  --name postgres \
  --restart=always \
  -p 5432:5432 \
  -p 5433:5433 \
  -v /opt/docker/postgresql/data:/var/lib/postgresql/data \
  -v /opt/docker/postgresql/conf:/etc/postgresql \
  -v /opt/docker/postgresql/backup:/backup \
  -v /opt/docker/postgresql/init-scripts:/docker-entrypoint-initdb.d \
  -e POSTGRES_PASSWORD=123456 \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_DB=mydatabase \
  -e POSTGRES_INITDB_ARGS="--encoding=UTF-8 --lc-collate=C --lc-ctype=C" \
  -e TZ=Asia/Shanghai \
  postgres:14 \
  -c 'shared_buffers=256MB' \
  -c 'max_connections=100'

运行结果

sql 复制代码
[root@bigdata110 ~]# docker run -d \
>   --name postgres \
>   --restart=always \
>   -p 5432:5432 \
>   -p 5433:5433 \
>   -v /opt/docker/postgresql/data:/var/lib/postgresql/data \
>   -v /opt/docker/postgresql/conf:/etc/postgresql \
>   -v /opt/docker/postgresql/backup:/backup \
>   -v /opt/docker/postgresql/init-scripts:/docker-entrypoint-initdb.d \
>   -e POSTGRES_PASSWORD=123456 \
>   -e POSTGRES_USER=postgres \
>   -e POSTGRES_DB=mydatabase \
>   -e POSTGRES_INITDB_ARGS="--encoding=UTF-8 --lc-collate=C --lc-ctype=C" \
>   -e TZ=Asia/Shanghai \
>   postgres:14 \
>   -c 'shared_buffers=256MB' \
>   -c 'max_connections=100'
eb0583dcaf4e0872b6d2495baba11926ab04b3e5063089ee38fe2cd8e8b276b3

5. 查看容器状态

bash 复制代码
# 查看容器运行状态
docker ps

# 查看容器详细日志
docker logs postgres

# 实时查看日志
docker logs -f postgres

# 查看容器资源使用情况
docker stats postgres

6. 进入容器操作

bash 复制代码
# 进入PostgreSQL容器
docker exec -it postgres bash

# 在容器内连接PostgreSQL
psql -U postgres -d mydatabase

root@eb0583dcaf4e:/# psql -U postgres -d mydatabase
psql (14.19 (Debian 14.19-1.pgdg13+1))
Type "help" for help.

mydatabase=# 

# 或者直接执行SQL命令
docker exec -it postgres psql -U postgres -c "SELECT version();"

7. 配置远程访问

bash 复制代码
# 进入容器
docker exec -it postgres bash

# 编辑PostgreSQL配置文件
vi /var/lib/postgresql/data/pg_hba.conf

# 在文件末尾添加(允许所有IP访问)
echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf

# 编辑postgresql.conf
vi /var/lib/postgresql/data/postgresql.conf

# 修改监听地址
echo "listen_addresses = '*'" >> /var/lib/postgresql/data/postgresql.conf

# 重启PostgreSQL容器使配置生效
docker restart postgres

或者使用更简单的方法:

bash 复制代码
# 直接修改配置文件(如果挂载了配置目录)
sudo tee /opt/docker/postgresql/conf/pg_hba.conf > /dev/null << 'EOF'
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
host    all             all             0.0.0.0/0               md5
EOF

sudo tee /opt/docker/postgresql/conf/postgresql.conf > /dev/null << 'EOF'
listen_addresses = '*'
port = 5432
max_connections = 100
shared_buffers = 256MB
dynamic_shared_memory_type = posix
EOF

# 重启容器
docker restart postgres

8. 防火墙配置

bash 复制代码
# 开放5432端口(如果防火墙开启)
sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent
sudo firewall-cmd --reload

# 或者使用iptables
sudo iptables -I INPUT -p tcp --dport 5432 -j ACCEPT
sudo service iptables save

9. 测试连接

bash 复制代码
# 测试本地连接
docker exec postgres psql -U postgres -c "SELECT version();"

# 测试远程连接(从其他机器)
psql -h <服务器IP> -U postgres -d mydatabase -c "SELECT current_database();"

# 使用密码连接
PGPASSWORD=123456 psql -h <服务器IP> -U postgres -d mydatabase -c "\l"

10. 创建初始数据库和用户

bash 复制代码
# 创建初始化脚本
sudo tee /opt/docker/postgresql/init-scripts/01-init.sql > /dev/null << 'EOF'
-- 创建新数据库
CREATE DATABASE testdb;

-- 创建新用户
CREATE USER bigdata WITH PASSWORD 'bigdata123';

-- 授予权限
GRANT ALL PRIVILEGES ON DATABASE testdb TO bigdata;

-- 创建示例表
\c testdb
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入示例数据
INSERT INTO users (username, email) VALUES 
('admin', 'admin@example.com'),
('user1', 'user1@example.com'),
('user2', 'user2@example.com');
EOF

# 重启容器使初始化脚本生效
docker restart postgres
  • 连接名:PostgreSQL-Docker
  • 主机:Docker宿主机IP地址
  • 端口:5432
  • 初始数据库:mydatabase 或 postgres
  • 用户名:postgres
  • 密码:123456
  • SSL:禁用(除非配置了SSL)

DBeaver连接设置:

  • 数据库类型:PostgreSQL
  • 服务器主机:Docker宿主机IP地址
  • 端口:5432
  • 数据库:mydatabase
  • 用户名:postgres
  • 密码:123456
  • SSL:disable

12. 常用管理命令

bash 复制代码
# 启动容器
docker start postgres

# 停止容器
docker stop postgres

# 重启容器
docker restart postgres

# 删除容器(谨慎操作)
docker rm -f postgres

# 备份数据库
docker exec postgres pg_dump -U postgres mydatabase > /opt/docker/postgresql/backup/backup-$(date +%Y%m%d).sql

# 恢复数据库
docker exec -i postgres psql -U postgres mydatabase < /opt/docker/postgresql/backup/backup.sql

# 进入数据库命令行
docker exec -it postgres psql -U postgres

13. 使用Docker Compose(推荐)

创建 docker-compose.yml 文件:

yaml 复制代码
version: '3.8'
services:
  postgres:
    image: postgres:15
    container_name: postgres
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: mydatabase
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
      TZ: Asia/Shanghai
    ports:
      - "5432:5432"
    volumes:
      - ./data:/var/lib/postgresql/data
      - ./conf:/etc/postgresql
      - ./backup:/backup
      - ./init-scripts:/docker-entrypoint-initdb.d
    command:
      - "postgres"
      - "-c"
      - "shared_buffers=256MB"
      - "-c"
      - "max_connections=100"

运行Docker Compose:

bash 复制代码
# 进入目录
cd /opt/docker/postgresql

# 启动服务
docker-compose up -d

# 查看状态
docker-compose ps

# 停止服务
docker-compose down

14. 验证安装

bash 复制代码
# 验证容器运行
docker ps | grep postgres

# 验证PostgreSQL版本
docker exec postgres psql -U postgres -c "SELECT version();"

# 验证数据库列表
docker exec postgres psql -U postgres -c "\l"

# 验证表列表
docker exec postgres psql -U postgres -d mydatabase -c "\dt"

15. 常用数据库操作

bash 复制代码
# 进入PostgreSQL命令行
docker exec -it postgres psql -U postgres

# 在命令行中执行:
\l                  -- 列出所有数据库
\c database_name    -- 切换到指定数据库
\dt                 -- 列出当前数据库的所有表
\du                 -- 列出所有用户
\d table_name       -- 查看表结构

16. 故障排除

bash 复制代码
# 查看容器日志
docker logs postgres

# 进入容器调试
docker exec -it postgres bash

# 检查数据库连接
docker exec postgres pg_isready -U postgres

# 检查配置文件
docker exec postgres cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses

这样就完成了PostgreSQL的Docker安装,可以通过Navicat和DBeaver进行远程连接。所有数据都持久化在宿主机上,容器重启不会丢失数据。

相关推荐
花姐夫Jun2 小时前
WebGL学习-夹角的归一化
学习·webgl
_muffinman2 小时前
Java学习笔记-第2章 运算和语句
java·笔记·学习
IvorySQL2 小时前
官宣!全球 PostgreSQL 大神再度集结,HOW 2026 正式定档
数据库·postgresql·开源
盐水冰2 小时前
【烘焙坊项目】后端搭建(10) - 地址簿功能&用户下单&微信支付
java·数据库·后端
Be for thing2 小时前
Android 音频硬件(Codec / 喇叭 / 麦克风)原理 + 功耗与问题定位实战(手机 / 手表通用)
android·学习·智能手机·音视频
数据知道2 小时前
MongoDB热点数据识别:提升访问速度的缓存策略与实现
数据库·mongodb·缓存
六元七角八分2 小时前
学习笔记一《JavaScript基础语法》
javascript·笔记·学习
一个天蝎座 白勺 程序猿3 小时前
KingbaseES数据库MySQL兼容性解析:从TCO账本到“傻瓜式“迁移的密码
android·数据库·mysql·kingbasees
Be for thing3 小时前
Android 存储硬件(RAM/UFS/eMMC)底层原理 + 性能 / 功耗测试实战
android·学习·智能硬件