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 环境变量逐项验证、插件与主题挂载、运维命令与常见问题。

AdminerAdminer数据库客户端2026/10/20

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,digest sha256: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 / standalonestandalonephp -S [::]:8080 -t /var/www/html174 MB独立容器直接对外服务(默认选择)
6.1.2-fastcgi / 6-fastcgi / fastcgifastcgiphp-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)。

三、前置条件

  1. Docker 环境(含 compose 插件):
docker --version && docker compose version

实测回显:

Docker version 25.0.5, build 5dc9bcc
Docker Compose version v2.29.0
  1. 规划一个自定义网络给 Adminer 与数据库容器互联(内置 DNS 按容器名解析,比 --link 与写死 IP 都可靠):
docker network create --subnet 10.89.58.0/24 adminer-net

实测回显:

64e0f3946b8f4577450d3f6ce1f1e6b0e35c11e197d5da75cbf9577293ff1e712

(网络 ID 随环境不同,创建成功即可;若提示已存在直接复用。)

  1. 准备好被管理的数据库容器。本篇沿用两台既有数据库(在同一网络内,主机名 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(容器入口,实查源码)做了三件事:

  1. 定义 adminer_object():收集 plugins-enabled/*.php 返回的插件实例,组装成 Adminer\Plugins 聚合对象传给 adminer.php;
  2. 注入 DefaultServerPlugin:把 ADMINER_DEFAULT_SERVER 的值预填进登录表单「服务器」字段;
  3. 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 等)。

十二、参考链接

  1. Docker Hub 官方镜像页(library/adminer):https://hub.docker.com/_/adminer
  2. 镜像 Dockerfile 仓库(TimWolla/docker-adminer):https://github.com/TimWolla/docker-adminer
  3. Adminer 官网:https://www.adminer.org/
  4. Adminer 源码仓库:https://github.com/vrana/adminer
  5. 站内配套文档:《Adminer 6.1.2 介绍与选型指南》(选型与引擎清单)、《Ubuntu 22.04 安装 Adminer 6.1.2 指南》(原生部署)、《Adminer 6.1.2 配置与插件详解》(插件体系与安全加固)