2.3 Instalação do Servidor de Banco de Dados
Last updated
Last updated
O primeiro servidor que iremos configurar será o servidor de banco de dados. Na terminologia Docker, vamos criar um arquivo, denominado Dockerfile, responsável por viabilizar a construção de uma imagem Docker. O ponto interessante aqui é que no Dockerfile, podemos utilizar uma imagem já existente e personalizá-la para a nossa realidade.
Posteriormente, a partir dessa imagem personalizada, criamos o contêiner que irá executar para o funcionamento da aplicação.
No caso do nosso servidor de banco de dados, nosso Dockerfile ficou assim:
Vamos detalhar cada linha desse arquivo a seguir. Para uma documentação completa de tudo o que o Dockerfile pode conter e a sintaxe de cada comando recomenda-se fortemente a documentação oficial do Dockerfile.
Na linha 1, especificamos qual a imagem que queremos personalizar, no caso, estamos utilizando uma imagem do mysql, especificamente, a da versão 5.6. Todas as opções de imagens disponíveis estáo no Docker Hub. A imagem abaixo, ilustra as versões do MySQL ofical que existem lá e em destaque, a que fazemos uso. Desse modo, para fazer uso de determinada versão, basta colocar o nome da imagem, seguido de ":", seguido da versão desejada conforme documentado no Docker Hub. Se desejássemos a última versão, pode exemplo, poderíamos utilizar apenas mysql
, ou então mysql:latest
.
A terceira linha, definimos um rótulo que indica os mantenedores desse arquivo de imagem:
Nas linhas de 5 a 8, instanciamos quatro variáveis de ambiente que serão utilizadas pela imagem para a instanciação do banco de dados conforme desejamos.
A primeira, ENV MYSQL_ROOT_PASSWORD secret
, indica para o MySQL qual a senha que será utilizada para acesso root
.
As demais são específicas para a aplicação em questão e indicam, respectivamente, o nome da base de dados que o sistema utiliza (ENV MYSQL_DATABASE loja_schema
), o usuário que tem acesso a essa base de dados (ENV MYSQL_USER loja
) e a senha desse usuário (ENV MYSQL_PASSWORD=lojasecret
).
Na linha 10, inserimos na imagem um script SQL que contém instruções importantes a serem executadas na instanciação do banco de dados. Todos os scripts incluídos em docker-entrypoint-initdb.d
são executados durante a inicialização do contêiner e, desse modo, tais ações são refletidas no banco de dados que iremos utilizar.
No nosso caso, a única coisa que fazemos dentro desse script é remover o usuário anônimo do servidor de banco de dados MySQL. O conteúdo do arquivo schema.sql
é dado abaixo.
Finalmente, a última linha do Dockerfile indica que os contêineres criados a partir dessa imagem irão expor a porta 3306, que é a porta padrão de conexão ao banco MySQL. Isso é o que permite o acesso ao contêiner por uma aplicação externa ou até mesmo por outro contêiner.
Uma vez criado o Dockerfile e todos os recursos que ele utiliza estarem disponíveis é possível construir uma imagem atualizada para atender as nossas necessidades.
Para facilitar a criação do nossos contêineres, no link abaixo é possível clonar o repositório que contém o Dockerfile e demais arquivos para a criação do nosso servidor MySQL.
Será clonado o repositório e, dentro do diretório devops-extra
, terá o diretório cap-02/docker-mysql-image
, com o conteúdo dos arquivos acima.
O primeiro passo, é construir a imagem do servidor com os comandos abaixo:
Como resultado do comando acima, o Docker fará o download da imagem do mysql:5.6
conforme solicitado e irá personalizá-la segundo as instruções do Dockerfile. O resultado é exibido abaixo:
A partir desse pondo, temos uma imagem pronta para ser utilizada para a criação de contêineres, conforme a nossa necessidade.
Nessa seção, iremos criar o contêiner, a partir da imagem criada acima, que servirá como o servidor de banco de dados para a nossa aplicação da loja virtual.
O comando Docker para a criação de um contêiner a partir de uma imagem é o docker run
. No nosso caso, ele será executado com os parâmetros abaixo, explicados a seguir.
A imagem abaixo, apresenta um trecho da saída produzida pela execução do comando acima.
Observe que o servidor permanece em execução dentro do contêiner e o prompt não é liberado. Para verificar o status dos contêineres pode-se utilizar o comando docker ps -a
. Isso mostra o status de todos os contêineres disponíveis em execução ou não.
Por exemplo, a execução do comando nesse momento resultaria numa saída semelhante a ilustrada abaixo:
Observe que tais informações são importantes para monitorarmos o status de cada contêiner no nosso sistema. Ele apresenta o 1) Container ID, que identifica unicamente um contêiner; 2) qual a imagem que o originou; 3) qual o ponto de entrada do contêiner; 4) quando foi criado; 5) se está em execução (Up) ou não; 6) quais portas o contêiner expõe; e 6) os nomes dos contêineres.
Agora vamos analisar os parâmetros do comando docker run
acima.
O primeiro parâmetro --name mysql-server
, permite nomear o contêiner para, posteriormente, utilizarmos esse nome, ao invés do Conteiner ID
, para a execução de outros comandos Docker. Isso porque, uma vez que o contêiner é criado, o Docker atribui a esse contêiner um identificador, denominado Conteiner ID
e um nome genérico, caso o parâmetro --name
não seja utilizado.
Por exemplo, se desejar obter informações detalhadas sobre um contêiner específico, pode-se utilizar o comando docker inspect. Esse comando aceita de parâmetro ou o Contêiner ID ou seu nome. No exemplo acima, ele funcionaria de maneira idêntica se fosse utilizado:
Continuando, o segundo parâmetro, -v data:/var/lib/mysql
, permite a criação de um volume de dados que pode ser compartilhado entre o sistema hospedeiro e o contêiner. No caso, o diretório local data
será "conectado" ao diretório /var/lib/mysql
do contêiner. Desse modo, dados existentes em data
passam a ser visíveis dentro do contêiner e dados produzidos durante a execução do contêiner em /var/lib/mysql
são salvos também fora do contêiner no diretório local data
. Essa é uma forma de persistir os dados gerados pelo contêiner, mesmo após a sua destruição.
O terceiro parâmetro -p 3306:3306
ou --publish
é permite publicar a porta de um contêiner para fora dele. Por padrão, um contêiner não publica suas portas para acesso externo. No caso de nossa imagem, informamos que ela iria expor a porta 3306
. O parâmetro -p
indica isso. O segundo número é o número da porta no contêiner, 3306, e o primeiro é qual número da porta queremos utilizar no localhost
. No caso, optamos por usar o mesmo por não haver conflito. Mas poderia ser algo do tipo: -p 3310:3306
, em que a porta 3306
do contêiner estará acessível no localhost
na porta 3310
, por exemplo.
Finalmente, o último parâmetro é o nome da imagem a partir da qual iremos criar um contêiner. No exemplo acima, o nome da imagem utilizada no comando docker build
foi mysql-server
.
Após a execução do docker run
, ilustrado acima, o contêiner está em funcionamento. É possível se conectar a ele e abrir um prompt para a execução de comandos via mysql. Por exemplo, para ter certeza que as configurações exigidas para a loja virtual estão corretas, tais como, nome da base, usuário e senhas de acesso, é possível utilizar o comando abaixo:
O comando docker exec
permite executar um comando dentro da máquina especificada. No caso, estamos solicitando a execução do bash
, dentro do contêiner mysql-server
de forma interativa (parâmetro -it
).
Como resultado, será aberto um prompt bash
dentro do contêiner, conforme ilustrado abaixo:
No exemplo, foi utilizado o usuário loja
, com a senha lojasecret
, conforme documentado no Dockerfile
e, além disso, ao consultar as bases de dados disponíveis, observa-se que existe a base loja_schema
disponível para uso desse usuário.
Observa-se que a execução do comando exec
não cria um novo contêiner, ele apenas permite a execução de um comando dentro do contêiner em execução. Ao se pressionar CTRL+D
no prompt, conforme ilustrado na linha 26 acima, essa execução é encerrada mas, o contêiner, continua em execução. Para se ter certeza disso basta executar um docker ps
para confirmar.
Perfeito até aqui. Uma última coisa que é necessário descobrir para continuar com a configuração do Servidor Web é descobrir qual o número IP que o contêiner do servidor de banco de dados está usando. Para isso utilizaremos o comando docker inspect
que fornece todos os detalhes de um contêiner em execução. Para simplificar a saída de dados, será aplicado um filtro para que seja exibido apenas a informação que necessitamos mas, se estiver curioso para ver tudo o que esse comando pode lhe mostrar basta chamar apenas como docker inspect mysql-server
. No nosso caso, como resultado, observa-se que o servidor MySQL está em execução no IP 172.17.0.2
. Possivelmente, na sua máquina, aparecerá um número diferente. Anote-o pois será necessário usá-lo na próxima seção para configurar a integração do Servidor Web com o servidor de banco de dados.