Docker#
O módulo fornece configuração dinâmica de grupos de servidores proxy
em contextos HTTP e stream
baseada em labels de contêineres Docker.
Para que a funcionalidade opere, uma zona de memória compartilhada deve ser configurada
no grupo (veja a descrição de zone
para http e stream).
Nota
O módulo suporta trabalhar tanto com Docker quanto com suas alternativas, como Podman, que implementam uma API compatível.
O módulo conecta-se ao daemon Docker via API,
o método de interação com o qual é especificado pela diretiva docker_endpoint.
Após obter uma lista de contêineres em execução,
o Angie os analisa para verificar a presença de labels adequados.
Se uma descrição de contêiner contém um label com uma porta,
então o endereço e porta de tal contêiner,
bem como parâmetros de outros labels deste contêiner,
são automaticamente adicionados ao bloco upstream
correspondente
na configuração do Angie.
Nota
O mesmo contêiner pode ser adicionado a múltiplos grupos upstream
;
apenas especifique múltiplos conjuntos de labels com diferentes nomes de grupo e portas.
Isso é especialmente útil se o contêiner executa vários serviços diferentes em portas diferentes; cada serviço pode ser associado com seu próprio grupo.
O módulo então se inscreve em eventos do ciclo de vida dos contêineres e começa a atualizar a configuração do servidor proxy sem recarregar o Angie:
ao iniciar um contêiner com labels adequados, seu endereço IP interno é adicionado ao grupo especificado;
ao parar ou remover um contêiner, ele é automaticamente removido do grupo;
ao pausar um contêiner com o comando docker pause, o servidor é marcado como
down
, e com docker unpause — comoup
.
Exemplo de Configuração#
As diretivas do módulo estão sempre localizadas no contexto http
,
mas grupos de servidores proxy podem ser definidos
tanto no contexto http
quanto no contexto stream
.
Exemplo de configuração para http
:
http {
# Exemplos de opções de conexão:
# docker_endpoint http://127.0.0.1:2375;
# docker_endpoint https://127.0.0.1:2376;
docker_endpoint unix:/var/run/docker.sock;
# tamanho máximo do buffer de resposta Docker (opcional)
# docker_max_object_size 128k;
upstream u {
zone z 1m; # zona de memória compartilhada é obrigatória
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://u;
}
}
}
Similarmente no contexto stream:
http {
# Exemplos de opções de conexão:
# docker_endpoint http://127.0.0.1:2375;
# docker_endpoint https://127.0.0.1:2376;
docker_endpoint unix:/var/run/docker.sock;
# tamanho máximo do buffer de resposta Docker (opcional)
# docker_max_object_size 128k;
}
stream {
upstream u {
zone z 1m;
}
server {
listen 12345;
proxy_pass u;
}
}
Ao receber um evento para um contêiner,
o Angie procura por labels da forma
angie.http.upstreams.<name>.port=<port>
(para contexto HTTP)
ou angie.stream.upstreams.<name>.port=<port>
(para contexto stream).
Quando um label está presente, o endereço do contêiner na rede Docker especificada
(ou a primeira disponível se o label angie.network
não for especificado)
é adicionado ao grupo de servidores proxy correspondente.
Se um contêiner para ou é removido, o servidor é removido do grupo;
se um contêiner é pausado, o servidor é marcado como down
.
Fragmento de um arquivo docker-compose.yml
com labels que o Angie reconhece:
services:
myapp:
image: myapp:latest
labels:
- "angie.http.upstreams.u.port=8080"
- "angie.network=my_bridge"
- "angie.http.upstreams.u.weight=2"
- "angie.http.upstreams.u.max_conns=50"
- "angie.http.upstreams.u.max_fails=3"
- "angie.http.upstreams.u.fail_timeout=10s"
- "angie.http.upstreams.u.backup=true"
Labels#
Labels especificam parâmetros do servidor no grupo de servidores proxy
similar aos argumentos da diretiva server
:
Label | Propósito |
---|---|
| Porta do contêiner à qual o Angie se conectará;
o próprio contêiner é adicionado ao grupo nomeado |
| Nome da rede Docker da qual obter o endereço IP do contêiner. |
| Valor do parâmetro |
| Número máximo de conexões simultâneas ( |
| Limite para tentativas falhadas ( |
| Intervalo para contar tentativas falhadas ( |
| Marca o servidor como |
| Define um identificador de servidor personalizado ( |
| Habilita o modo |
Diretivas#
docker_endpoint#
Especifica o método de conexão com o daemon Docker e habilita o rastreamento de eventos de contêineres. As seguintes opções são suportadas:
| Conexão via socket Unix (ex., |
| Conexão via HTTP ou HTTPS para uma API Docker remota. |
A conexão pode ser adicionalmente configurada usando o contexto client,
onde o módulo adiciona dois blocos location
nomeados:
@docker_events
é usado para receber eventos de contêineres;@docker_containers
— para obter informações de contêineres.
Por padrão, eles contêm a diretiva proxy_pass com o endereço de conexão e várias outras configurações padrão otimais, às quais outras configurações do módulo Proxy podem ser adicionadas.
Se a diretiva for especificada, o Angie abre uma conexão com o Docker usando o método especificado, solicita uma lista de contêineres em execução, analisa seus labels e processa todos os eventos subsequentes de contêineres, adicionando ou removendo servidores em grupos de servidores proxy de acordo com os labels.
Dica
Para acessar o daemon Docker via socket Unix
(/var/run/docker.sock
ou outro),
o usuário com o qual o Angie executa
deve ter permissões de leitura e escrita para este socket.
docker_max_object_size#
Define o tamanho máximo do buffer que é usado tanto para respostas JSON a requisições Docker quanto para o fluxo de eventos de contêineres.
Para requisições regulares (versão da API, lista de contêineres, informações de contêineres): toda a resposta deve caber no buffer, caso contrário ocorre um erro.
Para eventos de contêineres, processamento em fluxo é usado com reutilização de buffer, o que permite processar um fluxo ilimitado de eventos.
O valor típico de 64k
é suficiente para aproximadamente 25 contêineres.
Quando ocorrem erros de conexão da API Docker ou erros de processamento de resposta, o módulo automaticamente tenta novamente em intervalos de tempo específicos. O número máximo de tentativas de repetição para obter informações sobre um contêiner específico é limitado a duas tentativas adicionais; depois disso, o módulo para de tentar para aquele contêiner.