Configurando o contêiner Docker em um Cloud

Configurando Contêiner Docker em um cloud

Imagem ilustrativa sobre Contêiner Docker

Seguindo o assunto de conteinerização hoje trago um artigo prático onde vou configurar o Contêiner Docker dentro de uma instância Cloud. Para isto Utilizarei a nossa plataforma DialCloud.

Para quem quiser seguir desde o começo, deixo aqui o link do primeiro post sobre o assunto VMS vs Containers quais diferenças e usos?

Contêiner Docker

Só para recaptular o Contêiner Docker trabalha em cima do Kernel do Linux para permitir que uma aplicação ganhe em portabilidade, isolamento, segurança contra violação externa, Além de permitir o melhor gerenciamento de recursos.

Cada contêiner Docker irá iniciar uma imagem Docker, o que equivaleria a uma imagem virtual para a virtualização de máquina. Mas, no caso do Docker temos o benefício de eles utilizarem muito menos recursos, já que eles são baseados em um mesmo kernel. Através dele conseguimos uma base confiável de tudo que é necessário para executar as aplicações. Desta forma o Contêiner fica livre dos riscos externos causados pelas dependências.

Dockerfiles

Estes scripts são os responsáveis pelas orientações que devem ser executadas na montagem de uma nova imagem. Estes Scripts substituem o processo manual de configurar uma imagem para cada Contêiner que você for utilizar.

Prontos para começar

Agora que já deixamos claro os conceitos básicos para a conteinerização vamos iniciar a instalação. Primeiramente temos que criar uma instância. No caso peguei uma instância simples com 8GB de RAM e 40GB de disco e Ubuntu 14.04. Chamei ela em meu painel de docker-test, como podem ver abaixo.

Painel DialCloud

Imagem do Painel DialCloud

Com esta instância montada e com todos os dados SSH em mãos vamos aos comandos de instalação.

Instalando o Docker

Com o acesso root em mãos vou entrar na máquina e buscar por atualizações do droplet. Para isto basta executar os comandos:

Só por garantia, confira se seu sistema tem suporte ao  aufs (Ele é um controlador de armazenamento utilizado pelo Docker).

Agora temos que adicionar a chave e o repositório do Docker aos arquivos, apt-key e ao sources list

Faça um novo update no droplet com o primeiro comando que eu passei aqui e então instale o docker 🙂 \o/!

O Ubuntu possui um Firewall padrão que bloqueia o encaminhamento de pacotes. Este encaminhamento de pacotes é necessário para o funcionamento do docker. Assim, teremos que editar o arquivo ufw para liberar o encaminhamento.

Para isto entre no arquivo e então configure a opção DEFAULT_FORWARD_POLICY como “ACCEPT”

Salve o arquivo e recarregue o UFW

 

Pronto, agora que seu docker está instalado você pode começar a montar seus contêineres utilizando imagens criadas por você, ou o que é mais legal ainda, buscando uma imagem publica oficial ou deixada pela comunidade através da docker Store.

Baixando uma imagem

Para um exemplo prático, vou buscar a imagem oficial hello world do Docker para fazer a instalação. Primeiramente a gente baixa a imagem para a máquina.

Agora que a imagem já está na minha máquina eu posso criar um novo contêiner. Vale lembrar que não é possível criar um contêiner vazio, sem nenhuma execução. Por isso precisamos de uma imagem base. No exemplo abaixo eu vou criar um contêiner definindo o nome dele de my-hello e instalar minha imagem hello-world.

Uma vez instalado você pode executar ele rodando o comando abaixo com o ID do contêiner

Agora basta você usufruir do contêiner Docker e a cada atualização que você fizer, não se esqueça de atualizar o dockerfile para não perder a portabilidade dele.

Felipe Moraes
Felipe Moraes

Desde pequeno eu adorei tecnologia e este sentimento me fez estudar e trabalhar com desenvolvimento, design de interfaces e interação. Esta vontade de melhorar e aprender com a tecnologia me fez estar aqui na DialHost desde 2012.

Separando sua aplicação do Banco de Dados com instâncias cloud

Instância cloud

Imagem ilustrativa: Separando o banco de dados e aplicação em instâncias cloud  – Freepik

Há algum tempo atrás nós trouxemos para você uma forma avançada de se separar responsabilidades do sistema através do Cluster de banco de dados. Em resumo, esta arquitetura separava seu projeto em instâncias cloud. A ideia é criar um grupo de banco de dados com responsabilidades semelhantes (leitura e escrita) ou não (Só leitura, só escrita) e através de um load balancer podemos balancear a carga de processos em cada servidor.

Hoje explicarei de uma forma mais prática, uma arquitetura que pode encaixar melhor em projetos médios. São comuns exemplos, os mais diversos blogs e lojas virtuais que, apesar de não serem uma americanas, um submarino ou um globo.com, começaram a enfrentar problemas pelo alto fluxo de consultas nos bancos de dados. Estes por sua vez estão trazendo demora ou instabilidade na aplicação web.

Quando fazer a separação em instâncias cloud

Reuni algumas perguntas que você deve se fazer antes de sair contratando ou separando novas instâncias cloud. Afinal, a ideia é otimizar seu sistema mas, não sair separando tudo por mero luxo certo.

  1. Sua aplicação está mais lenta que o normal?
  2. Ela está sofrendo com picos de instabilidade ou até mesmo saindo do ar em determinados momentos do dia?
  3. Durante estes picos e estas demoras, os processos envolvidos são relacionados a uma consulta no banco, ou em salvar algum dado neste?
  4. Ao executar o comando top em seu bash, as estatísticas de uso de recursos estão bem altas e o processo relacionado ao banco de dados está entre os maiores?

Você deve ter percebido que se seu projeto está nesta situação é melhor tomar uma atitude. Então tendo tudo analisado vamos a parte prática.

Mão na massa! Colocando meu Banco de dados em outra instância cloud

Para isto, utilizarei o painel do DialCloud+. Com ele você conseguirá configurar cada instância com os recursos necessários a cada projeto.

Para ilustração deixo este esquema de como funcionará este exemplo de arquitetura. Basicamente estamos deixando seu banco dados dedicado em uma instância com seus recursos próprios.

Banco de dados dedicado em uma instância cloud

Arquitetura com banco de dados dedicado

Com esta imagem em mente, podemos seguir ;).

Abaixo podemos ver que toda a aplicação se encontra em apenas uma instância. Nesta instância temos instalados o SO, o apache, o MySQL, PHP e entre diversas outras aplicações. O caso é que, como citado acima, eu identifiquei que meu banco de dados começou a consumir grande parte da minha memória e acaba por utilizar minhas 4 vCPUs disponíveis o que deixa todo o meu sistema em cheque.

 

instâncias cloud

Tela de instâncias do DialCloud +

É claro que neste exemplo terei de optar por aumentar um pouco meus recursos. Mas, simplesmente aumentá-los não seria suficiente já que isto não evita que meu banco de dados, em um momento de desespero, acabe por utilizar 6vCPUs. Por isto, a ideia aqui é pegar este banco de dados e migrar ele para outro servidor.

Para que seu sistema não fique fora durante todo o tempo da migração e para minimizar todo e qualquer impacto, vamos pegar os novos recursos e montar uma instância de banco de dados mínima. Esta estrutura servirá de base para configurarmos o que virá a ser nosso servidor final.

Nova instância

Tela de nova instância do DialCloud +

Como pode ver montei uma pequena instância com os recursos mínimos para que eu pudesse configurar meu novo servidor de banco de dados.

Migrando meu banco de dados

E ai vem a grande dica! Como agora tenho um servidor que será responsável apenas por receber e responder consultas de banco, posso simplesmente ignorar a instalação de vários módulos e aplicações de servidor que acabam por consumir um pouco do meu processamento e instalar apenas por exemplo o MySQL. Menos recurso para aplicações, mais recurso para o banco.
Ao terminar a instalação da nova instância eu preciso exportar o banco que está em produção e então importar no servidor novo. Apesar de rápido, este é o momento que exige maior atenção, pois terei que colocar meu serviço em manutenção momentânea para que não perca nenhum dado no meio do processo. Afinal enquanto faço isto, meus usuários estariam utilizando meu app.

Outra dica é não fazer isto em um dia ou horário de pico de acesso, assim você terá mais tranquilidade para fazer o processo.

Agora eu preciso fazer minha aplicação comunicar com este novo banco de dados, mas não se preocupe. Com a criação da nova instância minha tela de network mostra uma nova rede interna que foi criada entre estas 2 instâncias cloud. Basta eu pegar o ip interno referente ao servidor de banco de dados e colocar no host das configurações de banco de dados da minha aplicação.

Tela de rede interna no DialCloud +

Tela de rede interna no DialCloud +

Para garantir mais proteção aos meus dados, vou configurar o acesso do ip externo apenas para a instância de aplicação. Faço isso configurando o Port forwarding e no caso do serviço do DialCloud+ libero o acesso externo no firewall (Esta é uma proteção a mais disponibilizada na DialHost gratuitamente) através do Outbound Firewall.

Tela de Port Forwarding no DialCloud +

Tela de Port Forwarding no DialCloud +

Realocando recursos

Tá mas, meu processo que exigia mais recursos tem bem menos recursos. Bem, como eu disse antes, esse era um servidor base para a migração. Agora é só ir nas configurações das instâncias e escalonar os recursos. Assim, você poderá destinar mais para seu banco de dados e menos para sua aplicação.

Concluindo

Esta arquitetura possui uma distribuição mais simples se comparada com a de cluster de dados. Por ser mais simples, ela pode ser mais comum para o dia a dia de diversos projetos. Ainda assim, ela é uma ótima opção pois propicia:

  • Menor custo com recursos de máquina.
  • Melhor distribuição das responsabilidades do servidor o que falicita seu escalonamento.
  • Maior segurança dos dados, já que seu banco de dados não terá acesso por outro lugar que não sua aplicação.
Tenha controle e flexibilidade nos seus recursos com DialCloud +. Servidores em cloud com load balancing, VPN e todo o controle de rede que você precisa. Saiba Mais.

 

DialHost
DialHost

Contamos com nosso DataCenter no Brasil de alta qualidade, estabilidade e confiança para hospedar seu site. Utilize poderosas ferramentas para otimizar o uso do seu serviço e seja sempre atendido de forma rápida e clara pelo nosso atendimento 24h.

É possível ter segurança em Servidores Cloud?

segurança em Cloud computing

Imagem ilustrativa sobre segurança em Cloud computing – fonte Freepik

Antes de dar minha opinião, explicarei algumas dicas para serem aplicadas em seu servidor cloud. Em seguida demonstrarei algumas funcionalidades utilizando a ferramenta da DialHost que auxilia na configuração de algumas regras que melhoram a segurança.

Primeiramente temos sempre que manter uma atenção especial na segurança de nossos servidores. Pois há uma evolução constante dos tipos de ataque e defesa.
As tecnologias evoluíram. E com elas, os hackers que cada vez mais ágeis e habilidosos, encontram brechas para burlar sistemas de gerenciamento e informações sigilosas de empresas e instituições.

Mas para que você tenha mais garantias contra estes tipos de ataques seguem algumas dicas para ajudar na proteção do seu servidor

Mantenha atualizado os pacotes e kernel do servidor

Ao deixar seu kernel desatualizado você perde todas as atualizações de segurança, melhorias de estabilidade, atualizações de drivers e funcões que foram desenvolvidas nas novas versões.

Instale um detector de brute force

O ataque brute force é uma técnica hacker que costuma utilizar um dicionário de usuários e senhas para realizar o acesso a algum sistema. Através destas combinações ele tenta constantemente realizar acessos até que um destes dados sejam validados e finalmente o sistema seja aberto.

O detector de brute force, por outro lado fica analisando tentativas sucessivas de acessos vindas de um mesmo IP. Através desta repetição ele bloqueia o acesso do IP malicioso e assim, mata o processo iniciado pelo robô hacker. Um exemplo de sistema detector de brute force é o Fail2Ban.

Desabilite o acesso Root via SSH

