MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como implantar o servidor MariaDB em um contêiner do Docker


Hoje em dia, termos como Docker, Images ou Containers são bastante comuns em todos os ambientes de banco de dados, então é normal ver um servidor MariaDB rodando no Docker em configurações de produção e não produção. É possível, no entanto, que, embora você já tenha ouvido os termos, agora conheça as diferenças entre eles. Neste blog, fornecemos uma visão geral desses termos e como podemos aplicá-los na prática para implantar um servidor MariaDB.

O que é o Docker?


O Docker é a ferramenta mais comum para criar, implantar e executar aplicativos usando contêineres. Ele permite que você empacote um aplicativo com todas as partes necessárias (como bibliotecas e outras dependências) e envie tudo como um pacote, permitindo o compartilhamento portátil de contêineres em diferentes máquinas.
Contêiner vs Máquina Virtual

O que é uma imagem?

Recursos relacionados ClusterControl e Docker MySQL no Docker Blog Series MySQL no Docker - Como colocar seu banco de dados em contêiner
Uma imagem é como um modelo de máquina virtual. Ele tem todas as informações necessárias para executar o contêiner. Isso inclui o sistema operacional, pacotes de software, drivers, arquivos de configuração e scripts auxiliares... tudo embalado em um pacote.

Uma imagem do Docker pode ser criada por qualquer pessoa que tenha a capacidade de escrever um script. É por isso que existem muitas imagens semelhantes sendo construídas pela comunidade, cada uma com pequenas diferenças... mas servindo a um propósito comum.

O que é um contêiner do Docker?


Um contêiner do Docker é uma instância de uma imagem do Docker. Ele é executado completamente isolado do ambiente do host por padrão, acessando apenas os arquivos e portas do host se configurado para isso.

Um contêiner pode ser considerado uma máquina virtual, mas em vez de criar um sistema operacional virtual completo, ele permite que os aplicativos usem o mesmo kernel Linux do sistema em que estão sendo executados. Exige apenas que os aplicativos sejam enviados com partes que ainda não estejam em execução no computador host. Isso oferece um aumento significativo de desempenho e reduz o tamanho do aplicativo.

Lembre-se de que todas as alterações feitas no contêiner são registradas em uma camada separada, não na mesma imagem do Docker. Isso significa que, se você excluir o contêiner ou criar um novo com base na mesma imagem do Docker, as alterações não estarão lá. Para preservar as alterações, você deve confirmá-las em uma nova imagem do Docker ou criar um arquivo do Docker.

O que é um DockerFile?


Um DockerFile é um script usado para gerar uma imagem do Docker onde você tem as etapas para gerá-la com base em quaisquer modificações que deseja aplicar.
Componentes do Docker
Vamos ver um exemplo de arquivo Docker.
$ vi Dockerfile
# MariaDB 10.3 with SSH
# Pull the mariadb latest image
FROM mariadb:latest
# List all the packages that we want to install
ENV PACKAGES openssh-server openssh-client
# Install Packages
RUN apt-get update && apt-get install -y $PACKAGES
# Allow SSH Root Login
RUN sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
# Configure root password
RUN echo "root:root123" | chpasswd

Agora, podemos criar uma nova imagem do Docker a partir deste arquivo do Docker:
$ docker build --rm=true -t severalnines/mariadb-ssh .

Confira a nova imagem criada:
$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
severalnines/mariadb-ssh                   latest              a8022951f195        17 seconds ago      485MB

E agora, podemos usar a nova imagem como uma imagem comum do Docker, como veremos na próxima seção.
Guia de DevOps para gerenciamento de banco de dados de vários novesSaiba mais sobre o que você precisa saber para automatizar e gerenciar seus bancos de dados de código abertoBaixe gratuitamente

Como implantar o MariaDB no Docker sem Dockerfile


Agora que sabemos mais sobre o mundo Docker, vamos ver como usá-lo para criar um servidor MariaDB. Para isso, vamos supor que você já tenha o Docker instalado.

Podemos usar a imagem criada usando o Dockerfile, mas vamos puxar a imagem oficial do MariaDB Docker.
$ docker search mariadb
NAME                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mariadb                                MariaDB is a community-developed fork of MyS…   2804                [OK]

Sem especificar um TAG, por padrão, ele puxará a versão mais recente da imagem, neste caso, MariaDB Server 10.3 no Ubuntu 18.04.
$ docker pull mariadb

Podemos verificar a imagem baixada.
$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
mariadb                                    latest              e07bb20373d8        2 weeks ago         349MB

Em seguida, criaremos dois diretórios em nosso diretório MariaDB Docker, um para o datadir e outro para os arquivos de configuração do MariaDB. Adicionaremos ambos em nosso MariaDB Docker Container.
$ cd ~/Docker
$ mkdir datadir
$ mkdir config

A configuração de inicialização é especificada no arquivo /etc/mysql/my.cnf e inclui todos os arquivos encontrados no diretório /etc/mysql/conf.d que terminam com .cnf.
$ tail -1 /etc/mysql/my.cnf
!includedir /etc/mysql/conf.d/

O conteúdo desses arquivos substituirá qualquer parâmetro repetido configurado em /etc/mysql/my.cnf, então você pode criar uma configuração alternativa aqui.

Vamos executar nosso primeiro MariaDB Docker Container:
$ docker run -d --name mariadb1 \
-p 33061:3306 \
-v ~/Docker/mariadb1/config:/etc/mysql/conf.d \
-v ~/Docker/mariadb1/datadir:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=dbtest \
mariadb

Depois disso, podemos verificar nossos contêineres em execução:
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                     NAMES
12805cc2d7b5        mariadb             "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:33061->3306/tcp   mariadb1

