Ubuntu 22.04 (WSL2) 使用 Docker 安装 PostgreSQL

372 阅读5分钟

引言

PostgreSQL 是一种功能强大的开源关系型数据库管理系统(RDBMS),广泛应用于开发和生产环境。通过 Docker,你可以在容器化环境中轻松部署和管理 PostgreSQL。本文将详细介绍如何在 Ubuntu 22.04 (WSL2) 上使用 Docker 安装 PostgreSQL,并从 Windows 使用 Navicat 连接到数据库。这对于在 Windows 10 或 11 上进行开发的开发人员来说是一个理想的设置。

先决条件

在开始之前,请确保满足以下条件:

  • 操作系统:Windows 10 或 11,已启用 WSL2。
  • WSL2 环境:已安装 Ubuntu 22.04。
  • Docker:在 Ubuntu 22.04 (WSL2) 中安装并运行 Docker。

安装步骤

步骤 1:创建 PostgreSQL 数据目录

为了确保数据库数据在容器重启后不会丢失,我们需要在 WSL2 宿主机上创建一个目录,并将其挂载到容器中。

mkdir -p /home/postgres/data

此命令在 /home 目录下创建 postgres/data 目录,用于存储 PostgreSQL 数据。

步骤 2:设置目录权限

PostgreSQL 在容器中以 postgres 用户身份运行,因此需要确保宿主机上的数据目录对容器中的 postgres 用户可写。为简化开发环境,我们将目录权限设置为 777:

chmod 777 -R /home/postgres

注意:在生产环境中,使用 chmod 777 不安全。建议通过调整目录所有权或使用 Docker 卷来管理权限。例如,可以将目录所有者设置为与容器内 postgres 用户的 UID 匹配。

步骤 3:运行 PostgreSQL Docker 容器

现在,我们使用以下命令运行 PostgreSQL 容器:

docker run -d --name postgres -e POSTGRES_PASSWORD=your_password -p 5432:5432 -v /home/postgres/data:/var/lib/postgresql/data postgres:17.4

命令解析

  • -d:以分离模式运行容器(后台运行)。
  • --name postgres:为容器命名,便于管理和引用。
  • -e POSTGRES_PASSWORD=your_password:设置 postgres 用户的密码为 your_password
  • -p 5432:5432:将容器的 5432 端口(PostgreSQL 默认端口)映射到 WSL2 宿主机的 5432 端口。
  • -v /home/postgres/data:/var/lib/postgresql/data:将宿主机的 /home/postgres/data 挂载到容器的 /var/lib/postgresql/data,实现数据持久化。
  • postgres:17.4:指定使用 PostgreSQL 17.4 版本的官方镜像。

此命令会从 Docker Hub 拉取 PostgreSQL 镜像(如果尚未下载),并启动容器。

步骤 4:检查容器状态

为了确认容器是否成功启动,可以查看日志:

docker logs -f postgres
  • -f:实时跟踪日志输出。
  • 正常情况下,你会看到 PostgreSQL 初始化和启动的消息,例如数据库系统准备接受连接。
  • 如果出现错误(例如权限问题),请检查日志并解决。

步骤 5:验证容器运行状态

使用以下命令检查容器是否正在运行:

docker ps | grep postgres

此命令列出所有运行中的容器,并通过 grep postgres 过滤出名为 postgres 的容器。你应该看到类似以下输出:

CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
49b69b9eaaf9postgres:17.4"docker-entrypoint.s…"8 minutes agoUp 8 minutes0.0.0.0:5432->5432/tcppostgres

如果容器未列出,可能已停止。使用 docker ps -a 查看所有容器(包括已停止的),并检查日志以诊断问题。

步骤 6:从 Windows 使用 Navicat 连接

Navicat 是一个运行在 Windows 上的数据库管理工具。由于 Docker 配置为 networkingMode=mirrored,你可以直接使用 localhost127.0.0.1 连接到 WSL2 中的 PostgreSQL 容器。

  1. 在 Navicat 中配置连接
    • 主机localhost127.0.0.1
    • 端口5432
    • 用户名postgres
    • 密码your_password
    • 数据库:如果尚未创建数据库,可留空。
  2. 测试连接。如果连接失败,请确保:
    • 容器正在运行(docker ps)。
    • 端口 5432 未被防火墙阻止。

故障排除

以下是一些常见问题及其解决方法:

问题可能原因解决方法
无法连接到数据库容器未运行检查容器状态:docker ps。如果未运行,使用 docker start postgres 启动。
连接被拒绝端口未正确映射或防火墙阻止确保 -p 5432:5432 已设置,检查 Windows 防火墙设置。
数据目录权限错误宿主机目录不可写重新设置权限:chmod 777 -R /home/postgres 或调整所有权。
  • 日志检查:始终使用 docker logs -f postgres 查看详细错误信息。

生产环境注意事项

本教程针对开发环境进行了优化。在生产环境中,请考虑以下最佳实践:

  • 安全密码:使用强密码替换 your_password
  • 权限管理:避免使用 chmod 777,改为设置适当的所有权(例如,匹配容器内 postgres 用户的 UID)。
  • 网络安全:限制 PostgreSQL 的监听地址(修改 postgresql.conf 中的 listen_addresses),并配置防火墙规则。
  • 备份:定期备份 /home/postgres/data 目录或使用 PostgreSQL 的备份工具(如 pg_dump)。

结论

通过本教程,你已在 Ubuntu 22.04 (WSL2) 上成功使用 Docker 安装了 PostgreSQL 17.4。我们创建了一个持久化数据目录,启动并验证了 PostgreSQL 容器,并提供了从 Windows(通过 Navicat)连接到数据库的详细步骤。得益于 Docker 的 networkingMode=mirrored 配置,你可以直接使用 localhost 进行连接,简化了开发流程。

对于进一步学习,建议探索以下资源: