Quiero usar un servidor de base de datos SQL dockerizado, un cliente adicional (aquí: phpmyadmin) y un proxy inverso para que la interfaz del cliente sea accesible desde servidores externos.
Hasta ahora he usado este archivo docker-compose:
version: '3' services: mariatest: image: mysql restart: always networks: - dbnet environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: test MYSQL_USER: test MYSQL_PASSWORD: test phpmatest: depends_on: - mariatest image: phpmyadmin/phpmyadmin restart: always networks: - dbnet ports: - "9080:80" environment: MYSQL_ROOT_PASSWORD: password PMA_HOST: mariatest reverse: image: nginx networks: - dbnet ports: - "8000:80" volumes: - /var/dockervolumes/nginx:/etc/nginx networks: dbnet:Tomado del volumen, obtengo el archivo nginx default.conf como
server { listen 80; server_name localhost; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://localhost:9080/; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }Cuando uso la máquina local con http://localhost:9080 , puedo usar el PMA sin ningún problema. Cuando trato de usar la dirección del proxy inverso ( http://localhost:8000 ), solo aparece un error nginx, la página que estoy buscando no está disponible. Dentro de los registros, veo que el proxy inverso falla en connect() con conexión rechazada.
¿Qué me estoy perdiendo para tales configuraciones?
Lo más probable es que localhost esté basado en contenedores. ¿Ha intentado ingresar la dirección IP de su host, por ejemplo:
proxy_pass http://[HOSTIP]:9080/;Es posible que deba establecer las direcciones IP estáticas de su contenedor o solicitarlas por su nombre de host. Para usar DNS, configure el nombre de host del contenedor (una forma es configurar container_name), por ejemplo:
services: phpmatest: container_name: phpmatesty en el archivo conf de nginx:
proxy_pass http://phpmatest:80/;debería funcionar porque están en la misma red de contenedores.
También deberá configurar nginx para recibir DNS desde la ventana acoplable, en caso de que un contenedor necesite reiniciarse o cambiar. Hay tutoriales sobre cómo hacer esto en otros lugares.
Dos problemas con su código:
Primero :-
/var/dockervolumes/nginx:/etc/nginx Esto no permite que nginx se inicie dentro del contenedor porque la configuración de nginx no se crea automáticamente debido al enlace de volumen.
Intente usar el comando docker ps para verificar.
Usar /var/dockervolumes/nginx:/etc/nginx/conf.d funciona
Supongo que colocará su archivo default.conf dentro de la carpeta conf.d
Nota: si vincula cualquier directorio dentro del contenedor al sistema host, el contenedor no inicializa ese directorio.
Segundo :-
proxy_pass http://localhost:9080/;Usted asume que localhost dentro de su contenedor y su host real es el mismo.
Utilice proxy_pass http://phpmatest; eso funcionará porque el nombre de su servicio es phpmatest
Nota: Si crea una red acoplable de cliente, es decir, dbtest en su caso. Se puede acceder directamente a todos los servicios que utilizan la misma red por su nombre, es decir, phpmatest en su caso.
Siguientes obras: -
archivo docker-compose
version: '3' services: mariatest: image: mysql restart: always networks: - dbnet environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: test MYSQL_USER: test MYSQL_PASSWORD: test phpmatest: depends_on: - mariatest image: phpmyadmin/phpmyadmin restart: always networks: - dbnet ports: - "9080:80" environment: MYSQL_ROOT_PASSWORD: password PMA_HOST: mariatest reverse: image: nginx networks: - dbnet ports: - "8000:80" volumes: - /var/dockervolumes/nginx:/etc/nginx/conf.d networks: dbnet:predeterminado.conf
server { listen 80; server_name localhost; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://phpmatest; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }