Nomes de domínio SSL válidos para contêineres do Docker local

pré-visualização


O uso do Docker durante o processo de desenvolvimento tornou-se o padrão de fato. O lançamento de um aplicativo com todas as suas dependências usando apenas um comando está se tornando cada vez mais comum. Se o aplicativo fornecer acesso usando a interface da Web ou alguma API HTTP, é provável que o contêiner front-end encaminhe sua porta exclusiva (entre outros aplicativos que você está desenvolvendo em paralelo) para o host. Ao bater nele, podemos interagir com o aplicativo no contêiner .


E isso funciona bem até que você tenha um zoológico inteiro de aplicativos, alternar entre os quais começa a causar algum inconveniente, já que você precisa lembrar o esquema e a porta e algum lugar para corrigir quais portas para qual aplicativo você alocou uma vez, para não Colisões surgiram com o tempo.


E você também deseja verificar o trabalho em https - e precisa usar seu certificado raiz ou sempre usar curl --insecure ... e quando vários comandos funcionam em aplicativos - o número de pares começa a crescer exponencialmente.


Diante desse problema mais uma vez - o pensamento passou pela minha cabeça "Pare com isso!", E o resultado do trabalho em alguns fins de semana foi um serviço que resolve esse problema pela raiz, que será descrito abaixo. Para os impacientes, tradicionalmente - uma referência .


O mundo Vamos salvar o proxy reverso


De uma maneira boa, precisamos de algum tipo de zona de domínio, todos os subdomínios dos quais o host local sempre resolverá (127.0.0.1). Uma pesquisa rápida apontou para domínios no formato *.localho.st , *.lvh.me , *.vcap.me e outros, mas como anexar um certificado SSL válido a eles? Tendo mexido no meu certificado raiz, consegui obter curl sem erros, mas nem todos os navegadores o aceitaram corretamente e continuamos a gerar um erro. Além disso - eu realmente não queria "mexer" com SSL.


"Bem, vamos do outro lado!" - e, em seguida, um domínio com o nome localhost.tools foi adquirido, delegado ao CloudFlare, a resolução necessária foi configurada (todos os subdomínios foram resolvidos 127.0.0.1 ):


 $ dig foo.localhost.tools | grep -v '^;\|^$' foo.localhost.tools. 190 IN A 127.0.0.1 

Depois disso, o certbot foi lançado no contêiner, que, ao receber a API KEY do CF usando o registro DNS, confirma a propriedade do domínio e emite um certificado SSL válido na saída:


 $ docker run \ --entrypoint="" \ -v "$(pwd)/cf-config.conf:/cf-credentials:ro" \ -v "$(pwd)/cert:/out:rw" \ -v "/etc/passwd:/etc/passwd:ro" \ -v "/etc/group:/etc/group:ro" \ certbot/dns-cloudflare:latest sh -c \ "certbot certonly \ --dns-cloudflare \ --dns-cloudflare-credentials '/cf-credentials' \ -d '*.localhost.tools' \ --non-interactive \ --agree-tos \ --email '$CF_EMAIL' \ --server 'https://acme-v02.api.letsencrypt.org/directory' \ && cp -f /etc/letsencrypt/live/localhost.tools/* /out \ && chown '$(id -u):$(id -g)' /out/*" 

O arquivo ./cf-config.conf contém os dados de autorização do CF. Para obter mais detalhes, consulte a documentação do certbot, $CF_EMAIL - variável de ambiente com seu email.

Ok, agora temos um certificado SSL válido (mesmo por 3 meses e apenas para subdomínios do mesmo nível). Resta aprender de alguma forma como proxy de todas as solicitações que chegam ao host local no contêiner certo .


E aqui Traefik vem em nosso auxílio (spoiler - é lindo). Ao iniciá-lo localmente e encaminhar um soquete de docker para seu contêiner por meio de volume, ele pode fazer pedidos de proxy para o contêiner que possui o docker label necessário. Portanto, não precisamos de nenhuma configuração adicional, exceto quando começar a especificar o rótulo desejado para o contêiner (e rede de encaixe, mas ao iniciar sem composição de encaixe, mesmo isso não é necessário, embora muito desejável), para o qual queremos acesso por nome de domínio e com SSL válido !


Tendo feito tudo isso, o mundo viu um contêiner de encaixe com este certificado Traefik e curinga SSL muito pré-configurado (sim, é público).


Chave privada do SSL em um contêiner público?


Sim, mas acho que isso não é assustador, pois está na zona do domínio, que sempre resolve o host local. O MitM, neste caso, não faz muito sentido em princípio.


O que fazer quando o certificado fica ruim?


Basta retirar a nova imagem reiniciando o contêiner. O projeto possui um IC configurado, que automaticamente, uma vez por mês (no momento) atualiza o certificado e publica uma nova imagem.


Eu quero tentar!


Não há nada mais fácil. Antes de tudo, verifique se as portas 80 e 443 livres e faça:


 #  docker-   - $ docker network create localhost-tools-network #   - $ docker run -d --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ --network localhost-tools-network \ --name localhost.tools \ -p 80:80 -p 443:443 \ tarampampam/localhost #  nginx,     "my-nginx.localhost.tools" $ docker run -d --rm \ --network localhost-tools-network \ --label "traefik.frontend.rule=Host:my-nginx.localhost.tools" \ --label "traefik.port=80" \ nginx:latest 

E agora podemos testar:


 $ curl -sS http://my-nginx.localhost.tools | grep Welcome <title>Welcome to nginx!</title> <h1>Welcome to nginx!</h1> $ curl -sS https://my-nginx.localhost.tools | grep Welcome <title>Welcome to nginx!</title> <h1>Welcome to nginx!</h1> 

Como você pode ver, funciona :)


Onde está a documentação, descrição?


Tudo, não é difícil adivinhar, vive em https://localhost.tools . Além disso, o focinho é responsivo e pode ver se o daemon de proxy reverso está sendo executado localmente e exibe uma lista de contêineres em execução e disponíveis para interação (se houver).


Quanto custa?


Nem um pouco. Absolutamente. Tendo feito isso por mim e pela minha equipe, percebi que isso pode ser útil para outros desenvolvedores / ops. Além disso - apenas o nome do domínio custa dinheiro, todo o resto é usado sem a necessidade de pagamento.


PS O serviço ainda está na versão beta, portanto - se houver falhas, erros de digitação etc. - apenas rabiscar em PM . Os hubs "Programação" e "Desenvolvimento de sites" são indicados porque essa abordagem pode ser útil principalmente nesses setores.

Source: https://habr.com/ru/post/pt439806/


All Articles