O registro do contêiner:
$ docker logs mariadb1
MySQL init process done. Ready for start up.
2019-06-03 23:18:01 0 [Note] mysqld (mysqld 10.3.15-MariaDB-1:10.3.15+maria~bionic) starting as process 1 ...
2019-06-03 23:18:01 0 [Note] InnoDB: Using Linux native AIO
2019-06-03 23:18:01 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-06-03 23:18:01 0 [Note] InnoDB: Uses event mutexes
2019-06-03 23:18:01 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-06-03 23:18:01 0 [Note] InnoDB: Number of pools: 1
2019-06-03 23:18:01 0 [Note] InnoDB: Using SSE2 crc32 instructions
2019-06-03 23:18:01 0 [Note] InnoDB: Initializing buffer pool, total size = 256M, instances = 1, chunk size = 128M
2019-06-03 23:18:01 0 [Note] InnoDB: Completed initialization of buffer pool
2019-06-03 23:18:01 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2019-06-03 23:18:01 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-06-03 23:18:01 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-06-03 23:18:01 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2019-06-03 23:18:02 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2019-06-03 23:18:02 0 [Note] InnoDB: Waiting for purge to start
2019-06-03 23:18:02 0 [Note] InnoDB: 10.3.15 started; log sequence number 1630824; transaction id 21
2019-06-03 23:18:02 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-06-03 23:18:02 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2019-06-03 23:18:02 0 [Note] Server socket created on IP: '::'.
2019-06-03 23:18:02 0 [Note] InnoDB: Buffer pool(s) load completed at 190603 23:18:02
2019-06-03 23:18:02 0 [Note] Reading of all Master_info entries succeded
2019-06-03 23:18:02 0 [Note] Added new Master_info '' to hash table
2019-06-03 23:18:02 0 [Note] mysqld: ready for connections.
Version: '10.3.15-MariaDB-1:10.3.15+maria~bionic'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution

E o conteúdo do nosso caminho datadir do Docker (host):
$ ls -l ~/Docker/mariadb1/datadir/
total 249664
-rw-rw----   1 sinsausti  staff     16384 Jun  3 20:18 aria_log.00000001
-rw-rw----   1 sinsausti  staff        52 Jun  3 20:18 aria_log_control
drwx------   3 sinsausti  staff        96 Jun  3 20:18 dbtest
-rw-rw----   1 sinsausti  staff       976 Jun  3 20:18 ib_buffer_pool
-rw-rw----   1 sinsausti  staff  50331648 Jun  3 20:18 ib_logfile0
-rw-rw----   1 sinsausti  staff  50331648 Jun  3 20:17 ib_logfile1
-rw-rw----   1 sinsausti  staff  12582912 Jun  3 20:18 ibdata1
-rw-rw----   1 sinsausti  staff  12582912 Jun  3 20:18 ibtmp1
-rw-rw----   1 sinsausti  staff         0 Jun  3 20:17 multi-master.info
drwx------  92 sinsausti  staff      2944 Jun  3 20:18 mysql
drwx------   3 sinsausti  staff        96 Jun  3 20:17 performance_schema
-rw-rw----   1 sinsausti  staff     24576 Jun  3 20:18 tc.log

Podemos acessar o container MariaDB executando o seguinte comando e usando a senha especificada na variável MYSQL_ROOT_PASSWORD:
$ docker exec -it mariadb1 bash
[email protected]:/# mysql -p -e "SHOW DATABASES;"
Enter password:
+--------------------+
| Database           |
+--------------------+
| dbtest             |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

Aqui podemos ver nosso dbtest criado.

Comandos do Docker


Por fim, vamos ver alguns comandos úteis para gerenciar o Docker.
  • Pesquisa de imagem
    $ docker search Image_Name
  • Download de imagem
    $ docker pull Image_Name
  • Liste as imagens instaladas
    $ docker images
  • Listar containers (adicionando o sinalizador -a podemos ver também os containers parados)
    $ docker ps -a
  • Excluir uma imagem do Docker
    $ docker rmi Image_Name
  • Excluir um contêiner do Docker (o contêiner deve ser interrompido)
    $ docker rm Container_Name
  • Execute um container a partir de uma imagem do Docker (adicionando o sinalizador -p podemos mapear uma porta do container para localhost)
    $ docker run -d --name Container_Name -p Host_Port:Guest_Port Image_Name
  • Parar contêiner
    $ docker stop Container_Name
  • Iniciar contêiner
    $ docker start Container_Name
  • Verifique os logs do contêiner
    $ docker logs Container_Name
  • Verifique as informações do contêiner
    $ docker inspect Container_Name
  • Crie um contêiner vinculado
    $ docker run -d --name Container_Name --link Container_Name:Image_Name Image_Name
  • Conecte-se a um contêiner de localhost
    $ docker exec -it Container_Name bash
  • Crie um contêiner com volume adicionado
    $ docker run -d --name Container_Name --volume=/home/docker/Container_Name/conf.d:/etc/mysql/conf.d Image_Name
  • Fazer alterações em uma nova imagem
    $ docker commit Container_ID Image_Name:TAG

Conclusão


O Docker é uma ferramenta realmente útil para compartilhar um ambiente de desenvolvimento facilmente usando um Dockerfile ou publicando uma imagem do Docker. Ao usá-lo, você pode ter certeza de que todos estão usando o mesmo ambiente. Ao mesmo tempo, também é útil recriar ou clonar um ambiente existente. O Docker pode compartilhar volumes, usar redes privadas, mapear portas e muito mais.

Neste blog, vimos como implantar o MariaDB Server no Docker como um servidor autônomo. Se você quiser usar um ambiente mais complexo como Replication ou Galera Cluster, você pode usar bitnami/mariadb para obter essa configuração.