Sabemos que o acesso root permite mais facilidades para o usuário avançado, mas como já dizia o tio Ben “Grandes poderes trazem grandes responsabilidades”. Por isso, desabilite este usuário via SSH e crie usuários apenas com as permissões necessárias para o seu projeto e manutenção do mesmo.

root

Crie chaves para o acesso via SSH

Ao fazer um acesso via SSH utilizando chaves de acesso, você garante que seu acesso terá um conjunto longo e complexo de caracteres. Por outro lado o acesso através apenas de senha tendem a ser previsíveis ou fáceis para ataques do tipo brute force.

Mude a porta de acesso do SSH

A alteração da porta de acesso do ssh é importante para retardar a atuação de portscaner que buscam primeiramente as portas default dos serviços como “22,23,53,80,443,21”. Alterando sua porta de acesso estes scaners vão cair em uma porta fechada.

Para realizar esta alteração recomendo que utilize o port forwarding assim seu acesso interno se mantém na porta original, mas seu acesso público pode ser redirecionado para outra porta como 7021, por exemplo.

Busque informações de segurança para os serviços ativados

É normal que serviços famosos possuam em seus próprios cores soluções de segurança ou mesmo pacotes que auxiliam na segurança. Serviços como Apache, Nginx entre outros vão te disponibilizar constantemente novas opções de segurança. Mas, é importante que quem esteja gerenciando suas instâncias fique sempre informado sobre novas soluções. Assim, você pode ficar mais tranquilo contra ataques hackers.

Instale um Firewall

Na DialHost, por exemplo, ao contratar um plano DialCloud+, é disponibilizada uma ferramenta para configuração do Firewall. Assim, você pode garantir mais segurança nas suas instâncias uma forma simples.

Outra análise que vale informar é que as instâncias estão protegidas em um rede totalmente privada. Outros clientes não tem nenhuma comunicação com suas instâncias criadas.

Veja como é simples a criação das regras

Tela do sistema DialCloud - Adicionando regra de segurança do Firewall

Tela do sistema DialCloud – Adicionando regra de Firewall

No campo IP, será exibido o seu IP Público para os acessos.
CDIR: Você informar um range ou único IP permitido para acessar a porta.
Start Port: O inicio de uma série de portas ou a definição de uma única porta
End Port: A última porta a ser liberada ou a mesma informada para o início.
Protocolo: Define qual tipo de protocolo como TCP, UDP ou ICMP.

Após adicionar as regras desejadas, o resultado ficará como abaixo.
Simples de ser visualizado, configurado e reconfigurado.

Tela do sistema DialCloud - inbound Firewall

Tela do sistema DialCloud – inbound Firewall

Concluindo

Sobre a pergunta proposta no inicio, na minha opinião não podemos afirmar que estamos 100% protegidos contra os invasores. Este é um trabalho onde temos que estar atentos e atualizados às práticas mais atuais para nos proteger.

Os invasores sempre vão preferir servidores desatualizados e que possuam mais brechas para a invasão. Dificultar as invasões com o Firewall e outras ferramentas de proteção é uma atividade contínua dos administradores dos servidores.

Referências

http://www.makeuseof.com/tag/5-reasons-update-kernel-linux/
http://www.liquidweb.com/kb/what-is-brute-force-detection-bfd/
https://www.vivaolinux.com.br/dica/Alterando-a-porta-do-servico-SSH

Tenha controle e flexibilidade nos seus recursos com DialCloud +. Servidores em cloud com load balancing, VPN e todo o controle de rede que você precisa. Saiba Mais.

 

Márcio Rubens
Márcio Rubens

Sou Analista de TI na DialHost, pós-graduado em Gestão de Segurança da Informação pela PUC-MG e graduado em Gestão da Tecnologia da Informação pela UNI-BH.

Ambiente de testes e desenvolvimento na nuvem

Ambiente de testes e desenvolvimento

Ilustração – Ambiente de testes e desenvolvimento

Toda equipe de desenvolvimento precisa da segurança de um ambiente de desenvolvimento para programar novas aplicações ou atualizações nos serviços. Mesmo quem tem pouca experiência em programação já deve saber da instabilidade que uma aplicação passa durante seu período de desenvolvimento. E ainda que tudo já esteja correto, ao ver dos desenvolvedores, um ambiente de testes  deve simular o produto que irá para produção.

