You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose配置:实现Nginx+PHPMyAdmin独立主机名访问

实现独立主机名访问PHPMyAdmin的配置指南

让我们一步步调整你的配置,搞定用database.example.com访问phpMyAdmin的需求:

1. 修正Docker Compose配置

首先调整docker-compose.yml里的几个关键问题:

  • PHP服务需要加入my-network网络,这样Nginx容器才能访问到PHP-FPM服务
  • 移除phpMyAdmin的端口映射(不需要直接暴露给主机,Nginx反向代理即可)
  • 修复Nginx容器的环境变量替换命令,避免配置生成失败

修改后的完整docker-compose.yml如下:

version: '3'
services:
  web:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - "./etc/nginx/default.conf:/etc/nginx/conf.d/default.conf"
      - "./etc/ssl:/etc/ssl"
      - "./repo:/var/www/html"
      - "./etc/nginx/default.template.conf:/etc/nginx/conf.d/default.template"
    ports:
      - "80:80"
      - "443:443"
    environment:
      - NGINX_HOST=example.com
    networks:
      - my-network
    # 修复envsubst的变量,用正确的环境变量名NGINX_HOST
    command: /bin/sh -c "envsubst '$NGINX_HOST' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
    restart: always
    depends_on:
      - php
      - mysql
  php:
    image: bitnami/php-fpm:8.0.10
    container_name: php
    restart: always
    volumes:
      - "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
      - "./repo:/var/www/html"
    # 添加网络配置,让PHP和其他服务在同一网络
    networks:
      - my-network
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
    networks:
      - my-network
    restart: always
    depends_on:
      - mysql
  mysql:
    image: mysql:8.0.27
    container_name: mysql
    restart: always
    env_file:
      - ".env"
    environment:
      - MYSQL_DATABASE=database
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=admin
    ports:
      - "8989:3306"
    volumes:
      - "./data/db/mysql:/var/lib/mysql"
    networks:
      - my-network
networks:
  my-network:
    driver: bridge

2. 调整Nginx配置

接下来修改Nginx的配置文件,解决两个核心问题:PHP-FPM的访问方式,以及phpMyAdmin的反向代理优化:

2.1 修复PHP请求处理

因为PHP和Nginx是两个独立容器,不能用Unix套接字通信,需要改成通过网络访问PHP-FPM的9000端口(默认端口),同时补上你之前漏写的空格:

server {
    listen 80;
    server_name example.com;
    root /var/www/html/public;
    ...
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors on;
        # 替换为PHP容器的服务名+端口
        fastcgi_pass php:9000;
    }
    ...
}

2.2 完善phpMyAdmin的反向代理

给database.example.com的server块添加必要的请求头,避免phpMyAdmin出现跳转异常或权限问题:

server {
    listen 80;
    server_name database.example.com;

    location / {
        proxy_pass http://phpmyadmin:80;
        # 添加必要的代理头
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # 支持websocket(适配phpMyAdmin的实时功能)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

3. 重启容器生效

执行以下命令重启所有服务,让配置生效:

docker-compose down && docker-compose up -d

4. 测试访问

现在打开浏览器验证:

  • http://example.com:正常访问你的站点
  • http://database.example.com:看到phpMyAdmin登录界面,用MySQL的root账号和你设置的root密码即可登录

内容的提问来源于stack exchange,提问作者PhilipCodeX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:57:31