麒麟V10系统下基于Docker部署PolarDB数据库的完整实践指南
2026/8/6 2:16:27 网站建设 项目流程

1. 项目概述与背景

最近在国产化替代的大背景下,很多朋友开始接触像银河麒麟V10这样的国产操作系统。无论是出于项目需求还是个人学习,在麒麟系统上搭建一个稳定、高性能的数据库环境,成了一个挺常见的任务。PolarDB作为一款云原生数据库,因其高性能和弹性扩展能力,受到了不少开发者和企业的关注。而Docker,这个容器化技术的代表,则为我们提供了一种轻量、一致且高效的部署方式。

所以,今天我们就来聊聊,如何在银河麒麟V10(或其他主流Linux发行版)上,通过Docker来安装和运行PolarDB。这不仅仅是把几条命令敲进去那么简单,我会结合自己在国产化环境里摸爬滚打的经验,把从系统准备、Docker环境配置,到PolarDB容器拉取、运行、配置以及后续连接管理的完整流程,掰开揉碎了讲清楚。过程中你会遇到哪些“坑”,怎么绕过去,有哪些参数需要特别注意,我都会一一说明。无论你是刚接触麒麟系统的新手,还是想快速在本地搭建PolarDB测试环境的开发者,这篇内容都能给你一份可以直接“抄作业”的实操指南。

2. 环境准备与前置检查

在开始安装之前,我们必须确保操作系统环境满足Docker和PolarDB运行的基本要求。这一步做扎实了,后面能省去很多莫名其妙的麻烦。

2.1 系统确认与内核要求

首先,确认你的系统确实是银河麒麟V10。打开终端,执行以下命令:

cat /etc/os-release

你会看到类似Kylin Linux Advanced Server release V10 (Sword)的输出。记住,我们操作的是服务器版,桌面版在细节上可能略有差异。接下来,检查内核版本,Docker对内核有最低要求(通常是3.10以上)。运行:

uname -r

麒麟V10的内核版本通常是4.19或更高,这完全满足Docker的要求。但这里有一个国产化环境下常见的“暗坑”:安全模块。像银河麒麟这类系统,默认可能会启用严格的安全策略(如SELinux的某种变体或自研模块)。虽然Docker可以与之共存,但配置不当会导致容器无法访问宿主机资源。一个比较稳妥的做法是,在前期测试时,先查看并暂时放宽相关策略,等所有服务调通后再根据安全需求收紧。你可以使用getenforce命令查看状态,如果返回Enforcing,可以临时设置为Permissive模式进行测试:sudo setenforce 0。这只是权宜之计,生产环境需要精细化的策略配置。

2.2 虚拟化支持与依赖包安装

Docker运行容器依赖于系统的虚拟化支持。对于物理服务器,你需要在BIOS中开启Intel VT-x或AMD-V技术。对于虚拟机,则需要在虚拟化软件(如VMware、KVM)的配置中开启虚拟化引擎支持。在Linux下,我们可以通过检查CPU标志来确认:

grep -E --color '(vmx|svm)' /proc/cpuinfo

如果有输出(高亮显示vmx或svm),说明支持。如果没有,你就需要去检查宿主机或虚拟机的设置了。这是Docker Desktop在Windows/Mac上常见的启动失败原因(“virtualisation support not detected”),在纯Linux环境下,只要你是安装在物理机或正确配置的虚拟机上,这个问题相对少见。

接下来,安装一些必要的系统工具和依赖包。麒麟V10的软件源可能和CentOS、Ubuntu不同,它通常基于开源生态但有自己的仓库。首先更新软件包索引:

sudo yum makecache sudo yum install -y yum-utils device-mapper-persistent-data lvm2

这里yum-utils提供了yum-config-manager工具,device-mapper-persistent-datalvm2是Docker存储驱动devicemapper可能需要的基础(虽然现在Docker默认更推荐overlay2,但先装上兼容性好)。

