Estoy tratando de vincular 2 contenedores separados:
El problema es que los scripts php no funcionan. Quizás la configuración de php-fpm sea incorrecta. Aquí está el código fuente, que está en mi repositorio . Aquí está el archivo docker-compose.yml
:
nginx:
build: .
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/test/
links:
- fpm
fpm:
image: php:fpm
ports:
- "9000:9000"
y Dockerfile
que usé para construir una imagen personalizada basada en la de nginx:
FROM nginx
# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/
Por último, aquí está mi configuración personalizada de host virtual Nginx:
server {
listen 80;
server_name localhost;
root /var/www/test;
error_log /var/log/nginx/localhost.error.log;
access_log /var/log/nginx/localhost.access.log;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
fastcgi_pass 192.168.59.103:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
¿Alguien podría ayudarme a configurar estos contenedores correctamente para ejecutar scripts php?
PD : ejecuto contenedores a través de docker-composer como este:
docker-compose up
desde el directorio raíz del proyecto.
php
nginx
docker
dockerfile
docker-compose
Victor Bocharsky
fuente
fuente
docker exec
ingresar al contenedor en ejecución y hacer ping a fpm?Nginx
yPHP-FPM
junto con Vagrant y Ansible. Consulte mi repositorio github.com/bocharsky-bw/vagrant-ansible-docker si lo desea.Respuestas:
No codifique la IP de los contenedores en la configuración de nginx, el enlace docker agrega el nombre de host de la máquina vinculada al archivo de hosts del contenedor y debería poder hacer ping por nombre de host.
EDITAR: Docker 1.9 Networking ya no requiere que vincule contenedores, cuando varios contenedores están conectados a la misma red, su archivo de hosts se actualizará para que puedan comunicarse entre sí por nombre de host.
Cada vez que un contenedor de la ventana acoplable gira a partir de una imagen (incluso cuando detiene / inicia un contenedor existente), el host de la ventana acoplable asigna una nueva dirección IP a los contenedores. Estas ip no están en la misma subred que sus máquinas reales.
ver docker vinculando documentos (esto es lo que compose usa en segundo plano)
pero explicado con más claridad en los
docker-compose
documentos sobre enlaces y exposicióny si configura su proyecto para obtener los puertos + otras credenciales a través de variables de entorno, los enlaces configuran automáticamente un montón de variables del sistema :
fuente
--links
ahora están obsoletos, de acuerdo con la documentación de la ventana acoplable a la que hace referencia. Todavía se admiten actualmente, pero el plan aparente es que queden obsoletos.Sé que es una publicación antigua, pero tuve el mismo problema y no pude entender por qué tu código no funcionó. Después de MUCHAS pruebas, descubrí por qué.
Parece que fpm recibe la ruta completa de nginx e intenta encontrar los archivos en el contenedor fpm, por lo que debe ser exactamente igual que
server.root
en la configuración de nginx, incluso si no existe en el contenedor nginx.Demostrar:
docker-compose.yml
/etc/nginx/conf.d/default.conf
Dockerfile
fuente
/var/www/html
con falla.:9000
es el puerto que se está utilizando en el contenedor, no el que está expuesto a su host. Me tomó 2 horas resolver esto. Con suerte, no es necesario.services.fpm.ports is invalid: Invalid port ":9000", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
ports
sección aquí. Es posible que solo lo necesiteexpose
si aún no está en la imagen (que probablemente lo esté). Si está realizando una comunicación entre contenedores, no debería exponer el puerto PHP-FPM.AH01071: Got error 'Primary script unknown\n'
y que el contenedor php-fpm tiene que compartir el mismo directorio con los nodos web fue la solución!Como se señaló anteriormente, el problema era que el contenedor fpm no podía ver los archivos. Sin embargo, para compartir datos entre contenedores, el patrón recomendado es utilizar contenedores de solo datos (como se explica en este artículo ).
En pocas palabras: cree un contenedor que solo contenga sus datos, compártalos con un volumen y vincule este volumen en sus aplicaciones con
volumes_from
.Usando componer (1.6.2 en mi máquina), el
docker-compose.yml
archivo leería:Tenga en cuenta que
data
publica un volumen que está vinculado a los serviciosnginx
yfpm
. Luego,Dockerfile
para el servicio de datos , que contiene su código fuente:Y
Dockerfile
para nginx, que simplemente reemplaza la configuración predeterminada:En aras de la finalización, aquí está el archivo de configuración necesario para que funcione el ejemplo:
que simplemente le dice a nginx que use el volumen compartido como raíz del documento, y establece la configuración correcta para que nginx pueda comunicarse con el contenedor fpm (es decir, el derecho
HOST:PORT
, que esfpm:9000
gracias a los nombres de host definidos por compose, y elSCRIPT_FILENAME
).fuente
Dockerfile
del contenedor de datos está copiando sus fuentes en el contenedor en el momento de la compilación. Es por eso que no se actualizarán si cambia los archivos en el host. Si desea compartir las fuentes entre el host y el contenedor, debe montar el directorio. Cambie eldata
servicio en el archivo de redacción para cargarimage: busybox
, y en lavolumes
sección ingrese./sources:/var/www/html
, donde./sources
está la ruta a sus fuentes en el host.Nueva respuesta
Se ha actualizado Docker Compose. Ahora tienen un formato de archivo de la versión 2 .
Ahora admiten la función de red de Docker, que cuando se ejecuta configura una red predeterminada llamada myapp_default
De su documentación, su archivo se vería como el siguiente:
Como estos contenedores se agregan automáticamente a la red predeterminada myapp_default , podrían comunicarse entre sí. Luego tendrías en la configuración de Nginx:
fastcgi_pass fpm:9000;
Además, como lo menciona @treeface en los comentarios, recuerde asegurarse de que PHP-FPM esté escuchando en el puerto 9000, esto se puede hacer editando
/etc/php5/fpm/pool.d/www.conf
donde lo necesitelisten = 9000
.Respuesta antigua
He guardado lo siguiente aquí para aquellos que usan una versión anterior de Docker / Docker compose y quisieran la información.
Seguí tropezando con esta pregunta en Google cuando intentaba encontrar una respuesta a esta pregunta, pero no era exactamente lo que estaba buscando debido al énfasis de Q / A en docker-compose (que en el momento de escribir este artículo solo tiene soporte experimental para funciones de red de Docker). Así que aquí está mi opinión sobre lo que he aprendido.
Docker ha desaprobado recientemente su función de enlace a favor de su función de redes
Por lo tanto, con la función Docker Networks puede vincular contenedores siguiendo estos pasos. Para obtener explicaciones completas sobre las opciones, lea los documentos vinculados anteriormente.
Primero crea tu red
A continuación, ejecute su contenedor PHP-FPM asegurándose de abrir el puerto 9000 y asignarlo a su nueva red (
mynetwork
).Lo importante aquí es el
--name php-fpm
al final del comando que es el nombre, lo necesitaremos más adelante.A continuación, ejecute su contenedor Nginx nuevamente y asigne a la red que creó.
Para los contenedores PHP y Nginx, también puede agregar
--volumes-from
comandos, etc., según sea necesario.Ahora viene la configuración de Nginx. Que debería verse algo similar a esto:
Observe
fastcgi_pass php-fpm:9000;
en el bloque de ubicación. Eso es, contacte con el contenedorphp-fpm
en el puerto9000
. Cuando agrega contenedores a una red de puente de Docker, todos obtienen automáticamente una actualización del archivo de hosts que coloca el nombre del contenedor en su dirección IP. Entonces, cuando Nginx lo vea, sabrá comunicarse con el contenedor PHP-FPM que nombróphp-fpm
anteriormente y asignó a sumynetwork
red Docker.Puede agregar esa configuración de Nginx durante el proceso de compilación de su contenedor Docker o después, depende de usted.
fuente
php-fpm
esté escuchando en el puerto 9000. Esto estaríalisten = 9000
en formato/etc/php5/fpm/pool.d/www.conf
.Como se resolvió en las respuestas anteriores, pero debe indicarse de manera muy explícita: el código php debe vivir en el contenedor php-fpm, mientras que los archivos estáticos deben vivir en el contenedor nginx. Para simplificar, la mayoría de la gente acaba de adjuntar todo el código a ambos, como también he hecho a continuación. En el futuro, probablemente separe estas diferentes partes del código en mis propios proyectos para minimizar qué contenedores tienen acceso a qué partes.
Actualicé mis archivos de ejemplo a continuación con esta última revelación (gracias @alkaline)
Esta parece ser la configuración mínima para docker 2.0 hacia adelante (porque las cosas se volvieron mucho más fáciles en docker 2.0)
docker-compose.yml:
( ACTUALIZADO el docker-compose.yml arriba : para los sitios que tienen css, javascript, archivos estáticos, etc., necesitará que esos archivos sean accesibles para el contenedor nginx. Sin dejar de tener todo el código php accesible para el contenedor fpm. De nuevo, porque mi código base es una mezcla desordenada de css, js y php, este ejemplo solo adjunta todo el código a ambos contenedores)
En la misma carpeta:
site.conf:
En el código de carpeta:
./code/index.php:
y no olvide actualizar su archivo de hosts:
y ejecuta tu docker-compose
y prueba la URL de tu navegador favorito
fuente
Creo que también debemos darle el volumen al contenedor fpm, ¿no es así? Entonces =>
Si no hago esto, me encuentro con esta excepción al disparar una solicitud, ya que fpm no puede encontrar el archivo solicitado:
fuente
Nginx
yPHP-FPM
en GitHubPara cualquier otra persona
al usar
index.php
whileindex.html
funciona perfectamente y habiendo incluidoindex.php
en el índice en el bloque del servidor de la configuración de su sitio ensites-enabled
Asegúrese de que su archivo nginx.conf en
/etc/nginx/nginx.conf
realmente cargue la configuración de su sitio en elhttp
bloque ...fuente