一、环境准备
-
系统要求
-
操作系统:Ubuntu 22.04(或其他版本,需适配Docker)。
-
确保已安装 Docker 和 Docker Compose(可选)。
-
确保系统网络正常,能访问 Docker Hub。
-
-
更新系统软件包
sudo apt update && sudo apt upgrade -y
-
安装Docker 如果未安装Docker,请按以下步骤操作:
# 安装Docker依赖包 sudo apt install apt-transport-https ca-certificates curl software-properties-common -y # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加Docker源 echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 更新软件包列表并安装Docker sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io -y # 启动Docker服务并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 验证Docker是否安装成功 docker --version
二、安装PostgreSQL
步骤1:拉取PostgreSQL镜像
# 拉取最新版本的PostgreSQL镜像(或指定版本,如17.4) docker pull postgres:latest
步骤2:创建数据存储目录
PostgreSQL数据需要持久化存储,避免容器删除后数据丢失。
# 创建数据目录(例如:/home/postgres/data) mkdir -p /home/postgres/data # 设置目录权限(开发环境可简化为777,生产环境需调整所有权) chmod 777 -R /home/postgres/data
步骤3:运行PostgreSQL容器
docker run -d \ --name postgres \ -e POSTGRES_USER=myuser \ # 设置数据库用户名(替换为你的用户名) -e POSTGRES_PASSWORD=mypassword \ # 设置数据库密码(替换为你的密码) -e POSTGRES_DB=mydatabase \ # 设置初始数据库名称(可选) -p 5432:5432 \ # 映射容器端口5432到宿主机端口5432 -v /home/postgres/data:/var/lib/postgresql/data \ # 数据持久化挂载 postgres:latest
参数说明:
-
-d:后台运行容器。 -
--name:容器名称(便于管理)。 -
-e:设置环境变量(用户名、密码、数据库名)。 -
-p:端口映射(容器端口:宿主机端口)。 -
-v:将宿主机目录挂载到容器内,实现数据持久化。
步骤4:验证容器运行状态
# 查看容器是否运行 docker ps -a # 预期输出: # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # xxxxxxxxxxxx postgres "docker-entrypoint.s…" X minutes ago Up X minutes 0.0.0.0:5432->5432/tcp postgres
三、连接PostgreSQL数据库
方法1:通过容器内连接
-
进入容器终端:
docker exec -it postgres bash
-
使用
psql工具连接数据库:psql -U myuser -d mydatabase
-
输入密码后,进入 PostgreSQL 命令行界面:
-- 示例:查看所有数据库 \l -- 示例:查看当前数据库的表 \dt -- 退出 PostgreSQL \q
方法2:通过宿主机连接
使用 psql 或客户端工具(如 DBeaver、pgAdmin)连接:
psql -h localhost -U myuser -d mydatabase
四、常见问题及解决方案
1. 端口冲突
-
现象:启动容器时报错
port 5432 is already allocated。 -
解决:修改映射端口(例如
-p 5433:5432),并更新连接时的端口号。
2. 权限问题
-
现象:容器启动失败,日志显示权限错误(如
could not open directory)。 -
解决:
-
检查数据目录权限:
ls -ld /home/postgres/data
-
修改目录所有权为当前用户(更安全):
sudo chown -R $USER:$USER /home/postgres/data
-
3. 连接失败
-
现象:无法通过
psql连接数据库。 -
解决:
-
检查容器是否运行:
docker ps
-
检查 PostgreSQL 日志:
docker logs postgres
-
检查防火墙规则(确保宿主机开放5432端口):
sudo ufw status sudo ufw allow 5432
-
五、高级配置(可选)
1. 使用 docker-compose.yml 管理容器
创建 docker-compose.yml 文件:
version: '3' services: postgres: image: postgres:latest container_name: postgres environment: POSTGRES_USER: myuser POSTGRES_PASSWORD: mypassword POSTGRES_DB: mydatabase ports: - "5432:5432" volumes: - /home/postgres/data:/var/lib/postgresql/data restart: always
启动容器:
docker-compose up -d
2. 配置远程访问
默认情况下,PostgreSQL容器仅允许本地连接。若需远程访问:
-
修改容器内配置文件:
docker exec -it postgres bash nano /var/lib/postgresql/data/postgresql.conf
找到并修改:
listen_addresses = '*'
-
修改
pg_hba.conf:nano /var/lib/postgresql/data/pg_hba.conf
添加以下内容(允许所有IP访问):
host all all 0.0.0.0/0 md5
-
重启容器:
docker restart postgres
六、生产环境建议
-
避免使用
chmod 777生产环境中应调整目录所有权,而非开放全部权限:sudo chown -R 999:999 /home/postgres/data # 999 是 PostgreSQL 容器内的用户ID
-
定期备份数据 使用脚本或工具(如
pg_dump)定期备份数据库:docker exec -it postgres pg_dump -U myuser -Fc mydatabase > backup.dump
-
监控与日志 使用
docker logs或第三方工具(如 Prometheus + Grafana)监控 PostgreSQL 性能。
七、总结
通过以上步骤,你已在 Ubuntu 上通过 Docker 成功部署了 PostgreSQL,并实现了数据持久化和连接验证。如果需要进一步优化(如高可用、集群部署),可以结合 Kubernetes 或 Docker Swarm 进行扩展。

2502

被折叠的 条评论
为什么被折叠?



