Docker no Amazon EC2

3

Estou executando vários contêineres Docker na AWS (meio EC2, T2) e estou constantemente sem espaço em disco. Tem algo a ver com o sistema de arquivos subjacente. Eu corro o Docker no Ubuntu e funciona bem (AUFS). As versões padrão do AWS Linux são baseadas no RHEL e devem usar o mapeador de dispositivos. Isso parece muito mais complicado, mas para minha surpresa não há manual decente como usá-lo (ou não consegui encontrá-lo).

Eu posso usar a imagem do Ubuntu no EC2, mas eu acho que deveria ser possível rodar o Docker no EC2 sem muitos problemas? Ou preciso fazer algo especial para evitar que ele fique sem espaço em disco?

Eu só uso uma imagem NGINX e NodeJS.

    
por Ramon de Klein 22.12.2016 / 21:51

2 respostas

1

As versões do Amazon Linux usam o mapeador de dispositivos como o driver de armazenamento do Docker. O mapeador de dispositivos usa dispositivos de bloco de cópia em gravação em camadas nos contêineres. Quando não há dados gravados, dificilmente usa espaços em disco. À medida que as páginas do sistema de arquivos são gravadas, elas alocam dados do mapeador de dispositivos e começam a usar o espaço em disco.

O tamanho padrão do disco para o mapeador de dispositivos é de 10 GB, portanto, ao executar 6 imagens, talvez seja necessário 60 GB se todas as páginas estiverem sendo gravadas. É improvável que todas as páginas estejam sendo gravadas, mas a instância padrão do EC2 tem apenas 8 GB, o que não é suficiente.

Quando um arquivo é escrito, ele é gravado em vários blocos. Se os blocos ainda não tiverem sido escritos, eles serão alocados no pool de dispositivos. Quando o arquivo é removido, o bloco é marcado como não utilizado no sistema de arquivos, mas o pool não o conhece. Somente quando o fstrim é executado, o sistema de arquivos libera as páginas do gerenciador de dispositivos.

O NGINX mantém um cache em / tmp / cache e é constantemente gravado em. Se o sistema de arquivos continuar usando blocos diferentes, ele continuará alocando blocos até que todos os 10GB sejam mapeados para o gerenciador de dispositivos. Existem várias soluções para este problema:

  1. Use um dispositivo de mapeamento de dispositivo que seja grande o suficiente para caber em todos os blocos.
  2. Use um tamanho base menor (pesquise por dm.basesize) para garantir que as imagens não alcancem 10 GB.
  3. Mude para uma distribuição que usa o armazenamento AUFS.

Você também pode executar fstrim regularmente para garantir que os blocos liberados sejam retornados ao pool. Isso pode ser complicado, porque durante o pico de carga ele pode não ser executado com freqüência suficiente e o pool ainda pode ficar sem espaço em disco.

    
por 25.12.2016 / 15:48
3

Por padrão, o docker armazenará seus dados em /var/lib/docker . Esse caminho também está na partição raiz?

Além disso, por padrão, quando você cria uma instância do EC2, os volumes da raiz geralmente são pequenos (cerca de 4 GB). É altamente provável que sua partição raiz também esteja onde as imagens da janela de encaixe estejam sendo armazenadas e sua partição raiz seja muito pequena.

Então, torne sua partição raiz maior. Ou, anexe um novo volume do EBS, monte-o em algum lugar razoável como /var/lib/docker e informe ao docker para usar esse novo volume do EBS para armazenar imagens.

Se você quiser alterar o diretório em que o Docker armazena suas imagens do padrão /var/lib/docker , use a opção -g ao iniciar o daemon do docker.

Veja: Como eu mudo a imagem do docker? diretório de instalação para obter mais detalhes sobre como você pode alterar o caminho de trabalho do docker padrão.

    
por 22.12.2016 / 22:46