Vamos realizar o pull da imagem de container do SQL Server e utiliza-la para criar e executar o container que proverá um serviço de banco de dados da Microsoft sob o host atual.
Lembrando que, a configuração a seguir utilizará a persistência de dados, pois ao finalizar o container, por padrão os dados serão perdidos, e em muitas situações a perda dos dados gerados durante a execução do container não é aceitável.
Entretanto, tudo dependerá da finalidade do container, afinal, podemos executar um container, gerar informações nele, mas tais informações poderem ser descartadas ou as mesmas já terem sido armazenadas em outro host ou container que utiliza persistência de dados.
No host containernode01 (192.168.0.161) execute:
docker run -name SQLServer01 -e 'ACCEPT_EULA=Y' \
-e 'SA_PASSWORD=#AdminSQLServer2017' \
-p 1433:1433 -v volumeDatabase:/var/opt/mssql \
-d microsoft/mssql-server-linux
Aguarde o pull da imagem para que o container seja criado e entre em execução.
O comando acima pode ser entendido da seguinte maneira:
- run - esta opção realiza três ações: pull da imagem, criação do container e em seguida execução do container criado.
- -e - permite a criação de variáveis de ambiente sob o ambiente de execução do container. No caso acima, foram criadas duas variáveis de ambiente: ACCEPT_EULA recebendo o valor Y e SA_PASSWORD recebendo o valor #AdminSQLServer2017 (que será a senha da conta System Administrator do SQL Server). Deste modo, durante a execução do binário existente na imagem que sofreu o pull, este binário irá verificar a existências destas variáveis e utilizar os valores setados nelas. A variável ACCEPT_EULA permite que definir se os termos da licença de uso serão aceitos.
- -p - permite realizar o mapeamento de portas. No caso acima, qualquer conexão a porta 1433 ( valor numérico a esquerda dos : ) será redirecionada para a porta 1433 ( valor numérico a direita dos : ) em listening no container.
- -d - executará o container em modo background.
- -v - anexará um volume externo a um volume dentro do container, no caso, teremos o mapeamento do volume criado e gerenciado pelo serviço DRBD (volumeDatabase) existente no host físico para o diretório /var/opt/mssql existente no container.
Portanto, a ação de criação, exclusão e alteração ocorrida em /var/opt/mssql dentro do container também ocorrerá em no volume volumeDatabase, que por sua vez realizará o armazenamento no host físico onde o container é executado e os blocos de dados serão replicado para o segundo nó do Cluster.
- -name - Define o nome que o container terá ao ser criado.
Em seguida verifique se o container está em execução:
docker ps
Caso o container não seja listado, então execute novamente o comando docker run sem a opção -d.
Para podermos visualizar no console qualquer mensagem de erro durante a inicialização dos binários do container. Um erro muito comum é a falta de memória no host, lembrando que a recomendação mínima são 4 GB.
Outra opção muito importante para verificar a inicialização de serviços/binários dentro de um container é a opção logs, portanto, você pode verificar da seguinte maneira:
docker logs SQLServer01
Verificada a existência de algum erro (por exemplo, quantidade de memória insuficiente), abra outro terminal e pare o container com o comando:
docker stop SQLServer01
Para executar novamente o container, basta executar:
docker start SQLServer01
Verifique novamente se o container está em execução:
docker ps
Inspecione as propriedades do volume que criamos anteriormente. Esta etapa permite verificar por exemplo, onde nosso volume está montado atualmente, bem como, verificar que o mesmo trata-se de um volume de dados replicado via DRBD:
docker volume inspect volumeDatabase
No ambiente em que estamos utilizando, as seguintes informações foram expostas:
"Driver": "drbdmanage",
"Labels": {},
"Mountpoint": "/run/docker/drbdmanage/mnt/volumeDatabase",
"Name": "volumeDatabase",
"Options": {
"fs": "ext4",
"size": "400"
},
"Scope": "local"
Execute o comando mount para confirmar que o volume está sob um device de replicação em bloco DRBD:
mount | grep volumeDatabase
A indicação do device /dev/drbdXXX indica que o volume está sob DRBD, onde XXX indica o valor atribuído no momento para o nome do dispositivo DRBD.
Podemos verificar que durante o carregamento do serviço o Microsoft SQL Server dentro do container, diversos arquivos, incluindo os datafiles foram criados, simplesmente listando os arquivos do ponto de montagem verificado anteriormente.
Para listar os datafiles do serviço do SQL Server, execute:
ls /var/run/docker/drbdmanage/mnt/volumeDatabase/
Com o container em execução iremos estabelecer uma sessão de usuário com o serviço em execução sob o Container.
Dentro das das vantagens clássicas de container temos isolamento, portabilidade e flexibilidade, e graças a isso podemos não apenas executar binários e bibliotecas existentes em uma imagem na forma de um container que atuará como serviço, mas também podemos simplesmente realizar a chamada a outros binários existentes no container já em execução, por exemplo, um binário que represente uma ferramenta de linha de comando que faz parte da solução empacotada dentro da imagem.
Iremos iniciar o binário bastante conhecido por DBAs que trabalham com SQL Server, o sqlcmd para estabelecermos uma sessão de usuário com o serviço do SQL Server.
docker exec -it SQLServer01 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P#AdminSQLServer2017
A opção exec realiza a chamada a binários existentes dentro de um container em execução, ou seja, sem precisar criar um novo container apenas para executar um binário já existente na imagem que foi utilizada de base para a criação do container anterior.
Já as opções -it permitem que durante a execução do binário sqlcmd seja possível estabelecer a interação entre entre o shell e o binário em execução no momento.
Após a execução do binário sqlcmd será exibido o prompt do SQL Server.
Execute a instrução SQL select a seguir acompanhada da instrução GO:
SELECT Name from sys.Databases;
GO
Serão exibidos os databases padrão do SQL Server, no caso:
Realizaremos a seguir algumas operações simples em SQL:
- Criação de um database;
- Abertura do database;
- Criação de uma tabela;
- Inserção de registros nesta tabela;
- Consulta de registros.
create database empresa;
go
use empresa;
go
create table cliente (codigo integer, nome varchar(80), primary key(codigo));
go
insert into cliente values (1,"Linus Torvalds");
go
insert into cliente values (2,"Dennis Ritchie");
go
select * from cliente;
go
exit
Com a sessão finalizada com a instrução exit, iremos parar o container e inicia-lo novamente para comprovar que a persistência de dados está sendo realizada corretamente.
docker stop SQLServer01
Verifique se o container não encontra-se mais em execução:
docker ps
Inicie o container novamente e verifique que o binário do serviço do SQL Server em execução sob o container irá obter acesso aos datafiles:
docker start SQLServer01
Execute o binário do cliente sqlcmd novamente:
docker exec -it SQLServer01 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P#AdminSQLServer2017
Liste os databases existentes:
SELECT Name from sys.Databases;
go
quit