Em primeiro lugar, quero ressaltar que estou implantando meu aplicativo de uma forma não recomendada.
O Google sugeriu a implantação de um único contêiner por meio da GUI:
No entanto, estou fazendo isso de uma maneira diferente: eu puxo meu projeto e, em seguida, inicio-o com docker-compose e habilito 7 contêineres com nginx, php, postfix, redis, db e algumas outras coisas.
O firewall da instância de VM permite http e https. E posso me conectar ao IP do host via http. No entanto, parece que não passa corretamente o domínio para o nginx e não consigo me conectar via nome de domínio.
O DNS é adicionado corretamente e o nome de domínio aponta para minha VM, mas depois disso ele entra no tempo limite.
parte do meu docker-compose.yml:
nginx-custom:
depends_on:
- db
- php-fpm-custom
- phpmyadmin
image: nginx-custom:latest
container_name: nginx-custom
links:
- phpmyadmin:phpmyadmin
build:
context: ./docker/nginx/
args:
USER_ID: ${USER_ID}
GROUP_ID: ${GROUP_ID}
SITE_DOMAIN: ${SITE_DOMAIN}
DB_HOST: ${DB_HOST}
DB_ADMIN_WEBPATH: ${DB_ADMIN_WEBPATH}
restart: always
volumes:
- ./ssl:/etc/nginx/ssl
- .:/var/www/site
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
- 80:80
- 443:443
expose:
- '80'
- '443'
networks:
- app-network
E default.conf para nginx:
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
return 403;
}
}
server {
listen 80;
listen [::]:80;
server_name <SITE_DOMAIN added here via sed>;
root /var/www/site/web;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php-fpm-custom:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
}
O que me confunde nos documentos:
Você não pode mapear as portas de uma instância de VM para as portas do contêiner (opção -p do Docker). Para permitir o acesso aos seus contêineres, consulte Publicação de portas de contêiner.
Acho que esse é o motivo, mas não tenho certeza de como consertar, considerando que estou implantando com o docker-compose. Porque o projeto local funciona bem e posso mapear um site.test na minha máquina local.
O Google Compute Engine não oferece suporte ao mapeamento de portas como a opção -p do docker (comando docker run -p para mapear a porta do contêiner para uma porta do host).
De acordo com o documento oficial do GCP sobre publicação de portas de contêineres :
Alternativa-1:
Você pode usar um ambiente flexível do App Engine com um ambiente de execução personalizado. É mais adequado para executar contêineres no GCE.
Alternativa-2:
Tente usar um balanceador de carga, que fornece um endereço IP público estável que não muda se você reiniciar sua VM também. Ele roteia o tráfego do seu domínio para o seu contêiner na rede Docker-Compose. Nas configurações de DNS, certifique-se de que seu nome de domínio esteja apontando para o endereço IP externo do seu balanceador de carga.
Consulte também o problema semelhante do Github para obter mais detalhes.
Bem, descobri que usei um IP do meu outro servidor, não daquele. Erro estúpido, isso esgotou algum tempo.
No entanto, experimentei configurações enquanto tentava descobrir e também mudei minha configuração para usar
network_mode: "host"