PostgreSQL 18 从新手到大师:实战指南 - 1.3 Docker环境搭建

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. 下载Docker Desktop for Windows安装包:https://desktop.docker.com/win/main/amd64/Docker Desktop Installer.exe

  2. 双击安装包,按照提示进行安装

  3. 安装完成后,启动Docker Desktop

  4. 验证Docker安装是否成功:

    • 打开命令提示符或PowerShell
    • 运行命令:docker --version
    • 运行命令:docker run hello-world

1.3.2.2 Linux系统安装Docker

以Ubuntu 24.04为例:

  1. 更新系统包:

    bash 复制代码
    sudo apt-get update
  2. 安装必要的依赖包:

    bash 复制代码
    sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  3. 添加Docker官方GPG密钥:

    bash 复制代码
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. 添加Docker稳定版仓库:

    bash 复制代码
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  5. 再次更新系统包:

    bash 复制代码
    sudo apt-get update
  6. 安装Docker CE(社区版):

    bash 复制代码
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  7. 验证Docker安装是否成功:

    bash 复制代码
    sudo docker --version
    sudo docker run hello-world
  8. (可选)将当前用户添加到docker组,无需sudo即可运行docker命令:

    bash 复制代码
    sudo usermod -aG docker $USER

    注销并重新登录后生效。

1.3.2.3 macOS系统安装Docker

1.3.2.3.1 系统要求
  • macOS 11或更高版本
1.3.2.3.2 安装步骤
  1. 下载Docker Desktop for Mac安装包:https://desktop.docker.com/mac/main/amd64/Docker.dmg

  2. 双击安装包,将Docker图标拖动到Applications文件夹

  3. 启动Docker Desktop

  4. 验证Docker安装是否成功:

    • 打开终端
    • 运行命令:docker --version
    • 运行命令:docker run hello-world

1.3.3 Docker基本命令

1.3.3.1 镜像管理命令

命令 描述 示例
docker pull 从仓库拉取镜像 docker pull postgres:18
docker images 列出本地镜像 docker images
docker rmi 删除本地镜像 docker rmi postgres:18
docker build 从Dockerfile构建镜像 docker build -t myapp .
docker tag 为镜像添加标签 docker tag myapp myusername/myapp:latest
docker push 将镜像推送到仓库 docker push myusername/myapp:latest

1.3.3.2 容器管理命令

命令 描述 示例
docker run 运行容器 docker run -d --name mypostgres postgres:18
docker ps 列出运行中的容器 docker ps
docker ps -a 列出所有容器 docker ps -a
docker start 启动容器 docker start mypostgres
docker stop 停止容器 docker stop mypostgres
docker restart 重启容器 docker restart mypostgres
docker rm 删除容器 docker rm mypostgres
docker exec 在运行的容器中执行命令 docker exec -it mypostgres psql -U postgres
docker logs 查看容器日志 docker logs mypostgres
docker inspect 查看容器详细信息 docker inspect mypostgres

1.3.3.3 网络管理命令

命令 描述 示例
docker network ls 列出所有网络 docker network ls
docker network create 创建网络 docker network create mynetwork
docker network connect 将容器连接到网络 docker network connect mynetwork mypostgres
docker network disconnect 将容器从网络断开 docker network disconnect mynetwork mypostgres

1.3.4 使用Docker部署PostgreSQL 18

1.3.4.1 拉取PostgreSQL 18镜像

从Docker Hub拉取官方的PostgreSQL 18镜像:

bash 复制代码
docker pull postgres:18

1.3.4.2 运行PostgreSQL 18容器

1.3.4.2.1 基本运行
bash 复制代码
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的数据目录挂载到主机:

bash 复制代码
# 创建数据目录
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配置文件:

bash 复制代码
# 创建配置目录
sudo mkdir -p /opt/pg18/config

# 创建自定义配置文件
sudo vi /opt/pg18/config/postgresql.conf

在配置文件中添加自定义配置:

复制代码
listen_addresses = '*'
max_connections = 200
shared_buffers = 512MB

运行容器并挂载配置文件:

bash 复制代码
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命令行工具
bash 复制代码
# 方法1:直接在容器内运行psql
docker exec -it pg18 psql -U postgres

# 方法2:使用本地psql连接(需要安装psql)
psql -h localhost -p 5432 -U postgres
1.3.4.3.2 使用pgAdmin连接
  1. 下载并安装pgAdmin:https://www.pgadmin.org/download/

  2. 打开pgAdmin,添加新服务器:

    • 名称:pg18
    • 主机名/地址:localhost
    • 端口:5432
    • 用户名:postgres
    • 密码:mysecretpassword

1.3.5 使用Docker Compose部署PostgreSQL 18

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,使用YAML文件来配置应用程序的服务。

1.3.5.1 安装Docker Compose

Docker Compose通常与Docker Desktop一起安装,无需单独安装。如果需要单独安装,可以参考官方文档:https://docs.docker.com/compose/install/

1.3.5.2 创建Docker Compose文件

创建一个名为docker-compose.yml的文件:

yaml 复制代码
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  # 初始化SQL脚本
    restart: always

volumes:
  pgdata:
    driver: local

1.3.5.3 创建初始化SQL脚本

创建一个名为init.sql的文件,用于初始化数据库:

sql 复制代码
-- 创建测试表
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);

-- 插入测试数据
INSERT INTO users (name, email) VALUES 
('张三', 'zhangsan@example.com'),
('李四', 'lisi@example.com'),
('王五', 'wangwu@example.com');

1.3.5.4 启动服务

在包含docker-compose.yml文件的目录中运行:

bash 复制代码
docker-compose up -d

1.3.5.5 停止服务

bash 复制代码
docker-compose down

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镜像
bash 复制代码
docker pull postgres:18
1.3.6.2.2 运行PostgreSQL 18容器
bash 复制代码
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 验证容器运行状态
bash 复制代码
docker ps
1.3.6.2.4 连接到PostgreSQL容器
bash 复制代码
docker exec -it pg18-practice psql -U practiceuser -d practicedb
1.3.6.2.5 创建表和插入数据

在psql中运行:

sql 复制代码
-- 创建学生表
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;

-- 退出psql
\q
1.3.6.2.6 使用Docker Compose部署

创建docker-compose.yml文件:

yaml 复制代码
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

启动服务:

bash 复制代码
docker-compose up -d

连接到数据库:

bash 复制代码
docker exec -it pg18-compose psql -U composeuser -d composedb
1.3.6.2.7 清理资源
bash 复制代码
# 停止并删除单个容器
docker stop pg18-practice
docker rm pg18-practice

# 停止并删除Compose服务
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:18 docker run -d --name mssql -e SA_PASSWORD=MyPass123 -e ACCEPT_EULA=Y -p 1433:1433 mcr.microsoft.com/mssql/server:2022-latest docker 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:18 docker run -v mssqldata:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latest docker run -v mysqldata:/var/lib/mysql mysql:8.0
主机目录挂载 docker run -v /host/path:/var/lib/postgresql/data postgres:18 docker run -v /host/path:/var/opt/mssql mcr.microsoft.com/mssql/server:2022-latest docker 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配置
yaml 复制代码
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配置
yaml 复制代码
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配置
yaml 复制代码
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配置、初始化和配置、性能和资源使用以及适用场景等方面。

主要内容包括:

  1. Docker的核心概念和优势
  2. Docker在不同系统上的安装方法
  3. Docker基本命令(镜像管理、容器管理、网络管理)
  4. 使用Docker部署PostgreSQL 18的方法
  5. 使用Docker Compose部署PostgreSQL 18
  6. 一个完整的实践项目
  7. 主流数据库Docker部署对比

Docker是现代应用开发和部署的重要工具,掌握Docker可以帮助我们更高效地开发、测试和部署应用程序。通过对比不同数据库的Docker部署方式,我们可以更好地理解它们的特点和适用场景,选择最适合我们需求的数据库。

在接下来的章节中,我们将学习如何在本地安装PostgreSQL 18,以及如何使用PostgreSQL进行数据操作和管理。

1.3.9 思考与练习

1.3.9.1 思考问题

  1. Docker和虚拟机的主要区别是什么?
  2. Docker容器和镜像的关系是什么?
  3. 如何持久化存储Docker容器中的数据?
  4. 如何在Docker容器中执行命令?
  5. Docker Compose的主要作用是什么?

1.3.9.2 练习题

  1. 编写一个Docker Compose文件,部署PostgreSQL 18和pgAdmin。
  2. 使用Docker部署一个PostgreSQL 18容器,并创建一个简单的数据库和表。
  3. 如何备份和恢复Docker容器中的PostgreSQL数据?
  4. 简述Docker的核心概念及其作用。
  5. 比较Docker镜像和容器的区别。
  6. 如何将当前用户添加到docker组,无需sudo即可运行docker命令?
  7. 简述使用Docker部署PostgreSQL 18的步骤。
  8. 如何使用Docker Compose启动和停止服务?
  9. 简述Docker容器的网络管理方法。
  10. 比较PostgreSQL 18、SQL Server 2019+和MySQL 8.0+在Docker部署方面的差异。
相关推荐
正在走向自律9 小时前
金仓数据库KingbaseES中级语法详解与实践指南
数据库·oracle·kingbasees·金仓数据库·信创改造
Gofarlic_oms19 小时前
Windchill用户登录与模块访问失败问题排查与许可证诊断
大数据·运维·网络·数据库·人工智能
我是小疯子669 小时前
Python变量赋值陷阱:浅拷贝VS深拷贝
java·服务器·数据库
Shi_haoliu10 小时前
SolidTime 在 Rocky Linux 9.5 上的完整部署流程
linux·运维·nginx·postgresql·vue·php·laravel
Zoey的笔记本10 小时前
2026告别僵化工作流:支持自定义字段的看板工具选型与部署指南
大数据·前端·数据库
静听山水10 小时前
docker安装starrocks
数据库
学编程的小程11 小时前
从“兼容”到“超越”:金仓KESBSON引擎如何借多模融合改写文档数据库规则
数据库
千层冷面11 小时前
数据库分库分表
java·数据库·mysql·oracle
DBA小马哥11 小时前
金仓数据库引领国产化替代新范式:构建高效、安全的文档型数据库迁移解决方案
数据库·安全·mongodb·dba·迁移学习
C_心欲无痕12 小时前
Docker 的镜像与容器
运维·docker·容器