Olá, pessoal! No primeiro artigo desta série falamos sobre AUFS e hoje vamos falar um pouco sobre Device Mapper.
Origem
No começo o Docker era suportado apenas em distribuições Ubuntu, Debian e usavam AUFS para o seu armazenamento. Depois de algum tempo, o Docker começou a se popularizar e as pessoas começaram a querer utilizar com RedHat, porém o AUFS era suportado apenas em sistemas (Debian, Ubuntu).
Com isso, os engenheiros da Redhat, baseados no código do AUFS, decidiram desenvolver uma tecnologia própria de armazenamento, inspirado no já existente “Device Mapper”. Eles colaboraram com o “Docker inc” para contribuir com um novo driver de armazenamento para containers. Então o Docker foi reprojetado para fazer a conexão automática com o dispositivo de armazenamento baseado em Device Mapper.
Layers
O Device Mapper armazena cada imagem e container em seu disco virtual, que são dispositivos do tipo Copy-on-Write no nível de bloco e não no de arquivo. Isso significa que, ao invés do Device Mapper copiar todo um arquivo para o seu dispositivo, ele vai copiando por blocos, o que o torna muito rápido comparado ao AUFS. No processo de criação de uma imagem com o Device Mapper é criado um pool e em cima desse pool é criado um dispositivo base; é a partir dele que as imagens são construídas. A partir daí temos as imagens base do Docker, e a cada modificação elas vão criando camadas de snapshots acima da camada anterior. Veja a imagem abaixo:
Read
Quando um container deseja ler algum arquivo que está nas camadas anteriores, o Device Mapper cria um ponteiro na camada do container, referenciando a camada da imagem que possui esses dados, transferindo esse bloco para a memória do container.
Write
Quando o Docker faz uma alteração no arquivo utilizando Device Mapper, é copiado apenas o que será modificado. Cada bloco de modificação copiado é de no máximo 64KB. Por exemplo, na escrita de um arquivo de 40KB de novos dados para o container, o Device Mapper aloca um único bloco de 64KB para o container; caso a escrita seja de um arquivo maior que 64KB, então o Device Mapper aloca mais blocos para realizar essa gravação.
O Device Mapper já é padrão nas em algumas distribuições do Linux, como: RedHat/Centos/Fedora, Ubuntu 12.04 e 14.04 e Debian
Docker e Device Mapper
O Device Mapper atribui novos blocos para um container por meio de uma operação chamada “Allocate-on-Demand”. Isso significa que cada vez que uma aplicação for gravar em algum lugar novo dentro do container, um ou mais blocos vazios, dependendo do tamanho de gravação, terão que ser localizados a partir do pool mapeado para esse container. Como os blocos são de 64KB muitas gravações pequenas podem sofrer com problemas de performance, pois acaba causando lentidões nas operações. Com isso, aplicações que gravam arquivos pequenos sequencialmente podem ter performance piores com Device Mapper do que com AUFS.
Grande abraço!