Ambiente de desenvolvimento

O momento de desenvolvimento de um projeto é aquele período liberado para erros. E acredite, por melhor que seja o desenvolvedor envolvido no projeto uma coisa é certa, erros ocorrerão enquanto ele está programando uma classe ou integrando alguma api e etc.

E são diversos os erros: erros lógicos, de sintaxe, exceptions, sem contar em dados que podem ser apagados por uma simples linha de comando mal executada. Agora imagina se todos esses problemas ocorressem em pleno ambiente de produção, com os clientes acessando a todo tempo, enquanto você está descabelando para resolver o problema em uma maratona sem fim.

Via Giphy - Erros em ambiente de testes

Então, caso você ainda não tenha percebido esta necessidade, peço que pare a leitura aqui e vá configurar um ambiente de desenvolvimento para você, hehe. Afinal, esta prevenção pode evitar que você faça algo desastroso no final.

É muito comum desenvolvedores autônomos e individuais trabalharem em ambientes locais de desenvolvimento. Esta é uma opção barata e já garante grande autonomia para que você possa errar até acertar em cheio. Mas, em uma equipe grande e/ou que trabalhe remoto, como garantir as configurações ideais para que cada desenvolvedor consiga trabalhar e compartilhar seus códigos com toda equipe?

Ambiente de desenvolvimento em nuvem

Respondendo ao parágrafo anterior, um ambiente de desenvolvimento em nuvem é uma opção que foi adotada por diversas equipes. Pelo seu caráter instável, o ambiente de desenvolvimento exige das equipes necessidades muito variáveis de recursos, dependendo do ciclo de desenvolvimento das mesmas. Assim, uma solução em cloud computing se adapta bem fornecendo recursos sob medida para a necessidade atual. E quando esta necessidade acabar é possível reajustar cada recurso de volta para a nova necessidade.

Além disto, com a infraestrutura em nuvem é bem mais fácil de padronizar as configurações do ambiente.  E com um ambiente padrão seus desenvolvedores não terão surpresas de incompatibilidades durante esta etapa. Imagine manter padronizada as configurações de desenvolvimento de cada servidor local em uma equipe de 50 colaboradores que trabalham remoto.

Aqui na DialHost, por exemplo, temos um ambiente de desenvolvimento enxuto para que a equipe inicie qualquer projeto ou feature. E sempre que necessário reescalamos os recursos para um novo projeto. Além disto, ao vermos a necessidade, podemos reduzir nossos recursos caso eles estejam ociosos. Isto tudo é possível graças a estrutura que montamos para o DialCloud +

Ambiente de testes em nuvem

Durante todo o processo de desenvolvimento os testes são parte integrante. Cada item, cada funcionalidade deve ser testada em diversos aspectos. Claro que de acordo com a complexidade alcançada em cada empresa, este processo pode ser mais dividido ou ser um simples teste de usabilidade com o usuário final.

O fato aqui é que o ambiente de testes proporciona que seus testes mantenham a segurança dos dados que já estão em produção. Assim tudo que foi desenvolvido pode ser colocado a prova.

Neste ponto a escalabilidade da estrutura em cloud computing se torna ainda mais eficiente. Afinal, testes são frequentes mas, sempre possuem um ponto final para que sejam coletados os resultados e assim passemos para a correção dos problemas encontrados.

Com a escalabilidade podemos subir uma nova instância apenas as configurações necessárias. Ao final  da análise dos testes é possível finalizar a instância reduzindo assim seu custo operacional novamente.

Por fim, ao utilizar esta estrutura para testes, podemos simular funcionalidades avançadas, ainda na fase de testes. Exemplo disso seria a necessidade de balancear cargas após identificar algum gargalo durante um teste de carga.

Vantagens

  • Melhor custo e flexibilidade de recursos para o desenvolvimento do projeto
  • Melhor controle nas configurações padrões de cada ambiente para cada desenvolvedor
  • Facilidade na padronização das configurações de desenvolvimento, teste  e produção
  • Possibilidade de testar diferentes configurações, recursos e cargas
  • Possibilidade de utilizar serviços avançados que requerem tecnologias ou competências que não estão disponíveis em sua estrutura interna
  • No caso de uma equipe grande é possível reduzir bem o custo com infraestruturas nestes ambientes.

