Quais são os motivos pelos quais o Docker não deve ser usado para bancos de dados?

25

Estou discutindo com um amigo sobre casos de uso do Docker . Um cara da equipe quer usar o Docker para tudo - como uma espécie de invólucro universal de processos unix. O outro acha que o Docker deve ser usado apenas para aplicativos sem estado , como aplicativos no estilo Microservices e AWS Lambda .

Projetamos provas de conceitos para ambos. No cluster do docker, temos uma unidade compartilhada que é montada quando o host do Docker é montado e, se um banco de dados em um contêiner é montado, ele simplesmente monta um volume na unidade compartilhada.

Meu amigo ainda mantém sua posição, apesar de ter sido mostrada a evidência contrária. (Ele também argumenta que o Docker adiciona riscos desnecessários ao adicionar complexidade à pilha.)

Estou tentando ouvir e entender o ponto de vista dele, tanto em um ato de empatia, mas também para melhor raciocinar com ele. (Todos nos damos muito bem - então essa é uma mistura de brincadeira e discussão séria).

O tipo de pergunta por trás da pergunta é: os bancos de dados são gado ? Este comentário sugere que uma boa estratégia automatizada de backup e recuperação para o seu banco de dados é indistinguível de um servidor de gado.

Minha pergunta é: Quais são os motivos pelos quais o Docker não deve ser usado para bancos de dados?

EDIT: As pessoas me pediram para esclarecer minha terminologia. Eu estava assumindo que o aplicativo de banco de dados estava no contêiner e o armazenamento estava no volume. O que eu quis dizer foi que o RDBMS está no contêiner e o armazenamento do banco de dados está no volume.

Alguns comentaristas sugeriram que os drivers de volume do docker não funcionarão muito bem com as gravações de banco de dados. (Ou algo nesse sentido). Você poderia expandir isso?

Hawkeye
fonte
Segundo o autor deste blog , NÃO se deve executar bancos de dados dentro de contêineres, pois os provedores de nuvem oferecem bancos de dados gerenciados.
030

Respostas:

20

Quando as pessoas falam sobre a execução de um banco de dados no Docker, elas não pretendem armazenar os dados em um contêiner; eles estão falando sobre ter uma imagem do docker com o software DB e montar os dados como um volume (um volume de ligação, não um volume de contêiner).

Os volumes são uma parte essencial do Docker e não são algo que é flakey ou apenas é usado. O Docker não é feito apenas para serviços (sem micro) sem estado.

Por mais que eu queira, não consigo encontrar um motivo técnico para não executar um banco de dados em um Docker, então, infelizmente, escolherei o outro lado do argumento e, portanto, talvez não lhe dê a resposta que você está procurando.

