Docker :: Restaurando Dumps em Containers MySQL Persistentes.

Share:


Depois de algum tempo, cá estou para retomar a cobertura do meu repositório Cinto de Utilidades Docker, que está com o ritmo de crescimento muito maior do que os das postagens (rs). Hoje vamos abordar duas das maiores duvidas de quem começa a utilizar containers em ambiente de Dev e Prod: Primeiro: Como persistir dados dos bancos de dados que rodam em containers e  Segundo: como criar meu banco de dados sempre que eu instalar meu ambiente.

Confira os arquivos do ambiente

Estrutura de diretórios

Neste projeto iremos utilizar dois níveis de diretórios.
No primeiro vamos ter nosso docker-compose e no segundo nível, na pasta /Dumper teremos todas as dependências do nosso restore do MySQL, incluindo nossa Dockerfile e nosso arquivo SQL.

  ~/W/CintoDeUtilidadesDocker   master  MySQL-MySQLRestore  tree .     qua 04 jan 2017 08:13:26 BRST  
 .  
 ├── docker-compose.yml  
 └── Dumper  
   ├── Dockerfile  
   └── dump.sql  
   
 1 directory, 3 files  
   



docker-compose.yml

Nosso arquivo docker-compose.yml vai ter somente dois serviços. 
O primeiro é uma imagem oficial do MySQL na versão 5.7. Vamos expor a porta 3306 e setar a senha do root na variável MYSQL_ROOT_PASSWORD. Para garantir persistência nos dados, vamos fazer com que o Docker crie uma pasta ./data dentro do diretório do projeto e mapeie para dentro da pasta /var/lib/mysql, a pasta onde o MySQL guarda todos os dados e metadados dos bancos e tabelas. Assim sempre que ele realizar alguma modificação, isso será mapeado para fora, e quando ligarmos outra instância, ele vai mapear o mesmo volume para dentro com as mesmas configurações e dados da anterior. Com isso garantimos uma persistência no MySQL. 

Em segundo, vamos ter um container temporário chamado dump. 
Vamos setar a pasta de build para a pasta Dumper/ e mapear a mesma para dentro da pasta /var/db do container. Essa pasta vai servir para armazenar o arquivo SQL que vamos restaurar na base. 

Na opção command, vamos criar um mini bashscript. Vamos dar um tempinho com o sleep para garantir que toda a inicialização do MySQL foi completada e em seguida restaurar o banco na base. 

 version: "2" 
 services:  
  mysql:  
   image: mysql:5.7  
   restart: never  
   ports:  
    - "3306:3306"  
   environment:  
    - MYSQL_ROOT_PASSWORD=root  
    - MYSQL_DATABASE=mydatabase  
   volumes:  
    - ./data/db:/var/lib/mysql  
   
  dump:  
   build: Dumper/  
   volumes:  
    - ./Dumper/:/var/db/  
   command: sh -c "sleep 20 && /usr/bin/mysql -h mysql -uroot -proot < /var/db/dump.sql"  
   depends_on:  
    - mysql  
   


Dumper/Dockerfile

Nosso Dockerfile será ridiculamente simples. Iremos utilizar a versão mais nova do Alpine Linux e em seguida instalar o MySQL-Client. Ele vai realizar uma unica ação e morrer, então não adianta enfeitar muito o ciclo de vida do mesmo. 

 FROM alpine:latest  
 RUN apk add --no-cache mysql-client  

Dumper/dump.sql

O Arquivo dump.sql irá conter todo o conteúdo do seu banco de dados. Aqui fica por sua conta, porém é altamente recomendável você usar as validações IF NOT EXISTS e IF EXISTS em todos os lugares para garantir erros na hora do restore. 
  
 CREATE DATABASE IF NOT EXISTS mydatabase;  
 USE mydatabase;  
   
 CREATE TABLE IF NOT EXISTS mytable (  
  id INT(11) PRIMARY KEY AUTO_INCREMENT,  
  descricao VARCHAR(50)  
 );  
   


Subindo o Container

Vamos inicializar o composer e ver a mágica acontecer. Ele vai iniciar o MySQL, subir nosso dumper que irá restaurar os dados e morrer. Logo após o termino desse processo teremos nosso bando de dados restaurado no MySQL.
 docker-compose up   



:)


2 comentários:

  1. Estou tendo esse erro no dump

    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2 "No such file or directory")

    ResponderExcluir
  2. va até /var e confira se tem o diretorio /mysqld e o arquivo mysqld.sock lá

    ResponderExcluir