Docker + Serverless? Sim, é possível com Azure Functions!
Embora na Web discussões como Docker versus Serverless ocorram com alguma frequência, essas 2 abordagens não devem ser consideradas como excludentes entre si. E um caso que exemplifica bem essa possibilidade de combinação de containers com aplicações serverless envolve as Azure Functions: o uso de imagens Docker está atualmente entre as opções para deployment de uma Function App no Microsoft Azure.
E este suporte a Docker nos abre ainda outras oportunidades: com o projeto KEDA (Kubernetes-based Event Driven Autoscaling) há agora a possibilidade de se executarem Azure Functions num cluster Kubernetes, independentemente de estarmos trabalhando num ambiente de orquestração on-premise ou em outra nuvem que não o Azure. Superamos assim o temido lock-in, em que muitas vezes ficamos aprisionados a uma tecnologia proprietária oferecida por um cloud provider.
Outro ponto a destacar ainda é o suporte oferecido para desenvolvimento multiplataforma de Azure Functions com .NET Core, Java, Node.js, TypeScript, PowerShell e Python, valendo-se para isto da utilização do Visual Studio Code em ambientes Windows, Linux e Mac. O Visual Studio 2019 e o Visual Studio for Mac também constituem alternativas para a implementação de projetos serverless baseados em Azure Functions.
Podemos gerar um novo projeto para a implementação de uma Function App através da seguinte linha de comando:
func init FunctionAppDadosCadastrais --worker-runtime dotnet --docker
Em que o valor dotnet para o parâmetro --worker-runtime indica o uso do .NET Core 3.1, ao passo que o parâmetro --docker determina que um arquivo Dockerfile será gerado durante a criação do projeto FunctionAppDadosCadastrais.
Como resultado teremos um Dockerfile similar ao conteúdo da listagem:
As imagens geradas poderão ser disponibilizadas no Azure Container Registry ou até mesmo no Docker Hub (ou qualquer outro Container Registry). Para testes com containers o mapeamento se baseará na porta 80 caso haja a necessidade de execução local.
Demonstrei recentemente durante o Azure Weekend Online #2 todos esses pontos na prática, concluindo com o deployment no Azure (clique aqui para abrir o vídeo no YouTube):