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?
fonte
Respostas:
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.)
Agora, dependendo das circunstâncias, pode haver razões leves para não fazer isso:
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.
fonte
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.
fonte
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.
fonte