Docker 组成 nginx + phpmyadmin 单独的主机名



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

例如,要访问我想使用的网站 site.com 和访问 phpmyadmin,我想使用 database.site.com

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

127.0.0.1      localhost example.com database.example.com

我的码头工人作曲家看起来像这样

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 作为示例。 我已将所有内容更改为 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

相关内容

最新更新