跳到主要内容 PostgreSQL 18 Docker 环境搭建与部署实战 | 极客日志
SQL
PostgreSQL 18 Docker 环境搭建与部署实战 PostgreSQL 18 Docker 环境搭建与部署实战。涵盖 Docker 核心概念、多系统安装步骤、基本命令使用、容器化部署方法(含数据卷挂载与自定义配置)、Docker Compose 编排实践,以及 PostgreSQL 与 SQL Server、MySQL 在 Docker 部署上的对比分析。通过实际项目演练掌握镜像拉取、容器运行、连接测试及资源清理流程,帮助开发者快速构建一致且隔离的数据库开发测试环境。
imJackJia 发布于 2026/3/15 更新于 2026/4/18 2 浏览1.3.1 什么是 Docker?
Docker 是一种容器化技术 ,它允许开发者将应用程序及其依赖项打包到一个标准化的单元(容器)中,以便在任何环境中都能一致地运行。Docker 容器是轻量级、可移植、自给自足的,包含运行应用程序所需的一切:代码、运行时、系统工具、系统库和配置。
1.3.1.1 Docker 的核心概念
镜像(Image) :只读模板,包含运行应用程序所需的所有文件和配置
容器(Container) :镜像的运行实例,可以启动、停止、删除
仓库(Repository) :存储镜像的地方,如 Docker Hub
Docker Hub :Docker 官方的公共镜像仓库
Dockerfile :定义如何构建 Docker 镜像的文本文件
Docker Compose :用于定义和运行多容器 Docker 应用程序的工具
1.3.1.2 使用 Docker 的优势
环境一致性 :确保应用程序在开发、测试和生产环境中运行一致
轻量级 :容器共享主机内核,比虚拟机更轻量、启动更快
可移植性 :可以在任何支持 Docker 的平台上运行
隔离性 :容器之间相互隔离,不会互相影响
资源利用率高 :可以在同一主机上运行多个容器,充分利用资源
快速部署 :可以快速启动和停止容器,实现快速部署和扩展
1.3.2 Docker 安装
1.3.2.1 Windows 系统安装 Docker
1.3.2.1.1 系统要求
Windows 10 64 位专业版、企业版或教育版(Build 16299 或更高版本)
启用 Hyper-V 和 Windows 容器功能
1.3.2.1.2 安装步骤
1.3.2.2 Linux 系统安装 Docker (可选)将当前用户添加到 docker 组,无需 sudo 即可运行 docker 命令:
sudo usermod -aG docker $USER
sudo docker --version
sudo docker run hello-world
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
1.3.2.3 macOS 系统安装 Docker
1.3.2.3.1 系统要求
1.3.2.3.2 安装步骤
1.3.3 Docker 基本命令
1.3.3.1 镜像管理命令 命令 描述 示例 docker pull从仓库拉取镜像 docker pull postgres:18docker images列出本地镜像 docker imagesdocker rmi删除本地镜像 docker rmi postgres:18docker build从 Dockerfile 构建镜像 docker build -t myapp .docker tag为镜像添加标签 docker tag myapp myusername/myapp:latestdocker push将镜像推送到仓库 docker push myusername/myapp:latest
1.3.3.2 容器管理命令 命令 描述 示例 docker run运行容器 docker run -d --name mypostgres postgres:18docker ps列出运行中的容器 docker psdocker ps -a列出所有容器 docker ps -adocker start启动容器 docker start mypostgresdocker stop停止容器 docker stop mypostgresdocker restart重启容器 docker restart mypostgresdocker rm删除容器 docker rm mypostgresdocker exec在运行的容器中执行命令 docker exec -it mypostgres psql -U postgresdocker logs查看容器日志 docker logs mypostgresdocker inspect查看容器详细信息 docker inspect mypostgres
1.3.3.3 网络管理命令 命令 描述 示例 docker network ls列出所有网络 docker network lsdocker network create创建网络 docker network create mynetworkdocker network connect将容器连接到网络 docker network connect mynetwork mypostgresdocker network disconnect将容器从网络断开 docker network disconnect mynetwork mypostgres
1.3.4 使用 Docker 部署 PostgreSQL 18
1.3.4.1 拉取 PostgreSQL 18 镜像 从 Docker Hub 拉取官方的 PostgreSQL 18 镜像:
1.3.4.2 运行 PostgreSQL 18 容器
1.3.4.2.1 基本运行 docker run -d \
--name pg18 \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
postgres:18
-d:在后台运行容器
--name:为容器指定名称
-e POSTGRES_PASSWORD:设置 PostgreSQL 超级用户密码
-p 5432:5432:将容器的 5432 端口映射到主机的 5432 端口
1.3.4.2.2 挂载数据卷 为了持久化存储数据,我们可以将 PostgreSQL 的数据目录挂载到主机:
sudo mkdir -p /opt/pg18/data
sudo chown -R 999:999 /opt/pg18/data
docker run -d \
--name pg18 \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
-v /opt/pg18/data:/var/lib/postgresql/data \
postgres:18
-v /opt/pg18/data:/var/lib/postgresql/data:将主机的 /opt/pg18/data 目录挂载到容器的 /var/lib/postgresql/data 目录
1.3.4.2.3 设置自定义配置 我们还可以挂载自定义的 PostgreSQL 配置文件:
sudo mkdir -p /opt/pg18/config
vi /opt/pg18/config/postgresql.conf
listen_addresses = '*'
max_connections = 200
shared_buffers = 512MB
docker run -d \
--name pg18 \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
-v /opt/pg18/data:/var/lib/postgresql/data \
-v /opt/pg18/config/postgresql.conf:/etc/postgresql/postgresql.conf \
postgres:18 \
-c config_file=/etc/postgresql/postgresql.conf
1.3.4.3 连接到 PostgreSQL 18 容器
1.3.4.3.1 使用 psql 命令行工具
docker exec -it pg18 psql -U postgres
psql -h localhost -p 5432 -U postgres
1.3.4.3.2 使用 pgAdmin 连接
1.3.5 使用 Docker Compose 部署 PostgreSQL 18 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,使用 YAML 文件来配置应用程序的服务。
1.3.5.1 安装 Docker Compose
1.3.5.2 创建 Docker Compose 文件 创建一个名为 docker-compose.yml 的文件:
version: '3.8'
services:
postgres:
image: postgres:18
container_name: pg18
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: postgres
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
restart: always
volumes:
pgdata:
driver: local
1.3.5.3 创建初始化 SQL 脚本 创建一个名为 init.sql 的文件,用于初始化数据库:
1.3.5.4 启动服务 在包含 docker-compose.yml 文件的目录中运行:
1.3.5.5 停止服务
1.3.6 实践项目:部署 PostgreSQL 18 容器
1.3.6.1 项目目标 通过本次实践,掌握使用 Docker 部署 PostgreSQL 18 的方法,包括:
拉取 PostgreSQL 18 镜像
运行 PostgreSQL 18 容器
连接到 PostgreSQL 18 容器
使用 Docker Compose 部署 PostgreSQL 18
1.3.6.2 实践步骤
1.3.6.2.1 拉取 PostgreSQL 18 镜像
1.3.6.2.2 运行 PostgreSQL 18 容器 docker run -d \
--name pg18-practice \
-e POSTGRES_PASSWORD=practice123 \
-e POSTGRES_USER=practiceuser \
-e POSTGRES_DB=practicedb \
-p 5432:5432 \
postgres:18
1.3.6.2.3 验证容器运行状态
1.3.6.2.4 连接到 PostgreSQL 容器 docker exec -it pg18-practice psql -U practiceuser -d practicedb
1.3.6.2.5 创建表和插入数据
CREATE TABLE students (
id SERIAL PRIMARY KEY ,
name VARCHAR (50 ) NOT NULL ,
age INTEGER NOT NULL ,
grade VARCHAR (10 ) NOT NULL
);
INSERT INTO students (name, age, grade) VALUES
('小明' , 18 , '高三' ),
('小红' , 17 , '高二' ),
('小刚' , 16 , '高一' );
SELECT * FROM students;
\q
1.3.6.2.6 使用 Docker Compose 部署 创建 docker-compose.yml 文件:
version: '3.8'
services:
postgres:
image: postgres:18
container_name: pg18-compose
environment:
POSTGRES_PASSWORD: compose123
POSTGRES_USER: composeuser
POSTGRES_DB: composedb
ports:
- "5432:5432"
volumes:
- pgdata-compose:/var/lib/postgresql/data
restart: always
volumes:
pgdata-compose:
driver: local
docker exec -it pg18-compose psql -U composeuser -d composedb
1.3.6.2.7 清理资源
docker stop pg18-practice
docker rm pg18-practice
docker-compose down
docker rmi postgres:18
1.3.7 主流数据库 Docker 部署对比 为了帮助你更全面地理解不同数据库的 Docker 部署方式,本节将对比 PostgreSQL 18、SQL Server 2019+ 和 MySQL 8.0+ 在 Docker 部署方面的差异。
1.3.7.1 Docker 镜像特性对比 特性 PostgreSQL 18 SQL Server 2019+ MySQL 8.0+ 官方镜像维护 官方维护,更新频繁 官方维护,定期更新 官方维护,更新频繁 镜像大小 约 300MB(alpine 版本更小) 约 1.5GB(较大,因为包含完整的 SQL Server) 约 500MB(alpine 版本约 150MB) 镜像标签 提供多种标签:latest、18、18-alpine 等 提供多种标签:latest、2019、2022、2022-latest 等 提供多种标签:latest、8.0、8.0-alpine 等 基础镜像 基于 Debian,也提供 Alpine 版本 基于 Ubuntu 基于 Debian,也提供 Alpine 版本 多平台支持 支持 amd64、arm64 等多种架构 主要支持 amd64,部分版本支持 arm64 支持 amd64、arm64 等多种架构 镜像分层 合理的分层设计,便于缓存和更新 分层较多,更新时可能需要较多带宽 合理的分层设计,便于缓存和更新
1.3.7.2 部署命令差异对比 部署方面 PostgreSQL 18 SQL Server 2019+ MySQL 8.0+ 基本部署命令 docker run -d --name pg18 -e POSTGRES_PASSWORD=mypassword -p 5432:5432 postgres:18docker run -d --name mssql -e SA_PASSWORD=MyPass123 -e ACCEPT_EULA=Y -p 1433:1433 mcr.microsoft.com/mssql/server:2022-latestdocker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=mypassword -p 3306:3306 mysql:8.0默认用户名 postgres sa root 环境变量 支持 POSTGRES_PASSWORD、POSTGRES_USER、POSTGRES_DB 等 支持 SA_PASSWORD、ACCEPT_EULA、MSSQL_PID 等 支持 MYSQL_ROOT_PASSWORD、MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORD 等 端口映射 默认 5432 默认 1433 默认 3306 数据目录 /var/lib/postgresql/data /var/opt/mssql /var/lib/mysql 配置文件位置 /var/lib/postgresql/data/postgresql.conf /var/opt/mssql/mssql.conf /etc/mysql/my.cnf 或 /etc/mysql/conf.d/ 日志位置 /var/log/postgresql /var/opt/mssql/log /var/log/mysql
1.3.7.3 持久化存储对比 存储方面 PostgreSQL 18 SQL Server 2019+ MySQL 8.0+ 数据卷挂载 docker run -v pgdata:/var/lib/postgresql/data postgres:18docker run -v mssqldata:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latestdocker run -v mysqldata:/var/lib/mysql mysql:8.0主机目录挂载 docker run -v /host/path:/var/lib/postgresql/data postgres:18docker run -v /host/path:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latestdocker run -v /host/path:/var/lib/mysql mysql:8.0权限要求 数据目录需要 uid/gid 999:999 权限 数据目录需要特定权限配置 数据目录需要正确的权限配置 存储驱动支持 支持多种存储驱动 支持多种存储驱动,但对某些驱动有性能影响 支持多种存储驱动 数据备份 可通过 docker exec 运行 pg_dump,或直接备份数据卷 可通过 docker exec 运行 sqlcmd,或直接备份数据卷 可通过 docker exec 运行 mysqldump,或直接备份数据卷
1.3.7.4 Docker Compose 配置对比
1.3.7.4.1 PostgreSQL 18 Docker Compose 配置 version: '3.8'
services:
postgres:
image: postgres:18
container_name: pg18
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: postgres
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
restart: always
volumes:
pgdata:
driver: local
1.3.7.4.2 SQL Server 2019+ Docker Compose 配置 version: '3.8'
services:
mssql:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: mssql
environment:
SA_PASSWORD: MyPass123
ACCEPT_EULA: Y
MSSQL_PID: Developer
ports:
- "1433:1433"
volumes:
- mssqldata:/var/opt/mssql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
restart: always
volumes:
mssqldata:
driver: local
1.3.7.4.3 MySQL 8.0+ Docker Compose 配置 version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql8
environment:
MYSQL_ROOT_PASSWORD: mysecretpassword
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3306:3306"
volumes:
- mysqldata:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
- ./my.cnf:/etc/mysql/conf.d/my.cnf
restart: always
volumes:
mysqldata:
driver: local
1.3.7.5 初始化和配置对比 初始化方面 PostgreSQL 18 SQL Server 2019+ MySQL 8.0+ 初始化脚本 支持将.sql/.sh/.sql.gz 文件放入/docker-entrypoint-initdb.d/目录 支持通过环境变量或外部脚本初始化 支持将.sql/.sh/.sql.gz 文件放入/docker-entrypoint-initdb.d/目录 配置文件挂载 可挂载 postgresql.conf 和 pg_hba.conf 可挂载 mssql.conf 可挂载 my.cnf 或在/etc/mysql/conf.d/目录下挂载配置文件 命令行配置 支持通过 docker run 命令行参数传递配置(如-c shared_buffers=256MB) 配置主要通过环境变量或配置文件 支持通过命令行参数传递配置(如–default-authentication-plugin=mysql_native_password) 扩展安装 可通过 docker exec 安装扩展(如 apt-get install postgresql-18-postgis-3) 可通过 docker exec 安装扩展包 可通过 docker exec 安装插件(如 apt-get install mysql-server-plugin-*)
1.3.7.6 性能和资源使用对比 资源方面 PostgreSQL 18 SQL Server 2019+ MySQL 8.0+ CPU 使用率 适中,默认配置下 CPU 使用率较低 较高,尤其是在启动时和执行复杂查询时 适中,默认配置下 CPU 使用率较低 内存使用率 可通过 shared_buffers 等参数调整,默认约 128MB 较大,默认至少需要 2GB 内存 可通过 innodb_buffer_pool_size 等参数调整,默认约 128MB 磁盘 I/O 可通过 WAL 配置调整 I/O 模式 较高,尤其是在执行大量写入操作时 可通过 innodb_flush_log_at_trx_commit 等参数调整 I/O 模式 启动时间 较快,约 5-10 秒 较慢,约 30-60 秒(因为需要初始化 SQL Server) 较快,约 5-10 秒 并发连接支持 默认支持 100 个并发连接,可调整 默认支持 32767 个并发连接 默认支持 151 个并发连接,可调整
1.3.7.7 适用场景对比 场景类型 PostgreSQL 18 SQL Server 2019+ MySQL 8.0+ 开发环境 非常适合,镜像较小,启动快,功能全面 适合需要 SQL Server 特定功能的开发环境 非常适合,镜像小,启动快,易于配置 测试环境 适合,支持多种配置,易于部署和销毁 适合,可快速部署不同版本的 SQL Server 适合,支持多种配置,易于自动化测试 生产环境 适合,稳定性高,支持高可用配置 适合,企业级支持,功能全面 适合,高并发性能好,资源占用低 微服务架构 适合,可作为微服务的后端数据库 适合,尤其是与.NET 微服务集成 适合,轻量级,适合微服务架构 CI/CD 流水线 适合,镜像小,启动快,易于集成 可以使用,但镜像较大,可能影响 CI/CD 速度 非常适合,镜像小,启动快,易于集成 边缘计算 适合,alpine 版本体积小,资源占用低 不适合,镜像太大,资源占用高 适合,alpine 版本体积小,资源占用低
1.3.8 总结 本章节我们学习了 Docker 的基本概念、安装方法和基本命令,以及如何使用 Docker 部署 PostgreSQL 18。同时,我们对比了 PostgreSQL 18、SQL Server 2019+ 和 MySQL 8.0+ 在 Docker 部署方面的差异,包括镜像特性、部署命令、持久化存储、Docker Compose 配置、初始化和配置、性能和资源使用以及适用场景等方面。
Docker 的核心概念和优势
Docker 在不同系统上的安装方法
Docker 基本命令(镜像管理、容器管理、网络管理)
使用 Docker 部署 PostgreSQL 18 的方法
使用 Docker Compose 部署 PostgreSQL 18
一个完整的实践项目
主流数据库 Docker 部署对比
Docker 是现代应用开发和部署的重要工具,掌握 Docker 可以帮助我们更高效地开发、测试和部署应用程序。通过对比不同数据库的 Docker 部署方式,我们可以更好地理解它们的特点和适用场景,选择最适合我们需求的数据库。
在接下来的章节中,我们将学习如何在本地安装 PostgreSQL 18,以及如何使用 PostgreSQL 进行数据操作和管理。
1.3.9 思考与练习
1.3.9.1 思考问题
Docker 和虚拟机的主要区别是什么?
Docker 容器和镜像的关系是什么?
如何持久化存储 Docker 容器中的数据?
如何在 Docker 容器中执行命令?
Docker Compose 的主要作用是什么?
1.3.9.2 练习题
编写一个 Docker Compose 文件,部署 PostgreSQL 18 和 pgAdmin。
使用 Docker 部署一个 PostgreSQL 18 容器,并创建一个简单的数据库和表。
如何备份和恢复 Docker 容器中的 PostgreSQL 数据?
简述 Docker 的核心概念及其作用。
比较 Docker 镜像和容器的区别。
如何将当前用户添加到 docker 组,无需 sudo 即可运行 docker 命令?
简述使用 Docker 部署 PostgreSQL 18 的步骤。
如何使用 Docker Compose 启动和停止服务?
简述 Docker 容器的网络管理方法。
比较 PostgreSQL 18、SQL Server 2019+ 和 MySQL 8.0+ 在 Docker 部署方面的差异。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 SQL 美化和格式化 在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
SQL转CSV/JSON/XML 解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 工具包 CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online