(Estou usando o Oracle como exemplo, porque estou familiarizado com ele, bare metal e dockerized, e porque é um animal notório por ser um pouco pouco trivial de operar se você passar pelas configurações padrão.)

  • Empacotar o software do banco de dados em um contêiner oferece os benefícios usuais - ter a mesma versão em todos os lugares, evitando problemas de dependência / biblioteca compartilhada, podendo gerar exatamente o mesmo banco de dados em laptops para desenvolvedores ou onde você precisar.
  • É fácil fazê-lo funcionar em qualquer lugar; a atualização é trivial e assim por diante. Todos os benefícios do Docker se aplicam. Há uma imagem do Oracle no Dockerhub que permite gerar um banco de dados em um minuto ou três (e também para os outros, é claro).
  • As pessoas fizeram testes de desempenho e não encontraram diferenças de E / S entre volumes e bare metal ( https://www.percona.com/blog/2016/02/11/measuring-docker-io-overhead/ , https: // stackoverflow .com / questions / 21889053 / qual é o custo de desempenho em tempo de execução de um contêiner de docker ).
  • Sob o capô, não é como se o Docker de alguma forma intercepte todas as E / S. Ele é criativo com as ferramentas padrão do Linux (neste caso, montagens de bind, manipulação das tabelas internas do kernel que tornam possível o Docker-fu).
  • Obviamente, isso não significa que você possa executar duas instâncias do banco de dados e fazê-las funcionar nos mesmos arquivos, mas ninguém está implicando isso. O Docker não fornece acesso automático a volumes, simultâneo e magicamente livre de corrida, e nunca pretendeu fazê-lo. O restante dos benefícios ainda se aplica. Se o seu banco de dados em si não detectar conflitos como esse, é melhor fornecer um script CMD à imagem que se recusa a girar um segundo contêiner quando o volume já estiver em uso.
  • É preciso ter um pouco mais de cuidado ao girar / desligar o contêiner (da mesma maneira que você não simplesmente desligaria um servidor de banco de dados bare metal), mas isso deve ser bem gerenciável.

Agora, dependendo das circunstâncias, pode haver razões leves para não fazer isso:

  • A Oracle (a empresa), por exemplo, certamente não oferecerá suporte se você executar o RDBMS em um contêiner Docker. Mas talvez você esteja usando imagens Oracle RDBMS encaixadas apenas para seus desenvolvedores e o ambiente de teste, onde você não precisaria do suporte deles em nenhum caso, reservando-o para um servidor de produção bare metal. (Mas não se esqueça de pagar suas licenças ...).
  • Se o pessoal das operações não estiver familiarizado com o Docker, pode ser um pouco mais fácil matar tudo acidentalmente, destruir seus arquivos de dados etc.
  • Se você já possui grandes máquinas de banco de dados de metal dedicadas, com grandes quantidades de armazenamento SAN dedicado muito rápido e não executa mais nada, não há sentido em usar o Docker para contê- las, pois você nunca girará outro servidor quando houver são 100s de GB ou mesmo TB de dados. Afinal, para produção, um RDBMS como Oracle é muito, muito avançado em todos os aspectos de replicação, integridade de dados, failover sem tempo de inatividade, etc. Observe que esse argumento diz apenas "você não precisa containerizar seu RDBMS". Ele não diz "você não deve fazê-lo" - talvez você queira fazê-lo porque deseja implantar atualizações de software de banco de dados em contêineres ou por qualquer outro motivo que você possa imaginar.

Então lá vai você. De qualquer maneira , reduza a dockerização do seu banco de dados, no mínimo para seus desenvolvedores (que serão eternamente gratos) e seus ambientes de teste. Na produção, tudo ficará a seu gosto e , pelo menos, eu também preferiria a solução que melhor se adapta aos DBA / Ops especializados - se eles tiverem décadas de experiência trabalhando em servidores de banco de dados bare metal, então, por todos os meios, confiem neles. para continuar assim. Mas se você é uma startup que possui toda a TI na nuvem, um contêiner do Docker seria apenas mais um pedaço de cebola em todo o cenário.

AnoE
fonte
Outro fator é se a alternativa é usar um serviço de banco de dados gerenciado versus hospedar o seu próprio.
avi
3

Eu escrevi sobre isso em profundidade, mas aqui está o resumo:

  • A prevenção da divisão do cérebro (elegendo mais de um nó mestre) precisa ser resolvida. Não fazer isso pode ser catastrófico

  • Não há soluções de armazenamento compartilhado prontas para produção para permitir que os bancos de dados sejam encerrados em uma instância e criados em outra sem perder todos os seus dados.

robô
fonte
Obrigado - isso é quase uma resposta fundamentada. No entanto, em seu blog - você adiciona uma ressalva que valida a suposição que escrevi no topo. "Os problemas descritos abaixo não se relacionam apenas à execução do banco de dados no docker sem armazenamento compartilhado ou capacidade de iniciá-lo automaticamente em um nó diferente." Ou seja - o seu blog diz que a situação sobre a qual escrevi acima é válida.
hawkeye
Da sua pergunta, parece que você está usando algum tipo de orquestração para iniciar o banco de dados e montar o volume. Mas então você tem um potencial problema de consistência com a orquestração, sobre o qual eu falo. Minha ressalva é explicitamente sobre quando você não usa orquestração.
Robo
Você já viu flynn.io? Eles supostamente estão prontos para a produção e evitam cenários de cérebro dividido usando uma máquina de estado de coro (baseada no Joyent Manatee).
Alix Axel
Nenhum desses pontos se aplica ao cassandra ou a outros bancos de dados distribuídos, mas ainda não acho que executá-lo em um contêiner seja uma boa idéia.
dres
0

Quando você diz que os dados estão montados em um contêiner de docker, não seria mais correto dizer que o "banco de dados" está montado no contêiner de docker? Se você está mantendo seus dados fora do contêiner, está fazendo a coisa "correta" de não colocar seu banco de dados em um contêiner.

Claro, vá para a cidade colocando um DBMS em um contêiner e permitindo que ele gerencie os dados que você armazena do lado de fora. Pessoalmente, acho que é apenas um bom design, pois mantém uma separação limpa entre lógica e dados. Mas uma vez que você coloca seus dados em um contêiner, você está brincando com fogo.

Embora os drivers de armazenamento de contêineres tenham percorrido um longo caminho, eu pessoalmente ainda não estou disposto a me aprofundar e deixar meus dados emaranhados em um contêiner.

hvindin
fonte