Configurar a firewall do anfitrião

Por predefinição, a firewall do anfitrião do SO otimizado para contentores permite ligações de saída e aceita ligações de entrada apenas através do serviço SSH. Pode ver a configuração exata da firewall do anfitrião executando sudo iptables -L numa instância de VM que execute o SO otimizado para contentores.

Tenha em atenção que a firewall do anfitrião é diferente das regras da firewall da nuvem privada virtual, que também têm de ser configuradas para que as suas aplicações funcionem corretamente. Consulte a vista geral das regras de firewall para saber mais acerca das regras de firewall da nuvem privada virtual.

Executar contentores no espaço de nomes de rede predefinido do Docker

Se estiver a implementar um contentor no SO otimizado para contentores que tem de estar acessível através da rede e não estiver a usar a opção --net=host do Docker, execute o contentor com a opção -p do Docker. Com esta opção, o Docker configura automaticamente a firewall do anfitrião para expor a sua aplicação na rede. Consulte a referência de execução do Docker para saber mais sobre as opções de execução do Docker.

No exemplo seguinte, o contentor nginx vai estar acessível na rede na porta 80:

docker run --rm -d -p 80:80 --name=nginx nginx
"ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT"

Executar contentores no espaço de nomes de rede do anfitrião

Se estiver a implementar um contentor no SO otimizado para contentores que tem de estar acessível através da rede e estiver a usar a opção --net=host do Docker, tem de configurar explicitamente a firewall do anfitrião.

Pode configurar a firewall do anfitrião com comandos iptables padrão. Tal como acontece com a maioria das distribuições GNU/Linux, as regras de firewall configuradas com comandos iptables não persistem após reinícios. Para garantir que a firewall do anfitrião está configurada corretamente em cada arranque, configure a firewall do anfitrião na sua configuração.cloud-init Considere o seguinte exemplo de cloud-init:

#cloud-config

write_files:
- path: /etc/systemd/system/config-firewall.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Configures the host firewall

    [Service]
    Type=oneshot
    RemainAfterExit=true
    ExecStart=/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- path: /etc/systemd/system/myhttp.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=My HTTP service
    After=docker.service config-firewall.service
    Wants=docker.service config-firewall.service

    [Service]
    Restart=always
    ExecStart=/usr/bin/docker run --rm --name=%n --net=host nginx
    ExecStop=-/usr/bin/docker exec %n -s quit

runcmd:
- systemctl daemon-reload
- systemctl start myhttp.service

A utilização desta configuração cloud-init com uma VM que execute o SO otimizado para contentores resulta nos seguintes comportamentos em cada arranque:

  • A firewall do anfitrião é configurada para permitir ligações TCP recebidas na porta 80.
  • Um contentor nginx vai ouvir na porta 80 e responder a pedidos HTTP recebidos.

Consulte o artigo Criar e configurar instâncias para saber mais sobre a utilização do cloud-init no SO otimizado para contentores.