注意:在麒麟系统上,软件包名称可能与CentOS完全一致,也可能有细微差别。如果上述包名找不到,可以尝试搜索类似功能的包,或者检查是否已预装。使用yum search命令是很好的习惯。

3. Docker引擎的安装与配置

有了准备好的系统基础,我们就可以开始安装Docker引擎本身了。

3.1 添加Docker官方仓库并安装

麒麟V10默认的源里可能没有最新版的Docker,或者版本较旧。为了获得更好的兼容性和支持,我们选择添加Docker的官方CE(社区版)仓库。Docker为不同的Linux发行版提供了仓库,对于麒麟这类基于Red Hat Enterprise Linux (RHEL) 的系统,我们可以按照CentOS的配置方法来操作。

首先,添加仓库:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

这里有一个关键点:仓库地址指向的是CentOS。因为Docker官方并未为“Kylin”提供专属仓库,但麒麟V10与RHEL/CentOS 7/8的二进制兼容性很高,所以使用CentOS的仓库在大多数情况下是可行的。添加成功后,你可以查看一下新增的仓库列表:sudo yum repolist

接下来,安装Docker引擎及其命令行工具:

sudo yum install -y docker-ce docker-ce-cli containerd.io

这个命令会安装Docker社区版引擎、客户端以及容器运行时containerd。安装过程中,yum会自动处理依赖关系。如果遇到依赖冲突(比如系统已有旧版本的容器相关软件),你需要根据提示决定是否移除或更新它们。在国产化环境中,稳妥起见,建议在一个相对干净的系统上进行操作。

3.2 启动Docker服务与权限配置

安装完成后,我们需要启动Docker守护进程,并设置它开机自启:

sudo systemctl start docker sudo systemctl enable docker

启动后,运行一个最简单的测试命令来验证安装是否成功:

sudo docker run hello-world

如果看到“Hello from Docker!”等欢迎信息,说明Docker引擎已经可以正常工作。但每次运行docker命令都要加sudo很麻烦,也不安全。所以,我们需要将当前用户添加到docker用户组,使其拥有执行Docker命令的权限:

sudo usermod -aG docker $USER

重要提示:执行此命令后,你需要完全退出当前终端会话,并重新登录,或者新开一个终端窗口,用户组的变更才会生效。之后,你就可以直接使用docker ps这样的命令,而无需sudo了。

3.3 配置国内镜像加速器

直接从Docker Hub拉取镜像,速度可能会很慢,甚至不稳定。配置一个国内的镜像加速器是必不可少的步骤。国内常用的有阿里云、腾讯云、网易云等提供的加速器。这里以阿里云为例(你需要有一个阿里云账号,免费注册即可)。

登录阿里云控制台,进入“容器镜像服务”,在“镜像工具”->“镜像加速器”中,你会看到针对不同操作系统的加速器地址配置说明。对于麒麟V10,我们修改Docker的守护进程配置文件/etc/docker/daemon.json。如果文件不存在,就创建它:

sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"] } EOF

请将https://your-mirror.mirror.aliyuncs.com替换成你在阿里云控制台获取的专属加速器地址。一个配置文件中可以配置多个镜像源,用数组表示。配置完成后,重新加载配置并重启Docker服务:

sudo systemctl daemon-reload sudo systemctl restart docker

重启后,使用docker info命令,在输出结果的末尾,如果看到Registry Mirrors下面有你配置的地址,就说明加速器配置成功了。这个步骤能极大提升后续拉取PolarDB等大型镜像的速度。

4. PolarDB镜像的获取与容器运行

Docker环境就绪后,我们的目标就是运行PolarDB了。PolarDB有多个版本和组件,这里我们以最常用的PolarDB for PostgreSQL 开源版为例进行部署。

4.1 拉取PolarDB镜像

PolarDB的开源镜像托管在阿里云的容器镜像服务(ACR)和Docker Hub上。我们可以使用docker pull命令来拉取。为了获得更快的速度,建议使用配置了阿里云加速器后,拉取来自阿里云仓库的镜像。

