Adminer 6.1.2 Docker 部署指南
使用官方 Docker 镜像部署 Adminer 6.1.2:standalone(PHP 内置服务器 8080)与 fastcgi(php-fpm 9000)两种镜像形态实查与选型,docker run 单容器、与 MySQL/PostgreSQL 同网络互联、Docker Compose 编排三种部署路径全实测,覆盖 ADMINER_DEFAULT_SERVER/ADMINER_PLUGINS/ADMINER_DESIGN 环境变量逐项验证、插件与主题挂载、运维命令与常见问题。
Adminer 6.1.2 Docker 部署指南
目标:用官方 Docker 镜像(library/adminer)部署 Adminer 6.1.2 数据库管理工具,覆盖 standalone 与 fastcgi 两种镜像形态的选型、单容器与数据库同网络部署、Docker Compose 编排、环境变量配置、插件与主题挂载及日常运维。本篇所有命令与回显均在 Docker 25 环境实测通过。
一、环境信息
本篇实测环境与软件版本如下:
- 宿主操作系统:Ubuntu 22.04.5 LTS(x86_64),Docker 25(含 compose 插件)
- Adminer 镜像:
adminer:6.1.2(官方 library 镜像,2026-10-15 更新,174 MB,digestsha256:49a7d30e71de97fb18933ffe7d46cc2b343c49fd7a63a7791c8be2548eb65115) - 镜像内运行时:PHP 8.4.26;standalone 变体由
php -S [::]:8080 -t /var/www/html提供服务 - 被管理数据库 A:PostgreSQL 16(容器
adminer-pg-16,主机名 pg1,端口 5432) - 被管理数据库 B:MySQL 8.0.46(容器
adminer-mysql-80,主机名 mysql1,端口 3306) - 自定义网络:
adminer-net(bridge,10.89.58.0/24,含网关 10.89.58.1) - 端口规划:Adminer Web 8080 映射宿主 8131(docker run 形态)与 8133(compose 形态);MySQL 映射宿主 8128;PostgreSQL 映射宿主 8129
💡 说明:Adminer 容器本身无状态,真正要「持久化」的是它管理的数据库——数据库容器/服务的数据卷规划见各数据库部署文档;本篇聚焦 Adminer 自身的部署与配置。
二、镜像选型说明
官方镜像由 Docker Official Images 项目维护(维护者 Tim Düsterhus,Dockerfile 仓库 TimWolla/docker-adminer,Docker Hub 页面 library/adminer)。tag 矩阵(Docker Hub 官方说明 + 实拉验证,查询日期 2026-10-20):
| Tag | 变体 | 进程入口 | 镜像大小 | 适用场景 |
|---|---|---|---|---|
6.1.2 / 6 / latest / 6.1.2-standalone / standalone | standalone | php -S [::]:8080 -t /var/www/html | 174 MB | 独立容器直接对外服务(默认选择) |
6.1.2-fastcgi / 6-fastcgi / fastcgi | fastcgi | php-fpm(9000 端口) | 148 MB | 已有 Nginx/Apache,经 FastCGI 反代 |
5.5.1 / 5 / 5.5.1-standalone / 5.5.1-fastcgi | 旧版本线 | 同上 | — | 兼容老 PHP 环境场景,新部署不建议 |
选型解读:绝大多数场景选 adminer:6.1.2(standalone),容器自己就是完整 Web 服务;只有当你已有一台 Nginx/Apache 想统一收口 HTTPS 与访问控制时才选 fastcgi 变体(注意把 9000 端口放在内网,不要暴露公网)。镜像支持 amd64/arm64v8/arm32v7/i386/ppc64le/riscv64/s390x 等多架构。
镜像内关键文件(docker exec 实查):
/var/www/html/
├── adminer.php # Adminer 6.1.2 单文件(569128 字节,与官网发布物一致)
├── index.php # 容器入口:加载 plugins-enabled/*.php 后引入 adminer.php
├── plugin-loader.php # 插件启用文件生成器(CLI 工具)
├── plugins/ # 官方内置插件 51 个 + drivers/ 扩展驱动 8 个
└── designs/ # 官方主题 28 套(nette、dracula、adminer-dark 等)
镜像内置 PHP 扩展(实查):mysqli、pdo_pgsql、pdo_dblib(MS SQL)、pdo_odbc、opcache、sodium。官方文档声明开箱即用的驱动为 MySQL、PostgreSQL、SQLite、SimpleDB、Elasticsearch;Oracle/Firebird/MongoDB 需要自行在镜像上叠加扩展(见第十一章 FAQ Q5)。
三、前置条件
- Docker 环境(含 compose 插件):
docker --version && docker compose version
实测回显:
Docker version 25.0.5, build 5dc9bcc
Docker Compose version v2.29.0
- 规划一个自定义网络给 Adminer 与数据库容器互联(内置 DNS 按容器名解析,比
--link与写死 IP 都可靠):
docker network create --subnet 10.89.58.0/24 adminer-net
实测回显:
64e0f3946b8f4577450d3f6ce1f1e6b0e35c11e197d5da75cbf9577293ff1e712
(网络 ID 随环境不同,创建成功即可;若提示已存在直接复用。)
- 准备好被管理的数据库容器。本篇沿用两台既有数据库(在同一网络内,主机名 pg1 与 mysql1):
docker run -d --name adminer-pg-16 --network adminer-net --hostname pg1 \
-e POSTGRES_PASSWORD=q1w2e3r4 -p 8129:5432 postgres:16
docker run -d --name adminer-mysql-80 --network adminer-net --hostname mysql1 \
-e MYSQL_ROOT_PASSWORD=q1w2e3r4 -p 8128:3306 mysql:8.0
💡 技术拓展:容器间互联的常用方式对比——
方式 原理 建议 user-defined bridge + 容器名 自定义网络内置 DNS,按名字解析 本篇采用,名字稳定、IP 变化无影响 --link旧式链接往 hosts 文件写映射 已过时,不推荐 host 网络直接连宿主端口 共享宿主网络栈 端口易冲突,隔离性差 写死容器 IP 固定分配的 IP 重启易变,禁止
四、部署步骤
4.1 最小部署(单容器 + docker run)
docker run -d --name adminer-612-docker --network adminer-net -p 8131:8080 adminer:6.1.2
实测回显:
0a089af690a90cd59a9cdc1d4162d9af039e4144e9a0a7156f9ea790ce3d5fa1
验证登录页:
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://localhost:8131/
curl -s http://localhost:8131/ | grep -oE '<title>[^<]+</title>'
实测回显:
HTTP 200
<title>Login - Adminer</title>
浏览器访问 http://<宿主IP>:8131/ 即进入登录页。
4.2 登录同网络数据库实测
容器名即数据库主机名(同在 adminer-net 内)。在登录页填写:系统 = MySQL,服务器 = mysql1,用户名 = root,密码 = q1w2e3r4,数据库 = shop,登录后页面标题(实测):
Database: shop - mysql1 - Adminer
PostgreSQL 同理(系统 = PostgreSQL,服务器 = pg1,账号 postgres/q1w2e3r4,库 postgres),登录成功标题为 Schema: public - pg1 - Adminer。SQL 查询、建表、导出等操作与《Ubuntu 22.04 安装 Adminer 6.1.2 指南》4.7 节完全一致,不再重复。
⚠️ 注意:数据库容器口令直接写在
docker run/compose 里仅适合演示环境;生产请用 Docker secrets 或密钥管理服务注入。
4.3 Docker Compose 编排部署
生产推荐用 compose 固化拓扑。创建项目目录与 compose.yaml(本篇实测时宿主 8128/8131 已被前面步骤的容器占用,故 compose 形态使用 8133 宿主端口与独立网段 10.89.59.0/24):
services:
adminer:
image: adminer:6.1.2
container_name: adminer-612-compose
restart: unless-stopped
ports:
- "8133:8080"
environment:
ADMINER_DEFAULT_SERVER: mysql1
networks:
- adminer-net
db:
image: mysql:8.0
container_name: adminer-mysql-compose
restart: unless-stopped
hostname: mysql1
environment:
MYSQL_ROOT_PASSWORD: q1w2e3r4
MYSQL_DATABASE: shop
volumes:
- ./mysql-data:/var/lib/mysql
networks:
- adminer-net
networks:
adminer-net:
driver: bridge
ipam:
config:
- subnet: 10.89.59.0/24
启动并验证:
docker compose up -d && docker compose ps
实测回显(输出节选,实测首尾):
Container adminer-mysql-compose Created
Container adminer-mysql-compose Starting
Container adminer-612-compose Starting
Container adminer-mysql-compose Started
Container adminer-612-compose Started
NAME IMAGE STATUS PORTS
adminer-612-compose adminer:6.1.2 Up Less than a second 0.0.0.0:8133->8080/tcp, [::]:8133->8080/tcp
adminer-mysql-compose mysql:8.0 Up Less than a second 3306/tcp, 33060/tcp
curl -s http://localhost:8133/ | grep -oE "name='auth\[server\]' value='[^']*'"
实测回显(ADMINER_DEFAULT_SERVER 预填生效):
name='auth[server]' value='mysql1'
4.4 fastcgi 变体部署(已有 Nginx 时)
docker run -d --name adminer-612-fpm --network adminer-net adminer:6.1.2-fastcgi
该变体内只跑 php-fpm(9000 端口),由外部 Nginx 提供 HTTP 与 HTTPS,站点配置要点:
location / {
fastcgi_pass adminer-612-fpm:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/html/index.php;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
⚠️ 注意:FastCGI 端口不应对公网暴露,官方文档明确要求加防火墙规则或仅走私有网络(本例容器只在 adminer-net 内,未映射宿主端口)。
五、数据持久化说明
Adminer 是无状态应用:登录态存 PHP 会话(进程内存,standalone 单进程下重启即失效)、无本地数据库、站点文件只读。容器重建不产生任何数据损失,因此不需要数据卷做持久化。
需要挂载宿主目录的只有两类配置性内容:
| 宿主路径 | 容器路径 | 用途 |
|---|---|---|
| ./plugins-enabled/ | /var/www/html/plugins-enabled/ | 启用插件(见 4.5 与第八章) |
| ./adminer.css | /var/www/html/adminer.css | 自定义主题覆盖 |
六、环境变量表
官方镜像支持三个环境变量(Docker Hub 官方文档 + 本篇逐项实测):
| 环境变量 | 作用 | 实测结果 |
|---|---|---|
ADMINER_DEFAULT_SERVER | 预填登录页「服务器」字段 | 传 mysql1 后登录页输出 name='auth[server]' value='mysql1' ✔ |
ADMINER_PLUGINS | 自动启用无参插件,值为插件文件名列表(空格分隔,不带 .php 后缀) | 传 dump-date 后自动生成 plugins-enabled/001-dump-date.php ✔ |
ADMINER_DESIGN | 启用内置主题,值为 designs/ 目录下的主题名 | 传 nette 后页面加载 adminer.css?v=462079817 覆盖样式 ✔ |
三变量联合启动示例(实测通过):
docker run -d --name adminer-612-docker --network adminer-net \
-e ADMINER_DEFAULT_SERVER=mysql1 \
-e ADMINER_PLUGINS='dump-date' \
-e ADMINER_DESIGN='nette' \
-p 8131:8080 adminer:6.1.2
💡 说明:
ADMINER_PLUGINS只适用于构造函数无必填参数的插件;带必填参数的插件(如login-servers需要服务器清单)必须走「自定义启用文件」方式,容器启动时会拒绝并打印错误与文件模板(实测见第八章)。
七、配置参数说明
7.1 端口与进程
- standalone 变体:容器内监听
[::]:8080(IPv6 全地址,IPv4 亦可访问),由 PHP 内置服务器提供单进程 HTTP 服务。官方镜像用它替代完整 Apache 是为把镜像压到 174 MB;个人/小团队管理入口负载下完全够用,高并发管理场景属例外。 - fastcgi 变体:容器内
php-fpm监听 9000,HTTP 层完全交给外部 Web 服务器,适合要统一 HTTPS/访问控制的既有环境。
7.2 镜像内入口文件机制
index.php(容器入口,实查源码)做了三件事:
- 定义
adminer_object():收集plugins-enabled/*.php返回的插件实例,组装成Adminer\Plugins聚合对象传给 adminer.php; - 注入
DefaultServerPlugin:把ADMINER_DEFAULT_SERVER的值预填进登录表单「服务器」字段; require('adminer.php')启动应用,并在请求adminer.css时输出容器根目录的同名文件(自定义主题的挂载点)。
理解这个机制后,所有进阶定制(插件、主题、默认服务器)都能对号入座——都发生在 index.php 组装阶段,不需要改动 adminer.php 本体。
八、配置文件挂载
8.1 挂载自定义插件启用文件(带参插件标准做法)
以 login-ip(IP 白名单)为例,它需要传入白名单参数,ADMINER_PLUGINS 无法表达。做法:宿主建目录写启用文件,挂载进容器:
mkdir -p ./plugins-enabled
cat > ./plugins-enabled/login-ip.php <<'EOF'
<?php
require_once('plugins/login-ip.php');
return new AdminerLoginIp(array('127.', '::1', '::ffff:10.89.58.'));
EOF
docker run -d --name adminer-612-docker --network adminer-net \
-v "$(pwd)/plugins-enabled:/var/www/html/plugins-enabled:ro" \
-p 8131:8080 adminer:6.1.2
启用文件模板不需要手写:容器内自带生成器 plugin-loader.php,对无参插件直接输出模板,对带参插件打印报错与完整模板(实测):
docker exec adminer-612-docker php plugin-loader.php dump-date
实测回显:
<?php
require_once('plugins/dump-date.php');
return new AdminerDumpDate();
把输出重定向为 plugins-enabled/<名字>.php 即完成启用;带参插件按报错提示的模板填入实参。login-ip 的白名单匹配实测与陷阱(::ffff: IPv4 映射前缀)详见《Adminer 6.1.2 配置与插件详解》。
8.2 挂载自定义主题
echo "/* 覆盖默认主题 */ .adminer { font-size: 14px; }" > ./adminer.css
docker run -d --name adminer-612-docker --network adminer-net \
-v "$(pwd)/adminer.css:/var/www/html/adminer.css:ro" \
-p 8131:8080 adminer:6.1.2
生效验证(页面出现 adminer.css 引用即成功,实测同 6 章的主题加载行为)。
九、等价 docker run
compose 定义与手工命令的等价关系(便于脚本化):
docker run -d \
--name adminer-612-docker \
--restart unless-stopped \
--network adminer-net \
-e ADMINER_DEFAULT_SERVER=mysql1 \
-p 8131:8080 \
adminer:6.1.2
💡 说明:compose 相比手写命令多了
restart: unless-stopped(宿主重启后自动拉起)与声明式网络/数据卷管理,生产环境建议始终用 compose。
十、常用运维命令
docker ps --filter name=adminer-612-docker # 查看容器状态
docker logs --tail 50 adminer-612-docker # 查看访问与错误日志
docker stats --no-stream adminer-612-docker # 资源占用快照
docker restart adminer-612-docker # 重启(换环境变量/更新挂载后)
docker exec adminer-612-docker php -v # 进入查看 PHP 版本
docker compose pull && docker compose up -d # compose 形态升级镜像
docker logs 实测(standalone 的访问日志即 PHP 内置服务器输出,compose 形态容器 adminer-612-compose):
[Mon Oct 19 19:14:25 2026] PHP 8.4.26 Development Server (http://[::]:8080) started
[Mon Oct 19 19:14:38 2026] [::ffff:10.89.59.1]:60452 Accepted
[Mon Oct 19 19:14:38 2026] [::ffff:10.89.59.1]:60452 [200]: GET /
[Mon Oct 19 19:14:38 2026] [::ffff:10.89.59.1]:60452 Closing
💡 说明:日志里的客户端地址
::ffff:10.89.59.1是 Docker 网桥网关经 IPv4 映射后的形式——经端口映射进来的访问都会显示为网关 IP,这正是第八章 IP 白名单插件要用::ffff:前缀的原因。
升级注意:Adminer 镜像升级 = 换 tag 重建容器(docker rm -f 后按新 tag docker run,compose 用 up -d 自动重建),无数据迁移;5.x → 6.x 建议先在测试库过一遍操作习惯(6.x UI 有改版)。
十一、常见问题(FAQ)
Q1:访问 8131 端口返回连接拒绝?
按序排查:docker ps 确认容器 Up 且端口映射 0.0.0.0:8131->8080;docker logs --tail 20 adminer-612-docker 看进程是否启动;宿主防火墙放行 8131。
Q2:登录页「服务器」字段填什么?
同 Docker 网络内填容器名/主机名(如 mysql1、pg1);连宿主机上的数据库填 host.docker.internal(Linux 需在 run 时加 --add-host=host.docker.internal:host-gateway)或宿主在 docker 网桥上的网关 IP。
Q3:设置 ADMINER_PLUGINS='login-servers' 启动失败?
带必填参数的插件不能走该变量。实测回显:
Unable to load plugin file "login-servers", because it has required parameters: servers
Create a file "/var/www/html/plugins-enabled/login-servers.php" with the following contents to load the plugin:
...
return new AdminerLoginServers(
$servers = ???,
$driver = 'server'
);
按提示把 ??? 换成实际参数写成启用文件,挂载 plugins-enabled/ 目录即可(8.1 节做法)。
Q4:MySQL 容器明明在跑,Adminer 报连不上?
最常见是两者不在同一网络。docker network inspect adminer-net 核对两个容器都在其中;其次核对数据库容器就绪状态(MySQL 首次初始化要数十秒,docker logs adminer-mysql-80 出现 ready for connections 再登录)。
Q5:需要管理 MongoDB/Oracle/MS SQL 怎么办?
镜像内置了 MS SQL 的 pdo_dblib 扩展,可直接用;MongoDB(mongodb 扩展)、Oracle(oci8)、Firebird(interbase)需基于官方镜像加装扩展:写一个极简 Dockerfile FROM adminer:6.1.2 后安装对应扩展并 docker build,插件驱动文件已在镜像 plugins/drivers/ 内(mongo.php/elastic.php/redis.php 等)。
十二、参考链接
- Docker Hub 官方镜像页(library/adminer):https://hub.docker.com/_/adminer
- 镜像 Dockerfile 仓库(TimWolla/docker-adminer):https://github.com/TimWolla/docker-adminer
- Adminer 官网:https://www.adminer.org/
- Adminer 源码仓库:https://github.com/vrana/adminer
- 站内配套文档:《Adminer 6.1.2 介绍与选型指南》(选型与引擎清单)、《Ubuntu 22.04 安装 Adminer 6.1.2 指南》(原生部署)、《Adminer 6.1.2 配置与插件详解》(插件体系与安全加固)