Docker 编写 nginx + phpmyadmin 单独的主机名

Docker compose nginx + phpmyadmin seperate hostname

我正在尝试使用 nginx、php、mysql、phpmyadmin 设置一个 docker 环境,我想知道如何配置它所以我可以通过另一个主机名访问 phpmyadmin。

例如访问我想使用的网站 site.com 和访问 phpmyadmin 我想使用数据库。site.com

我的/etc/hosts是这样配置的

127.0.0.1      localhost example.com database.example.com

我的 docker 作曲家是这样的

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=site.com
        networks:
            - my-network
        command: /bin/sh -c "envsubst '$site.com' < /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"
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        ports:
            - "8080:80"
        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: null

我的 nginx conf 看起来像这样

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;
      fastcgi_pass unix:/run/php/php8.0-fpm.sock;
    }
    ...
 }

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;
    root /var/www/html/public;
    ...
    location / {
      if ($args ~* _escaped_fragment_) {
        # Pass to phantom proxy
        proxy_pass http://127.0.0.1:443;
      }
      proxy_redirect off;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Client-Verify SUCCESS;
      proxy_set_header X-SSL-Subject $ssl_client_s_dn;
      proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
      proxy_set_header HTTPS on;
      proxy_buffers 16 4k;
      proxy_buffer_size 2k;
      proxy_pass http://127.0.0.1:433;
    }
    ...
 }

server {
    listen 80;
    server_name database.example.com;
    location / {       
         proxy_pass  http://phpmyadmin:80;
     }
 }

不要使用 site.com 作为 this reason 的示例。我已将所有内容更改为 example.com

  1. 更改您的端口绑定,以便 nginx 从您的主机绑定正确的端口 443:44380:80(而不是 9080:803000:443)。否则您的 Web 请求将需要包含端口,例如https://example.com:3000.
  2. 使用公共网络将您的容器连接在一起(参见 )。
  3. 更新您的 nginx 配置以将流量代理到您的 phpmyadmin 容器。它应该是这样的:
...
server {
  listen        80;
  server_name   database.example.com;

  location / {
    proxy_pass  http://phpmyadmin;
  }
}
...

结果如下:

  • http://database.example.com 的请求解析为 127.0.0.1
  • Web 浏览器在端口 80 上发出请求。
  • 127.0.0.1:80 被转发到 nginx 容器中的 80 端口。
  • nginx 将流量代理到 http://phpmyadmin,它能够解析并通过 docker 网络连接。

您应该能够 https://database.example.com 并且此后网站可以相当轻松地运行。我相信 https://example.com 在您修复端口绑定后应该可以正常工作。要修复 http://example.com 端点,请在 nginx 配置中将监听器从 127.0.0.1:9080 更改为 80