SQL Server com Docker na EC2: container, túnel SSH e restore
Você conhece o SQL Server e quer rodá-lo em um container, na AWS, sem instalar nada na sua máquina. Aqui eu lanço uma EC2, subo o SQL Server com Docker, conecto pelo DBeaver por um túnel SSH e restauro o banco de exemplo AdventureWorks, da Microsoft.
Esta aula é de julho de 2023. Imagem, tag da versão e páginas da Microsoft mudam com o tempo: confira a página oficial da imagem no Docker Hub e o guia da Microsoft para rodar o SQL Server em container antes de copiar os comandos.
O que vamos montar
Uma EC2 com Docker. Dentro dela, um container com o SQL Server escutando na porta 1433, a porta padrão dele. Na minha máquina, o DBeaver fala com a porta local 1436, e um túnel SSH leva essa conexão até a 1433 da EC2.
Eu uso o DBeaver porque estou numa máquina Linux e não consigo instalar o SQL Server Management Studio. Qualquer cliente de SQL Server serve.
Não vou explicar o básico de Docker nem de lançar instância. Se for novo nisso, comece por Docker na EC2 e O que é Docker.
1Lançar a EC2 já preparada para o Docker
O SQL Server em container pede pelo menos 4 GB de memória. Por isso uso uma t3.medium, que tem 4 GB, e não uma t3.micro. Na aula, em 2023, o laboratório saiu por menos de 50 centavos com o ambiente ligado por duas horas. Confira o preço atual da t3.medium na sua região.
- Crie um security group só com SSH, liberado para o seu IP.
- Lance a instância: Amazon Linux, t3.medium, a VPC padrão, o security group que você criou e um par de chaves
.pem. Disco de 8 GB é suficiente. - Em Advanced details, cole um script de user data que instala o Docker. Usei o mesmo script do meu bootcamp, o
user data EC2 zona A, da pastascriptsdo projeto no GitHub. - No final desse script há um processo de swap. Tirei, porque aqui não precisa.
O user data deixa a máquina pronta com o Docker, sem eu rodar comando por comando depois. Quando a instância subir, conecte por SSH com o comando que o console mostra em Connect to instance.
2Subir o SQL Server no container
A imagem está no Docker Hub, repositório oficial do Docker. Pesquise "SQL Server Docker" no Google: o primeiro resultado é a página das imagens do SQL Server baseadas em Ubuntu, com a versão 2022 e o comando de exemplo. Copie dali e troque a senha:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<sua-senha-forte>" \
-p 1433:1433 -d mcr.microsoft.com/mssql/server:2022-latest
ACCEPT_EULA=Yaceita os termos de uso.MSSQL_SA_PASSWORDé a senha do usuário SA. Use maiúscula, minúscula e caractere especial.-p 1433:1433publica a porta do container na porta 1433 da EC2.
O Docker baixa a imagem do Docker Hub e sobe o container. Confira com docker ps: o container aparece rodando, com a 1433 mapeada.
3Abrir o túnel SSH e conectar no DBeaver
O security group só libera SSH, então o DBeaver não chega na 1433 direto. O túnel resolve: abra um novo terminal, na pasta onde está a chave .pem.
ssh -f -N -i <chave>.pem -L 1436:<ip-privado-da-ec2>:1433 ec2-user@<ip-publico-da-ec2>
-froda em segundo plano.-Nnão executa comando remoto: só abre o túnel.-Lredireciona a porta local 1436 para a 1433 da EC2. Usei a 1436 porque a 1435 eu já usava na minha máquina.- O destino é o IP privado da EC2, e a máquina de salto é a própria EC2, pelo IP público.
Na primeira tentativa recebi "permissão negada": faltava o ec2-user@ antes do IP. Com o usuário certo, o comando volta sem nenhuma saída, e saída vazia é sinal de que o túnel abriu.
No DBeaver, crie uma nova conexão do tipo SQL Server:
- Host
localhost, porta1436, bancomaster. - Usuário
sae a senha que você definiu nodocker run. - Clique em Test Connection. Se der certo, o DBeaver mostra a versão do servidor: SQL Server 2022.

