Recentemente, comecei a migrar para os recursos de rede do Docker 1.9 e Docker-Compose 1.5 para substituir o uso de links.
Até agora, com os links, não houve problemas com a conexão do nginx ao meu servidor fastcgi php5-fpm localizado em um servidor diferente em um grupo via docker-compose. Recentemente, porém, quando eu executo docker-compose --x-networking up
meus contêineres php-fpm, mongo e nginx inicializam, no entanto, o nginx fecha imediatamente com[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16
No entanto, se eu executar o comando docker-compose novamente enquanto os contêineres php e mongo estiverem em execução (nginx foi encerrado), o nginx será iniciado e funcionará bem a partir de então.
Este é o meu docker-compose.yml
arquivo:
nginx:
image: nginx
ports:
- "42080:80"
volumes:
- ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
php:
build: config/docker/php
ports:
- "42022:22"
volumes:
- .:/var/www/html
env_file: config/docker/php/.env.development
mongo:
image: mongo
ports:
- "42017:27017"
volumes:
- /var/mongodata/wa-api:/data/db
command: --smallfiles
Este é o meu default.conf
para nginx:
server {
listen 80;
root /var/www/test;
error_log /dev/stdout debug;
access_log /dev/stdout;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
# Referencing the php service host (Docker)
fastcgi_pass waapi_php_1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
# We must reference the document_root of the external server ourselves here.
fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
Como posso fazer o nginx funcionar com apenas uma única chamada docker-compose?
fonte
Respostas:
Existe a possibilidade de usar "volumes_from" como uma solução alternativa até que o recurso depends_on (discutido abaixo) seja introduzido. Tudo que você precisa fazer é alterar o arquivo docker-compose conforme abaixo:
Uma grande advertência na abordagem acima é que os volumes de php são expostos ao nginx, o que não é desejado. Mas, no momento, esta é uma solução alternativa específica do docker que pode ser usada.
recurso Depende_on Esta provavelmente seria uma resposta futurística. Porque a funcionalidade ainda não foi implementada no Docker (a partir de 1.9)
Há uma proposta para introduzir "depends_on" no novo recurso de rede introduzido pelo Docker. Mas há um longo debate sobre o mesmo @ https://github.com/docker/compose/issues/374 Portanto, uma vez implementado, o recurso depends_on poderia ser usado para solicitar a inicialização do contêiner, mas no momento, você teria que recorrer a um dos seguintes:
fonte
links:
incluído no nginx usava o mesmo nome do serviço em si, como- my-service:my-service
neste exemplo- mongo:mongo
.Isso pode ser resolvido com a
depends_on
diretiva mencionada, uma vez que está implementada agora (2016):Testado com sucesso com:
Encontre mais detalhes na documentação .
Há também um artigo muito interessante dedicado a este tópico: Controlando a ordem de inicialização no Compose
fonte
Você pode definir as diretivas max_fails e fail_timeout do nginx para indicar que o nginx deve repetir o número x de solicitações de conexão para o contêiner antes de falhar na indisponibilidade do servidor upstream.
Você pode ajustar esses dois números de acordo com sua infraestrutura e velocidade em que toda a configuração está surgindo. Você pode ler mais detalhes sobre a seção de verificações de saúde do URL abaixo: http://nginx.org/en/docs/http/load_balancing.html
A seguir está o trecho de http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
max_fails=number
fail_timeout=time
Para ser mais preciso, o arquivo de configuração nginx modificado deve ser o seguinte (este script pressupõe que todos os contêineres estão ativos em pelo menos 25 segundos, caso contrário, altere fail_timeout ou max_fails na seção upstream abaixo): Observação: não teste o script sozinho, para que você possa tentar!
Além disso, de acordo com a seguinte Nota do docker ( https://github.com/docker/docker.github.io/blob/master/compose/networking.md#update-containers ), é evidente que a lógica de repetição para verificação a saúde dos outros contêineres não é de responsabilidade do estivador e, em vez disso, os contêineres devem fazer a verificação de saúde por conta própria.
fonte
Acredito que o Nginx não leva em conta o resolvedor do Docker (127.0.0.11), então, por favor, você pode tentar adicionar:
em seu arquivo de configuração nginx?
fonte
resolver 127.0.0.11 8.8.8.8;
Se você está tão perdido para ler o último comentário. Cheguei a outra solução.
O principal problema é a maneira como você nomeou os nomes dos serviços.
Neste caso, se no seu
docker-compose.yml
, os serviços para php são chamados de "api" ou algo parecido, você deve garantir que no arquivonginx.conf
a linha que começa comfastcgi_pass
tenha o mesmo nome do serviço php. iefastcgi_pass api:9000;
fonte
Teve o mesmo problema e resolveu. Adicione a seguinte linha à seção docker-compose.yml nginx:
O host na seção fastcgi_pass da configuração do nginx deve ser vinculado à configuração docker-compose.yml nginx.
fonte
Eu tive o mesmo problema porque havia duas redes definidas no meu
docker-compose.yml
: um backend e um frontend.Quando mudei isso para executar contêineres na mesma rede padrão, tudo começou a funcionar bem.
fonte
Duas coisas que vale a pena mencionar:
links
para adicionar hosts resolMeu exemplo:
Se você não especificar uma ponte de rede especial, todas elas usarão a mesma ponte padrão.
fonte
À primeira vista, não percebi que meu serviço "web" não foi realmente iniciado, então é por isso que o nginx não conseguiu encontrar nenhum host
fonte
Com os links, há uma ordem de inicialização do contêiner sendo aplicada. Sem links, os containers podem começar em qualquer ordem (ou realmente todos de uma vez).
Acho que a configuração antiga poderia ter encontrado o mesmo problema, se o
waapi_php_1
contêiner demorasse para iniciar.Eu acho que para fazê-lo funcionar, você poderia criar um script de ponto de entrada nginx que monitora e aguarda o contêiner php ser iniciado e pronto.
Não tenho certeza se o nginx tem alguma maneira de tentar novamente a conexão com o upstream automaticamente, mas se tiver, seria uma opção melhor.
fonte
Você tem que usar algo como docker-gen para atualizar dinamicamente a configuração do nginx quando seu back-end estiver ativo.
Vejo:
Acredito que o Nginx + (versão premium) também contém um parâmetro de resolução ( http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream )
fonte
Talvez a melhor escolha para evitar problemas de vinculação de contêineres sejam os recursos de rede do docker
Mas para fazer isso funcionar, o docker cria entradas em / etc / hosts para cada container a partir de nomes atribuídos a cada container.
Para não depender de mudanças inesperadas nesses nomes, você deve usar o parâmetro
em docker-compose.yml da seguinte maneira:
Certifique-se de que é o mesmo nome atribuído em seu arquivo de configuração para este serviço. Tenho certeza de que existem maneiras melhores de fazer isso, mas é uma boa abordagem para começar.
fonte
Minha solução alternativa (depois de muitas tentativas e erros):
Para contornar esse problema, tive que obter o nome completo do contêiner Docker 'upstream', encontrado executando
docker network inspect my-special-docker-network
e obtendo aname
propriedade completa do contêiner upstream, como:Em seguida, usei isso no
my-network.local.conf
arquivo NGINX nolocation
bloco daproxy_pass
propriedade: (Observe a adição do GUID ao nome do container):Ao contrário do trabalho anterior, mas agora quebrado:
A causa mais provável é uma mudança recente no Docker Compose, em seu esquema de nomenclatura padrão para contêineres, conforme listado aqui .
Isso parece estar acontecendo comigo e com minha equipe de trabalho, com as versões mais recentes da
nginx
imagem Docker :fonte
(novo no nginx) No meu caso, era o nome da pasta errado
Para configuração
certifique-se de que a pasta do aplicativo esteja na pasta ex2:
ex2 / app / ...
fonte
este erro apareceu para mim porque minha
php-fpm
imagem habilitoucron
, e eu não tenho ideia do porquêfonte
Adicione os links seção de à configuração do contêiner nginx.
Você deve tornar o
php
contêiner visível para onginx
contêiner.fonte
link
seu uso suspenso. Estou esquecendo de algo?docker-compose --x-networking up
com links definidos no meudocker-compose.yml
, recebo este aviso claro:WARNING: "nginx" defines links, which are not compatible with Docker networking and will be ignored. Future versions of Docker will not support links - you should remove them for forwards-compatibility.
docker-compose.yml
arquivo está em uma pasta chamadawaapi
?waapi