Atualizar fastcgi_pass em conf nginx com IP do contêiner do Docker na inicialização

2

Temos a seguinte configuração:

Nós hospedamos vários sites em um servidor Ubuntu, a maioria deles executando o PHP 5.6. Um deles, é executado dentro de um contêiner Docker com o PHP 7.1.

O nginx conf deste site tem a seguinte linha:

fastcgi_pass 172.17.0.4:9000;

que aponta para o IP do contêiner docker, que obtemos de

docker inspect <container>|grep IP

O problema é sempre que o sistema é reiniciado, o container recebe um novo IP atribuído e nós temos que copiá-lo para o conf nginx novamente e reiniciar o nginx. Como poderíamos fazer isso automaticamente?

Obrigado!

BR, Peter

    
por Illes Peter 05.03.2018 / 14:03

3 respostas

1

O Docker cria uma entrada em / etc / hosts para mapear o novo endereço IP do contêiner para seu nome. Infelizmente o nginx ignora o / etc / hosts e só depende do seu resolvedor de DNS para resolver IPs, então isso não ajuda neste caso específico.

Existem algumas soluções alternativas. As duas soluções mais fáceis de implementar são:

  1. se você está rodando nginx e php no mesmo container (você não deveria), use 127.0.0.1:9000 em php-fpm e nginx
  2. se você estiver executando o nginx e o php-fpm em contêineres diferentes, ou se estiver executando o php-fpm dentro do contêiner e o nginx no host, adicione -p 9000:9000 ao contêiner do php e configure o contêiner nginx para usar fastcgi_pass 172.17.42.1:9000 (ou qualquer IP estático usado pela interface do docker0 do host)
  3. se você preferir ter endereços IP estáticos, crie uma rede separada e atribua um ip estático ao seu contêiner do php, por exemplo:

    docker network create --subnet=172.18.0.0/16 mynet123

    docker run --net mynet123 --ip 172.18.0.22 -d --rm php-image-name

Soluções mais limpas envolveriam o uso de soluções de orquestração, aqui estou apenas indo para o caminho rápido e sujo.

    
por 09.05.2018 / 01:03
0

Eu mapearia a porta do contêiner 9000 para uma porta aberta no host, e você pode configurar o nginx para o proxy diretamente no host e na porta. Dessa forma, não importa qual endereço IP está atribuído à instância do docker.

docker run -p 127.0.0.1:9001:9000

Então você pode mudar o nginx conf:

fastcgi_pass 127.0.0.1:9001;
    
por 10.05.2018 / 06:15
0

Você é capaz de usar um soquete? Você pode ignorar este problema dado ...

  • O contêiner do php-fpm está escutando em um soquete
  • Você tem recursos do sudo para criar um diretório

Eu não sei os detalhes do seu ambiente, mas isso deve levá-lo no caminho certo:

[host]# sudo mkdir -p /var/run/my_app/ [host]# docker run -d -v /var/run/my_app:/var/run/php-fpm my_org/my-php-fpm-container

Seu contêiner deve colocar um soquete abaixo de /var/run/php-fpm , como /var/run/php-fpm/php-fpm.sock .

Em seguida, na configuração nginx correspondente, você pode usar fastcgi_pass unix:/var/run/my_app/php-fpm.sock;

Isso permite que você nem exponha a porta.

Isso funciona porque, se você expor um diretório inteiro para o docker, ele não criará nenhum arquivo, apenas o diretório. Se você colocar um arquivo nesse diretório dentro do contêiner, ele será exposto no host. Soquetes são apenas arquivos especiais, então eles são expostos da mesma forma que qualquer outra coisa. :)

Você poderia tecnicamente fazer o inverso aqui também, o qual estaria rodando o php-fpm no host e executando o nginx em um container (eu não sugiro isso, no entanto)!

    
por 11.05.2018 / 03:36