你可以直接使用以下命令拉取一个特定版本的PolarDB-PG镜像(以polardb-for-pg为例,具体镜像名请参考PolarDB开源官方文档的最新说明):

docker pull polardb/polardb_pg_local_instance:latest

或者,如果你有阿里云ACR的地址,也可以从那里拉取。拉取镜像的过程可能会花费一些时间,因为数据库镜像体积通常比较大(可能超过1GB)。你可以通过docker images命令查看已拉取到本地的镜像列表,确认polardb/polardb_pg_local_instance镜像是否存在及其大小。

实操心得:在拉取大型镜像时,如果网络中断,docker pull命令支持断点续传。重新执行相同的命令即可。另外,使用docker pull时最好指定具体的版本标签(如1114),而不是latest,以确保部署环境的一致性,避免因镜像更新导致意外行为。

4.2 运行PolarDB容器

拉取镜像成功后,我们就可以通过docker run命令来创建并启动一个PolarDB容器了。这个命令的参数比较多,我们拆解开来理解:

docker run -d \ --name polardb_pg \ -p 5432:5432 \ -e MODE=standalone \ -e POSTGRES_PASSWORD=YourStrongPassword123 \ -v /home/kylin/polardb_data:/var/lib/postgresql/data \ polardb/polardb_pg_local_instance:latest
  • -d:以后台(detached)模式运行容器。
  • --name polardb_pg:给容器起一个名字,方便后续管理(启动、停止、查看日志等)。
  • -p 5432:5432:端口映射。将容器内部的PostgreSQL默认端口5432映射到宿主机的5432端口。这样,你就能通过宿主机的IP和5432端口访问数据库了。如果宿主机5432端口已被占用,可以改为-p 5433:5432,意为通过宿主机的5433端口访问容器内的5432服务。
  • -e MODE=standalone:设置环境变量,指定运行模式为单机版。PolarDB也支持一写多读的集群模式,但单机版更适合快速启动和测试。
  • -e POSTGRES_PASSWORD=YourStrongPassword123这是最重要的一个参数。它设置数据库超级用户(postgres)的密码。请务必替换YourStrongPassword123为一个强密码。在Docker中,通过环境变量设置密码是常见方式。
  • -v /home/kylin/polardb_data:/var/lib/postgresql/data:数据卷挂载。这是数据持久化的关键。它将宿主机目录/home/kylin/polardb_data挂载到容器内的数据目录/var/lib/postgresql/data。这样,即使容器被删除,数据库的数据文件依然保留在宿主机上。下次启动新容器时,只需挂载同一个目录,数据就能恢复。请确保宿主机路径存在且有写权限(sudo mkdir -p /home/kylin/polardb_data)。
  • 最后一行是指定使用的镜像名和标签。

执行上述命令后,容器会在后台启动。使用docker ps查看容器状态,如果看到polardb_pg容器状态为Up,就说明启动成功了。

4.3 验证PolarDB服务

容器启动后,我们还需要确认数据库服务是否真的在容器内正常监听和运行。首先,可以查看容器的日志:

docker logs -f polardb_pg

通过日志,你可以看到数据库初始化、启动的过程。当你看到类似“database system is ready to accept connections”的信息时,说明数据库服务已就绪。按Ctrl+C退出日志跟随模式。

然后,我们可以进入容器内部,使用psql客户端连接数据库进行验证:

docker exec -it polardb_pg bash

这条命令会进入容器的bash shell。接着,在容器内连接数据库:

psql -U postgres -h localhost

连接时,会提示你输入密码,就是前面POSTGRES_PASSWORD环境变量设置的值。连接成功后,你会看到PostgreSQL的命令行提示符postgres=#。可以执行一些简单的SQL命令验证,比如\l查看数据库列表,或者SELECT version();查看PolarDB版本信息。退出psql用\q,退出容器用exit