Para ver o túnel SSH em outro cenário, leia Acesso seguro ao RDS: bastion host e túnel SSH.
4Baixar o AdventureWorks e copiar para dentro do container
Conectado, o banco AdventureWorks ainda não existe. Para restaurar um backup, o arquivo precisa estar no servidor, e o servidor aqui é o container. O arquivo precisa chegar até a EC2 e, dali, entrar no container.
Os bancos de exemplo estão no repositório da própria Microsoft: AdventureWorks, na página de releases do sql-server-samples. Usei o AdventureWorks 2022, mas pode ser o 2019. Na EC2, baixe direto com wget, colando o endereço do arquivo .bak:
wget <endereço-do-AdventureWorks2022.bak>
ls
O ls mostra o AdventureWorks2022.bak na EC2. Agora copie para dentro do container, na pasta padrão de dados e backup do SQL Server:
docker cp AdventureWorks2022.bak <id-do-container>:/var/opt/mssql/data
O <id-do-container> aparece no docker ps. Para confirmar que o arquivo chegou, entre no container e liste a pasta:
docker exec -ti <id-do-container> bash
ls /var/opt/mssql/data/

5Restaurar o banco
Faço o restore em dois passos, pelo editor SQL do próprio DBeaver.
Primeiro, descubra os nomes lógicos dos arquivos do backup:
RESTORE FILELISTONLY FROM DISK = 'AdventureWorks2022.bak';
A saída lista os dois arquivos do banco, o de dados e o de log. Vou usar esses nomes no próximo comando.
Depois, restaure o banco com um nome novo:
RESTORE DATABASE AdventureWorks
FROM DISK = 'AdventureWorks2022.bak'
WITH
MOVE 'AdventureWorks2022' TO '/var/opt/mssql/data/AdventureWorks2022.mdf',
MOVE 'AdventureWorks2022_log' TO '/var/opt/mssql/data/AdventureWorks2022_log.ldf';
- O
.mdfé o arquivo de dados e o.ldf, o de log. - Quem usa SQL Server já conhece esses arquivos. A diferença é o caminho: o que o FILELISTONLY mostra parece caminho de Windows, mas dentro do container é Linux, e vale o
/var/opt/mssql/data, onde você copiou o backup. - O
FROM DISKleva só o nome do arquivo, como noFILELISTONLY.
O comando termina com a mensagem de que o restore foi processado com sucesso.

Atualize a conexão no DBeaver e o banco AdventureWorks aparece, com as tabelas dos esquemas dbo, HumanResources, Person, Production, Purchasing e Sales.

Isso serve para desenvolvimento, não para produção
SQL Server em Docker é ótimo para você não precisar instalá-lo na sua máquina: sobe rápido e some rápido num ambiente de teste. Na minha opinião, para produção não serve. Em produção entram aplicar atualizações, restaurar um backup, fazer backup de tempos em tempos e ter mais disponibilidade, como um Multi-AZ. Fazer tudo isso à mão, com Docker, é muita complexidade para você gerenciar.
Para essa realidade a AWS tem o serviço certo, o RDS. Veja a documentação do Amazon RDS para SQL Server. Se nunca criou um banco no RDS, o caminho está em Criar um banco no RDS e conectar pelo DBeaver.
Desligue a EC2 no fim
Ao terminar, desligue a EC2 que lançou. Ela tem custo por hora enquanto estiver ligada.
Checklist
- Lancei a EC2 com pelo menos 4 GB de memória (t3.medium).
- O security group libera só o SSH, para o meu IP.
- O user data instalou o Docker e o
docker psfunciona. - Subi o container com
ACCEPT_EULA=Y, uma senha forte no SA e a porta 1433. - Abri o túnel SSH da porta local 1436 para a 1433 da EC2.
- Conectei no DBeaver em
localhost:1436com o usuáriosa. - Copiei o
.bakcomdocker cppara/var/opt/mssql/datae conferi comls. - Rodei o
RESTORE FILELISTONLYe depois oRESTORE DATABASEcom os doisMOVE. - Desliguei a EC2 no fim do laboratório.
O que os alunos dizem

“Depois do layoff, percebi que o mercado exigia AWS e eu não sabia nem por onde começar.”
Gisele, Desenvolvedora Java Sênior
Ver depoimento
“A metodologia da Formação AWS mudou tudo pra mim. Foi ela que consolidou meu conhecimento, me deu segurança e me levou a conquistar a vaga de Engenheiro de Cloud dentro da minha própria empresa.”
Harnon Ramalho, Engenheiro de Cloud
Ver depoimento
“A Formação AWS me deu a prática, a segurança e a clareza que eu nunca encontrei em nenhum outro curso.”
Jhon Wilame, SRE / DevOps Engineer
Ver depoimento
Formação AWS
Aprenda AWS e IA na prática, com projeto real e acompanhamento. Converse com o time sobre a Formação AWS.
Agende uma conversaPrefere assistir?
A aula completa (35 min) está no canal Domine AWS. O vídeo toca aqui mesmo.