Desvantagens

  • Você dependerá sempre de uma conexão com a internet
  • Apesar de pequena a chance (Considerando bons data centers), é preciso pensar em uma solução para caso a nuvem falhe.
  • Ainda é necessário se preocupar com estratégias de backup e recuperação e possíveis perdas de dados durante testes.

Algumas Referências

Tenha controle e flexibilidade nos seus recursos com DialCloud +. Servidores em cloud com load balancing, VPN e todo o controle de rede que você precisa. Saiba Mais.

 

Felipe Moraes
Felipe Moraes

Desde pequeno eu adorei tecnologia e este sentimento me fez estudar e trabalhar com desenvolvimento, design de interfaces e interação. Esta vontade de melhorar e aprender com a tecnologia me fez estar aqui na DialHost desde 2012.

Load Balance para meu site

Imagem ilustrativa Load Balance

Imagem ilustrativa Load Balance

No último post da nossa série sobre cloud computing falamos sobre clusters de banco de dados e a utilização de uma camada de load balancing para controlar o fluxo das requisições. Hoje iremos aprofundar mais nesta camada apresentando um pouco sobre a configuração da mesma.

Vamos iniciar esta abordagem com aquele grande momento tão esperado. Seu site sendo visualizado por milhares de pessoas.  Neste mesmo momento vivemos um momento de grande felicidade, acompanhada aquela dor de cabeça. Isto porque, você nota que a estrutura atual do servidor não está suportando a demanda.

Não se preocupe! O Load Balance pode solucionar isto.

Muitos sites possuem milhares de requisições simultâneas e para ajudar nesta atividade o conceito de Load Balance ( balanceamento de carga ) nos ajudará a suportar a demanda das requisições.

O conceito de Load Balance é uma técnica para distribuir a carga de trabalho uniformemente entre duas ou mais instâncias, a fim de otimizar a utilização de recursos, maximizar o desempenho, minimizar o tempo de resposta e evitar sobrecarga.

Uma observação para este projeto é da necessidade da unificação dos arquivos em um única instância e utilizar o NFS ou outra forma, para compartilhar os arquivos com as demais instâncias.

Exemplo de uma estrutura utilizando o NFS

Exemplo de uma estrutura utilizando o NFS

Há diversos softwares que realizam está atividade de Load Balance como por exemplo Nginx, Haproxy, Balance e outros….

Vou ilustrar aqui uma configuração realizada no Haproxy de uma forma bem simples, mas utilizando a ferramenta disponibilizada gratuitamente para todos os clientes DialCloud+ da DialHost

load balancing

Configurando load balancing com DialCloud +

Ao clicar sobre a aba Load Balancing, será visualizada a tela acima:

IP Público: IP no qual sua instância está utilizando para receber as conexões externas.
Nome: Nome para a configuração.
Porta Pública: Porta na qual os clientes estarão utilizando para conectar a sua aplicação para visualizar o seu site. Exemplo: porta 80 HTTP
Porta Privada: Porta do serviço configurado na instância para receber as requisições.

Algorítimos

Round-robin – A cada requisição será redirecionada para uma instância.
Least connections – A instância que possuir um menor numero de conexões estará recebendo a próxima requisição.
Source – O primeiro acesso do IP do Source é enviado a uma instância. Após definido, suas requisições futuras irão para a mesma instância

Simples! Após as informações solicitadas as requisições já estarão sendo direcionadas para as instâncias configuradas.

Espero que tenha ajudado a todos nesta dica de aprimoramento da estrutura para seu site.

Tenha controle e flexibilidade nos seus recursos com DialCloud +. Servidores em cloud com load balancing, VPN e todo o controle de rede que você precisa. Saiba Mais.

 

Márcio Rubens
Márcio Rubens

Sou Analista de TI na DialHost, pós-graduado em Gestão de Segurança da Informação pela PUC-MG e graduado em Gestão da Tecnologia da Informação pela UNI-BH.