5. 外部连接与基础管理

让数据库在容器里跑起来只是第一步,我们通常需要从宿主机甚至网络上的其他机器来连接和管理它。

5.1 从宿主机连接数据库

由于我们在docker run时做了端口映射 (-p 5432:5432),因此从宿主机连接数据库非常简单。前提是宿主机需要安装PostgreSQL客户端psql。在麒麟V10上,可以通过yum安装:

sudo yum install -y postgresql

安装后,就可以在宿主机上直接连接了:

psql -U postgres -h 127.0.0.1 -p 5432

这里-h 127.0.0.1指定连接本机(宿主机),-p 5432指定端口。同样,输入之前设置的密码即可连接。这种方式非常适合在宿主机上进行数据库的初始化、数据导入导出等管理操作。

5.2 配置远程连接(谨慎操作)

默认情况下,基于安全考虑,容器内的PostgreSQL通常只允许本地(容器内)连接。如果你需要从局域网内的其他机器访问,需要修改两个地方的配置。

第一步:修改容器内的PostgreSQL配置文件。

我们需要进入容器,编辑pg_hba.confpostgresql.conf文件。更优雅的方式是在宿主机上编辑,然后通过数据卷映射进去,但为了快速演示,我们先直接修改容器内的文件。

首先,进入容器:

docker exec -it polardb_pg bash

然后,找到pg_hba.conf文件,它通常位于/var/lib/postgresql/data/pg_hba.conf(这正是我们挂载的数据目录)。在文件末尾添加一行,允许特定网段或所有IP连接(生产环境请严格限制IP):

host all all 0.0.0.0/0 md5

这行配置表示允许所有来源IP(0.0.0.0/0)的所有数据库的所有用户,使用md5密码认证方式进行TCP/IP连接。

接着,修改postgresql.conf文件,通常在同一目录。找到listen_addresses参数,将其修改为:

listen_addresses = '*'

这表示让PostgreSQL监听所有网络接口。

第二步:重启容器使配置生效。

退出容器后,在宿主机执行:

docker restart polardb_pg

重要警告:将数据库暴露在0.0.0.0/0是非常危险的行为,仅适用于受信任的内网测试环境。在生产环境中,你必须将0.0.0.0/0替换为具体的、受信任的客户端IP地址或子网(如192.168.1.0/24),并配合防火墙策略,严格限制访问来源。

5.3 基本的容器与数据管理

作为日常运维,你需要掌握几个基本的Docker命令:

  • docker stop polardb_pg:停止容器。
  • docker start polardb_pg:启动已停止的容器。
  • docker restart polardb_pg:重启容器。
  • docker rm -f polardb_pg:强制删除容器(慎用,除非你确定数据已通过卷持久化,或不再需要)。
  • docker logs polardb_pg:查看容器日志。
  • docker exec -it polardb_pg psql -U postgres:快速进入容器并连接数据库的一条命令。

关于数据,因为我们使用了-v参数做了卷挂载,所以数据文件安全地存放在/home/kylin/polardb_data目录下。你可以定期备份这个目录。如果需要迁移数据库,把这个目录拷贝到新的宿主机,并在新宿主机上运行一个指向该目录的PolarDB容器即可。

6. 常见问题与排查技巧实录

在实际操作中,你几乎一定会遇到一些问题。下面是我总结的几个典型问题及其解决方法。

6.1 Docker服务启动失败

问题现象:执行sudo systemctl start docker后失败,查看状态systemctl status docker显示错误。

