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.