资讯动态

Docker部署phpipam:开源IPAM工具实现高效IP地址管理

发布时间:2026/10/13 7:42:31 来源:尧图企业网站定制
干了这么多年网络运维IP地址管理一直是个头疼事。子网越分越细设备一多Excel表格根本扛不住。后来接触了phpipam这个开源IPAM工具算是彻底把这块理顺了。它不光能管IPv4/IPv6地址池还能管VLAN、VRF、域和DNS配合Docker部署十来分钟就能跑起来一套可用的系统。这篇就是我把自己的部署流程重新整理了一遍适合所有运维、网管和正在做网络自动化改造的朋友跟着走一遍基本不会踩坑。1. 为什么用Docker部署phpipam先把方案想清楚1.1 LNMP手搓部署的痛点早年部署phpipam都是走LNMP路线装Nginx、装PHP、装数据库、再手动改配置文件。听着不算难真做起来全是坑。phpipam对PHP版本有要求旧版跑在PHP 5.x上新版需要PHP 7.4以上不同版本之间的依赖还不太一样。数据库也一样MySQL和MariaDB的兼容性差异会导致安装向导直接报错。最难受的是迁移和升级。phpipam升级要替换代码文件、跑数据库更新脚本、改配置中间哪一步没对齐版本一升级就白屏。换一台机器更是要重新走一遍编译安装流程耗时又容易出错。这种能跑但不敢动的状态对需要长期维护的网络系统来说非常不友好。1.2 容器化部署的收益Docker化之后phpipam的ApachePHP环境全被打进镜像里底层Web服务不用管了我们只需要关心数据库容器和应用容器两个编排单元。第一次部署从装依赖到页面打开熟练的话十分钟以内。升级就更直接拉一个新镜像、重建容器数据和配置因为做了持久化不会丢回滚也方便保留旧镜像随时能退回去。这个思路放到IPAM场景里特别合适。IPAM本身是基础设施工具追求稳定和可复现而不是天天折腾部署方式。Docker把环境差异全部封起来开发环境、测试环境、生产环境跑的是同一个镜像组合出问题的概率自然就低很多。1.3 镜像选型官方镜像、数据库版本怎么选部署方案里最大的抉择就是用什么镜像。phpipam官方在镜像仓库维护了phpipam-www和phpipam-init两个镜像前者是Web应用主体后者负责初始化数据库。直接用官方镜像最省事跟着官方版本走补丁和修复都能第一时间同步到。数据库这边我的建议是选MariaDB而不是MySQL 8.x。phpipam对MySQL 8的兼容性虽然逐步在改善但MySQL 8默认的caching_sha2_password认证插件和PHP旧版驱动之间经常出问题需要额外指定认证插件才能连上属于白踩坑。MariaDB完全兼容MySQL协议轻量而且省心容器化场景下性能差异也不明显。2. 部署前的环境准备目录、端口与依赖2.1 宿主机要求和端口规划phpipam对宿主机的要求不高我拿2核4G的云主机跑过带几百个C段地址消耗完全够。操作系统不限Ubuntu和CentOS类的都可以只要内核支持Docker就行。端口方面phpipam官方镜像默认监听80端口宿主机如果已经有Nginx这类服务占用80就把容器映射到8000或者别的端口。我的习惯是先用8000映射跑起来验证完功能以后再在Nginx层做域名反代统一走443入口。这样应用层环境和服务器的其他Web服务是隔离的不用因为端口冲突折腾一通。2.2 安装Docker与Compose如果宿主机还没装Docker直接装Docker Engine和Compose插件就可以。Ubuntu用apt装docker.io一般会带docker compose命令CentOS这边用dnf装docker-ce再单独装docker-compose-plugin。装完确认一下版本docker --version docker compose version这套流程里我用的是Compose来做编排。虽然也能用一行docker run把两个容器分别起起来但Compose的好处是把数据库连接、环境变量、目录挂载、重启策略全部写在一个文件里后续任何人拿到这份文件都能复现出一模一样的部署环境这才是快速部署真正的含义。2.3 规划数据和配置文件目录持久化是Docker部署里最容易被忽略的点。phpipam有两部分数据必须保存数据库文件以及Web应用生成的配置文件。数据库文件由数据库容器管理配置文件则是安装向导结束后写入Web容器里的config.php。如果只是把数据库目录做持久化而不管Web配置目录数据库还在配置丢了容器重建以后照样要重新跑安装向导等于白干。我的目录规划是这样/opt/phpipam/ ├── www/ # Web配置目录 └── db/ # 数据库数据目录两个目录都映射到宿主机权限不用额外改容器启动时会自己处理。这个规划的好处是备份太方便了把整个/opt/phpipam目录打包走到哪儿都能还原。2.4 版本选择说明镜像tag建议直接用latest官方latest指向当前稳定版本。数据库镜像我用mariadb:10.8这个版本比较稳兼容性也好。如果你非要上MySQL建议指定mysql:5.7而不是mysql:8.0原因前面已经说过了MySQL 8的认证方式对phpipam的PHP环境不太友好没必要给自己找麻烦。3. 完整部署流程从docker-compose到首次登录3.1 编写docker-compose.yml我直接贴一份完整可用的编排文件这个文件是我在实际环境中验证过的可以直接抄作业services: phpipam-db: image: mariadb:10.8 container_name: phpipam-db environment: MYSQL_ROOT_PASSWORD: your-strong-password MYSQL_DATABASE: phpipam volumes: - /opt/phpipam/db:/var/lib/mysql restart: unless-stopped phpipam-web: image: phpipam/phpipam-www:latest container_name: phpipam-web ports: - 8000:80 environment: TZ: Asia/Shanghai IPAM_DB_HOST: phpipam-db IPAM_DB_PASS: your-strong-password IPAM_DB_NAME: phpipam volumes: - /opt/phpipam/www:/app depends_on: - phpipam-db restart: unless-stopped几个关键点解释一下IPAM_DB_HOST要填phpipam-db这是Compose网络里的服务名不要填localhost。填localhost的话Web容器会去连自己容器内部的数据库结果就是连接失败。IPAM_DB_PASS要和数据库容器的MYSQL_ROOT_PASSWORD保持一致这是整个配置最要命的地方两个值对不上安装向导一步都走不下去。Web容器的工作目录新版是/app所以我把/opt/phpipam/www映射到/app。如果你用的是老版本镜像内部路径可能是/var/www/html映射目标要跟着改否则配置文件写不进宿主机目录重建容器就丢配置。3.2 启动、检查、日志观察文件保存为docker-compose.yml后在同一个目录下执行docker compose up -d参数-d是后台运行。第一次启动会拉取镜像Mariadb镜像大概一两百兆phpipam镜像两三百兆网速正常的话两三分钟就能拉完。启动完先看容器状态docker compose ps两个容器的状态都显示Up基本上就成功了一半。然后再看一眼Web容器的日志docker compose logs phpipam-web -f正常日志里能看到Apache和PHP-FPM启动的相关信息。如果这里报数据库连接错误不用急多半是环境变量的问题先去把两个密码对上再重启Web容器。3.3 Web安装向导填写说明容器起来以后打开浏览器访问http://宿主机IP:8000。第一次访问会自动跳转到install目录进入安装界面。这个步骤虽然简单但有几个字段很容易填错数据库主机填phpipam-db不是localhost也不是宿主机IP因为Web容器和数据库容器在同一张Docker网络里服务名才是正确的寻址方式。MySQL管理用户名默认是root密码就是compose文件里MYSQL_ROOT_PASSWORD设置的密码。MySQL主机名和数据库名保持phpipam。填完点安装页面会跑一堆数据库初始化动作几十秒后显示安装完成。注意安装完成之后一定要到Web容器里把/var/www/html/install目录删掉或者改个名。这个目录是安装向导程序的入口不处理掉的话系统会保留二次运行的入口存在安全隐患也容易误触发重新初始化。3.4 首次登录与初始化配置安装完成后返回到登录页phpipam默认管理员账号是Admin默认密码是ipamadmin。进去以后第一件事就是改管理员密码这没什么好说的基础设施类工具永远不要沿用默认口令。然后建议做两件初始化配置第一把界面语言切换成中文在用户设置里改掉日常使用效率会高很多第二把时区确认一下虽然容器已经设置了TZ环境变量但phpipam应用层也会读自己的时区配置因为我们的环境变量已经控制住了基本不会再出现时间差8小时的问题。接下来创建一个日常使用的管理员账号不要所有人都拿Admin干活。Admin账号作为维护入口留在那里普通运维账号按需分配权限这样审计日志里才能分清谁做了什么操作。4. 部署后的维护实战备份恢复、升级与安全加固4.1 备份恢复数据库和配置文件同样重要phpipam的所有数据都放在数据库里IP段信息、子网划分、地址分配记录、VLAN配置全在里面。所以备份的核心就是数据库备份。我在宿主机上是这样做的docker compose exec phpipam-db mysqldump -uroot -p密码 phpipam /opt/phpipam/backup/phpipam_$(date %F).sql加了Linux的crontab每天凌晨跑一次保留最近30天的备份文件。别光备份数据库/opt/phpipam/www目录里的config.php也得一起备份。数据库恢复了但配置文件丢了phpipam也不知道该连哪个数据库还得重新走一遍安装向导麻烦得很。所以我把整个/opt/phpipam目录作为备份单元一张tar包解决tar czf phpipam_backup_$(date %F).tar.gz -C /opt phpipam恢复的时候更简单先把容器停掉把备份的数据库文件导回到数据目录再恢复配置文件然后重新启动容器整个服务状态就和备份时一模一样。4.2 镜像升级先备份再重建phpipam官方更新频率在活跃期不算低功能迭代和安全修复都有。升级流程是稳妥第一先做一次完整备份然后拉新镜像docker compose pull docker compose up -dCompose会对比镜像是否变化有更新就重建对应容器。重建过程中数据库容器如果没换镜像一般不会重启数据不受影响Web容器重建后配合挂载的配置文件服务会自动恢复。升级完之后去后台跑一次系统检查看看有没有需要执行的数据库更新脚本有就点一下升级整个升级过程就结束了。如果升级完发现有问题回滚也简单把compose文件里Web镜像的tag指回旧版本或者干脆用之前跑着的镜像tag重新up数据不受影响服务就回去了。这套机制就是容器化最大的好处放在以前想回滚一次LNMP升级工程量巨大。4.3 安全加固三个必做动作第一件强制修改所有账号的初始密码包括数据库root密码和phpipam管理账号密码。数据库root密码在生产环境尤其重要因为web容器是拿root连数据库的密码一旦泄露整个地址池数据就会被拖走。第二件把Web端口收回到内部。现在是8000直接暴露在宿主机上如果你有边缘防火墙把8000限制成只允许内网访问外部用户通过Nginx反代统一走443。Nginx里把代理请求转发给容器的8000端口再配一套证书就好了。这样既不用改容器配置又实现了HTTPS加密访问。第三件禁用install目录。前面说过安装完成后要删掉这里再强调一次有些人在容器里删了但容器一重建install目录又从镜像里恢复了所以最佳方式是在挂载目录里确认install目录不存在因为挂载目录会覆盖镜像原始目录这样重建多少次都不会再出现。4.4 常用维护命令速查日常巡检最常用的命令就这几个# 查看服务状态 docker compose ps # 查看Web容器日志 docker compose logs -f phpipam-web # 重启Web容器 docker compose restart phpipam-web # 进入容器调试 docker compose exec phpipam-web sh # 查看数据库数据目录大小 du -sh /opt/phpipam/db注意restart命令只是重启容器不会重新读取compose文件的配置修改。要是改了端口、环境变量这类配置得用up -d重建容器才能生效。这个坑我踩过一次改完端口重启半天不生效最后才发现是没用对命令。5. 常见问题排查与避坑实录5.1 页面打不开或一直转圈容器状态明明正常但浏览器访问8000端口就是打不开先确认防火墙和安全组是不是放通了端口。云主机的话要去控制台看安全组规则本地机器要检查firewalld或者iptables。还有一种情况是端口被占用了docker compose启动时报错会提示端口冲突把映射端口换一个就行。如果页面能打开但一直是加载状态多半是容器内PHP执行卡住了看Web容器日志如果有内存不足类的错误就检查宿主机可用内存。phpipam本身不占资源但有几十万条IP记录时页面查询会吃一点内存给容器加上内存限制反而会触发异常建议让容器默认调度即可。5.2 数据库连接失败的四类原因数据库连接失败是部署中最常见的问题飞出的报错基本是Unable to connect to database或类似的提示。我总结了一下四类原因最常见第一类IPAM_DB_HOST写错填了localhost。在容器场景里localhost只指向容器自己必须填Compose服务名phpipam-db。第二类密码不对。IPAM_DB_PASS和MYSQL_ROOT_PASSWORD不一致把两个值改成一样就能解决。改完以后要重新跑Compose配置纯restart不生效。第三类数据库容器没起来。查看phpipam-db容器日志如果MYSQL_ROOT_PASSWORD为空或者初始化的数据目录已经有残留数据但密码不匹配数据库会拒绝启动。把挂载的/opt/phpipam/db目录清空再重建就能重新初始化。第四类数据库版本认证方式问题。如果你用了MySQL 8.0PHP驱动连不上caching_sha2_password认证要么换MariaDB要么给MySQL容器加启动参数指定mysql_native_password。5.3 容器重建后数据丢失这是典型的持久化没做全。很多教程只让挂载数据库目录却忽略了Web配置目录。数据库好了配置丢了重新进install目录向导又让你从头填一遍不知道的话还以为数据没了。正确做法就是前面说的两个目录都挂载出来。检查一下当前挂载配置如果Web容器没挂/opt/phpipam/www改完compose文件重建一下容器以后就不会再发生这种事了。5.4 时区显示异常部署完打开phpipam发现时间记录和本地时间差了几个小时十有八九是TZ环境变量没设置。容器默认时区是UTC直接加TZ: Asia/Shanghai到Web容器的environment里然后重建容器。phpipam的Web界面时区设置也最好配合改成Asia/Shanghai两层一致才不会有跳变。5.5 问题排查速查表症状常见原因处理动作页面无法访问安全组/防火墙未放行端口检查宿主机防火墙和云安全组规则安装向导数据库连不上DB_HOST/密码错误确认服务名和密码一致后重建容器页面一直转圈PHP执行异常或内存不足查看phpipam-web日志检查宿主机内存重建容器后要求重新安装Web配置目录未持久化挂载/opt/phpipam/www到/app并重建日志时间差8小时容器时区未设置添加TZAsia/Shanghai并重建容器数据库容器反复启动失败数据目录残留或密码不一致备份后清空数据库目录重新初始化页面报权限错误挂载目录权限异常检查宿主机目录属主和权限位6. 一点使用心得这套部署方式我用了很长时间最大的体会就是快速部署的底气不是命令背得熟而是方案里把该存的数据都存住了把会变的配置都写清楚了。phpipamDocker这套组合真正让我省心的是可复现性一份compose文件加上两个目录走到哪儿都能把环境拉起来再也不用担心哪台机器上的PHP包改了导致系统跑不动。最后分享一个小技巧phpipam容器跑起来以后建议顺手把登录页上显示默认密码的提示关掉。这个提示在系统设置里能关关掉之后就不会每次登录都提醒一遍也更安全。另外一个容易被忽略的点是phpipam支持API接口部署完成以后可以去后台把API模块启用后面做CMDB同步、设备自动发现都有现成通道不用再手工导来导去。如果你正在搭建网络自动化体系这套Docker化的phpipam可以当作一个很好的起点。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