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
11. Navicat和DBeaver连接配置
Navicat连接设置:
- 连接名: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进行远程连接。所有数据都持久化在宿主机上,容器重启不会丢失数据。