排查思路

  1. 检查内核与驱动:首先确认系统内核版本符合要求(uname -r)。然后,检查是否加载了必要的内核模块,如overlaybr_netfilter。可以使用lsmod | grep overlaylsmod | grep br_netfilter查看。如果未加载,尝试sudo modprobe overlaysudo modprobe br_netfilter
  2. 检查安全模块:如前所述,SELinux或AppArmor可能会阻止Docker。可以尝试临时禁用SELinux(sudo setenforce 0)后重启Docker服务,看是否成功。如果成功,说明是安全策略问题,需要为Docker配置正确的策略规则,而不是长期禁用。
  3. 查看详细日志:使用sudo journalctl -u docker.service --no-pager -n 50查看Docker服务的详细日志,通常错误信息会直接指出问题所在,比如某个配置文件格式错误、存储驱动不兼容等。
  4. 端口冲突:如果Docker守护进程本身启动成功,但后续操作失败,检查是否有其他进程占用了Docker需要使用的端口(如2375, 2376)或网络接口。

6.2 拉取镜像速度慢或失败

问题现象docker pull命令卡住不动,或报错net/http: TLS handshake timeout

解决方法

  1. 确认镜像加速器配置:再次检查/etc/docker/daemon.json文件格式是否正确(JSON格式严格),加速器地址是否有效。可以多配置几个国内的镜像源。
  2. 使用阿里云ACR:如果拉取的是阿里云官方镜像,尝试直接使用阿里云ACR的地址拉取,速度通常最快。
  3. 网络诊断:尝试ping一下镜像仓库的域名,检查网络连通性。在公司内网环境下,可能需要配置代理。
  4. 手动下载与导入:在极端网络情况下,可以找一台能联网的机器,先拉取镜像,然后使用docker save导出为tar文件,再通过U盘或内网传输到目标机器,使用docker load导入。

6.3 容器启动后无法连接数据库

问题现象:容器状态为Up,但使用psql连接时超时或拒绝连接。

排查步骤

  1. 检查端口映射:确认docker run时指定的-p参数是否正确,宿主机端口是否被其他应用占用。使用sudo netstat -tlnp | grep 5432查看5432端口监听情况。
  2. 查看容器内部服务状态:进入容器 (docker exec -it polardb_pg bash),检查PostgreSQL进程是否存活 (ps aux | grep postgres),并查看数据库日志,通常位于/var/lib/postgresql/data/log目录下。日志会明确告知启动失败的原因,比如数据目录权限问题、配置错误等。
  3. 检查数据卷权限:这是一个高频问题。如果宿主机上的数据目录(如/home/kylin/polardb_data)权限设置不当(例如属主是root,而容器内postgres用户uid为999),会导致数据库无法写入。确保数据目录对容器内进程可写。一个简单粗暴的测试方法是临时给目录赋予777权限:sudo chmod -R 777 /home/kylin/polardb_data仅用于测试,生产环境需精细化配置)。如果这样能解决问题,说明就是权限问题。
  4. 检查防火墙:麒麟V10可能默认启用防火墙(firewalld)。如果配置了远程连接,需要放行数据库端口:sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent && sudo firewall-cmd --reload

6.4 容器内时间与宿主机不一致

问题现象:应用程序插入数据库的时间戳,与宿主机系统时间相差8小时或其他时区差。

原因与解决:Docker容器默认使用UTC时间,而宿主机可能是CST(中国标准时间)。可以在运行容器时,将宿主机的时区文件挂载到容器内:

docker run -d \ ...其他参数... -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ polardb/polardb_pg_local_instance:latest

这样,容器就会使用和宿主机相同的时区设置。对于数据库来说,确保时间一致对于日志分析和数据同步至关重要。

7. 性能调优与生产环境考量

如果你打算将这套用于开发测试的环境向生产环境靠拢,或者已经遇到了性能瓶颈,那么以下几个方面的调优是必须考虑的。

7.1 容器资源限制

默认情况下,容器可以无限制地使用宿主机的CPU和内存资源,这可能导致某个容器耗尽资源,影响宿主机和其他容器。使用docker run时,可以通过参数对容器资源进行限制:

docker run -d \ --name polardb_pg_prod \ --cpus=2 \ # 限制最多使用2个CPU核心 --memory=4g \ # 限制最多使用4GB内存 --memory-swap=4g \ # 限制交换分区使用(与内存等大,即不使用swap) ...其他参数... polardb/polardb_pg_local_instance:latest
  • --cpus:可以设置为小数,如1.5,表示1.5个CPU核心的计算能力。
  • --memory:硬性内存限制,容器使用超过此值会被系统OOM Killer终止。
  • --memory-swap:内存和交换分区的总限制。设置为-1表示不限制(危险),通常建议设置为和--memory相等,即禁用容器使用swap,因为数据库使用swap会导致性能急剧下降。

为PolarDB分配合适的资源,需要根据你的数据量、并发连接数和查询复杂度来评估。可以从一个适中的配置开始(如4核8G),通过监控逐步调整。

7.2 存储与I/O优化

数据库是I/O密集型应用,存储性能直接决定数据库性能。我们之前使用的-v挂载是本地目录,其性能取决于宿主机磁盘(HDD/SSD/NVMe)。

  1. 使用高性能存储:对于生产环境,强烈建议将数据目录挂载到SSD或NVMe磁盘上。在docker run-v参数中,指定SSD的挂载点即可。
  2. 考虑存储驱动:Docker的存储驱动(如overlay2)也会影响I/O性能。确保你的Docker使用overlay2驱动(目前默认且推荐)。可以通过docker info | grep Storage查看。
  3. 使用Docker卷(Volume):相比于绑定挂载(-v /host/path:/container/path),Docker管理的命名卷(Named Volume)在某些场景下性能和管理性更好。你可以先创建卷:docker volume create polardb_vol,然后运行容器时使用-v polardb_vol:/var/lib/postgresql/data

7.3 网络模式选择

我们之前使用的是默认的bridge(网桥)网络,并进行了端口映射。对于多个需要频繁通信的容器(例如,PolarDB数据库容器和它的读写分离代理容器),可以创建一个自定义的Docker网络,将它们加入同一个网络。这样容器间可以通过容器名直接通信,无需端口映射,延迟更低,也更安全。

# 创建自定义网络 docker network create polardb_network # 运行数据库容器,加入该网络,并指定一个网络别名 docker run -d \ --name polardb_pg \ --network polardb_network \ --network-alias db \ ...其他参数(可以去掉-p映射,因为外部不直接访问)... polardb/polardb_pg_local_instance:latest # 另一个应用容器也加入同一网络,它可以通过“db”这个主机名直接访问数据库 docker run -d \ --name my_app \ --network polardb_network \ -e DB_HOST=db \ my_app_image

7.4 监控与日志管理

生产环境必须要有监控。对于容器化的PolarDB,监控可以分为两个层面:

  1. 容器资源监控:使用docker stats polardb_pg可以实时查看容器的CPU、内存、网络I/O和磁盘I/O使用情况。对于长期监控,可以集成Prometheus + cAdvisor + Grafana的方案。
  2. 数据库内部监控:连接数据库,查询pg_stat_activitypg_stat_database等系统视图,了解连接数、慢查询、锁等待等情况。PolarDB可能还提供一些特有的监控视图。

日志方面,除了使用docker logs查看容器标准输出,更重要的是管理数据库自身产生的日志文件(位于数据卷的log目录)。需要配置日志轮转(log rotation),避免日志文件无限增大占满磁盘。可以在宿主机上使用logrotate工具,或者通过配置PostgreSQL的logging_collectorlog_rotation_age等参数来实现。

在麒麟V10这类国产化平台上完成这一整套部署,最关键的是理解每个步骤背后的原理,遇到问题时能清晰地定位是系统层、Docker层还是数据库层的问题。从拉取镜像到生产级调优,每一步的选择都围绕着稳定性、性能和数据安全展开。尤其是数据持久化卷和资源限制,是测试环境转向生产环境时必须加固的两个环节。多动手实践,多查看日志,这个过程中积累的经验,远比单纯成功启动一个容器有价值得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询