anúncios

domingo, 27 de novembro de 2016

Entendendo os benefícios e utilização do Docker

O que é Docker?

Antes esclarecemos uma dúvida comum aos novatos. Docker não é sistema de virtualização tradicional, pois em um sistema de virtualização tradicional temos um SO completo e isolado, já no Docker temos os recursos isolados que utilizam as bibliotecas do kernel em comum (host e contêiner). O Docker utiliza como backend o LXC.

Figura diferença entre Virtualização e Contêiner de [1]

Docker é uma plataforma open source escrito em Go, linguagem de programação de alto desempenho da Google, que facilita a criação e administração de ambientes isolados.

Vantagens de usar o Docker

O Docker permite o empacotamento de uma aplicação ou ambiente completo dentro de um contêiner, e a partir desse momento o ambiente completo torna-se portável para qualquer outro Host que contenha o Docker instalado.

Assim reduz drasticamente o tempo de deploy de alguma infraestrutura ou até mesmo da aplicação, pois não há necessidade de ajustes de ambiente para o correto funcionamento do serviço, o ambiente sempre é o mesmo, configure uma vez e replique quantas vez quiser.

Outra facilidade do Docker é poder criar imagens (contêiners prontos para deploy) por meio de arquivos de configuração Dockerfile.

Como o Docker funciona?

O Docker funciona como cliente e servidor (toda a comunicação entre o Docker Daemon e Docker Client é realizada através da API), basta apenas ter instalado o serviço do Docker e apontar o Docker Client para o servidor. A plataforma Docker utiliza alguns conjuntos de recursos, seja para criação ou administração dos containers. entre esses conjuntos destacamos a biblioteca libcontainer, que é responsável pela comunicação entre o Docker Daemon e o backend utilizado, e ela a responsável pela criação do container e através dela podemos setar os limites de recursos por container.

Instalação do Docker
Pré-requisitos: O Docker requer instalação das distros Linux com arquitetura 64 bits independente da versão e além disso, o kernel deve ter no mínimo 3.10.
No Debian
# apt-get purge "lxc-docker*"
#apt-get purge "docker.io*"
# apt-get install apt-transport-https ca-certificates
# echo "deb https://apt.dockerproject.org/repo debian-jessie main " > /etc/apt/sources.list.d/docker.list
#apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Debian Wheezy (7)
# echo "deb https://apt.dockerproject.org/repo debian-wheezy main" >> /etc/apt/sources.list
Debian Jessie (8)
# echo "deb https://apt.dockerproject.org/repo debian-jessie main" >> /etc/apt/sources.list
Debian Stretch/Sid (9)
# echo "deb https://apt.dockerproject.org/repo debian-stretch main" >> /etc/apt/sources.list
Atualização do repositório
# apt-get update
Instalação do pacote Docker
# apt-get install docker-engine
Startar o serviço Docker
# service docker start

No CentOS
Adicionar no repositório
# tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

Instalar o pacote Docker
# yum install docker-engine
Habilitar o serviço Docker
# systemctl enable docker.service
Startar o serviço Docker
# systemctl start docker

No Ubuntu
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


Precise 12.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-precise main
Trusty 14.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-trusty main
Wily 15.10 deb https://apt.dockerproject.org/repo ubuntu-wily main
Xenial 16.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-xenial main
Adicione o repositório conforme a versão do Ubuntu, nesse caso adicionei a versão Xenial 16.04 LTS
$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
Atualiza o repositório
$ sudo apt-get update
Instalação da imagem do kernel extra e virtual
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
Instalação do pacote Docker
$ sudo apt-get install docker-engine
Start do serviço Docker
$ sudo service docker start

Comandos Docker
Build de uma imagem
docker build -t

Lembre que as imagens são compostas de camadas (layers) e que o Docker usa caching para fazer o build somente das camadas que tiveram alguma mudança. Recentemente, o Docker publicou uma Image Specification, que explica como tudo isso funciona. Para buildar uma imagem sem utilizar caching, adicione a opção --no-cache ao comando.

Executar um container
docker run -d -p : --name
Iniciar uma sessão bash em um container que esteja rodando
docker exec -it bash
Pesquisa de imagens
docker search nome-imagem
Encontrado a imagem, execute o comando pull para o download
docker pull nome-imagem
Remover um imagem
Localize o ID ou nome do repositório com o comando docker images.
Com o id ou o nome do repositório em mãos, utilize o comando rmi para excluir as imagens.
docker rmi ID_ou_nome_da_imagem
Ver os logs de um container
docker logs
Ver todas as imagens no host
docker images
Ver todos os containers
docker ps -a
Remover um container
docker rm -f
Remover TODOS os containers
docker rm -f $(docker ps -a -q)
Remover uma imagem
docker rmi -f
Remover dangling images
docker rmi $(docker images -q -f dangling=true)
"Dangling images" são, basicamente, imagens sem uma tag. Se você alguma(s) vez(es) rodou um Dockerfile que falhou, provavelmente você deve ter uma ou mais imagens sem tags.
Copiar um arquivo do container para o host
docker cp :/caminho/no/container /caminho/no/host

Monitoramento de containers
Visualizar estatísticas de um container
docker stats
Visualizar estatísticas de todos os containers executando no host
docker stats `docker ps | tail -n+2 | awk '{ print $NF }'

Repositório de imagens prontas do Docker
O site https://hub.docker.com/explore/ é onde estão as imagens prontas para usar usando os comandos informados.

Construindo sua própria imagem para seu ambiente em uma aplicação

O arquivo de manifesto do Docker é o Dockerfile, nele você coloca as instruções de como você quer que sua imagem seja construída. Você pode na construção da imagem setar outro arquivo com o parâmetro -f.

Abaixo temos um exemplo de Dockerfile, esse é um exemplo de um app em go já compilado para ubuntu então eu só preciso copiar o arquivo executável elasticpush para dentro do docker:

FROM debian:jessie
RUN mkdir /app
ENV ACCESS_TOKEN abc
ENV SECRET_TOKEN xyz
COPY ./bin/elasticpush /app/elasticpush
ENTRYPOINT [“/app/elasticpush”]


Detalhando os comandos utilizados:
FROM:

Este é o comando mais importante, pois ele especifica a imagem base para a construção de uma nova. Na maioria das vezes a imagem especificada vai ser uma distribuição linux, se essa imagem não for encontrada na máquina local, o docker tentará buscar em algum repository. Caso queira, por exemplo, fazer a build do seu app em GO dentro do container, você vai precisar de uma imagem que tenha o GO instalado e configurado. Outra forma também seria criar diversas instruções com o comando RUN para fazer essa instalação.

RUN:

Esse comando serve para executar outros comandos que a versão do sistema operacional permite. Por exemplo, se for Debian pode instalar apt-get, se for CentOS pode utilizar o yum para pegar as dependências que seu serviço precisa para rodar. Com o RUN você também pode criar arquivos, diretórios, enfim os mesmo comando do que executaria na sua máquina, logo você consegue fazer praticamente tudo, e deixar a sequência de comandos versionada aqui no container.

ENV:

Serve para setar variáveis de ambiente, assim pode tanto deixar essas variáveis setadas de forma fixa dentro do Dockerfile quanto passá-las dinamicamente na hora que instanciar o container. Para passar essas variáveis de ambiente na instanciação do container basta usar o parâmetro -e.

Exemplo: docker run -e ACCESS_TOKEN=abcd [nome da imagem]
COPY:

O COPY serve para poder copiar arquivos e diretório para dentro da imagem do Docker, nesse exemplo eu copiei o arquivo elasticpush que estava dentro do diretório bin na minha máquina local para dentro da pasta /app na imagem do docker.

ENTRYPOINT:

Com esse parâmetro pode setar se quer que algo seja executado na hora da instanciação do container. Então, quando for executar docker run nessa imagem, ela já vai instanciar e executar o programa que está no caminho que você colocar entre colchetes. No nosso caso queremos que essa imagem execute nossa aplicação do Elasticpush, o mesmo vale para quaisquer outros serviços como Redis, Elasticsearch, Nodejs, etc.

Após criar o arquivo Dockerfiles do seu ambiente de aplicação, execute:
docker build -t app/elasticpush

Considerações finais

O Docker é uma tecnologia da área de DevOps, sendo utilizada por muitas empresas, como Google, Yahoo, Microsoft e outras, dentro da metodologia ágil.

O Docker é uma ferramenta leve que permite executar containers de forma equivalente como se fosse máquinas virtuais, mas lembra da diferença de virtualização e containers na figura mencionada no início, então o Docker funciona dessa forma.

Por fim, espero que esse artigo tenha esclarecido sobre Docker e recomendo começar a utilizar nas aplicações de projetos que for desenvolver.

Referências
[1] http://www.mundodocker.com.br/o-que-e-docker/
[2] http://stefanteixeira.com.br/2015/03/17/comandos-essenciais-docker-monitoramento-containers/
[3] https://woliveiras.com.br/posts/comandos-mais-utilizados-no-docker/
[4] http://tableless.com.br/iniciando-com-o-docker-criando-suas-proprias-imagens/
[5] https://docs.docker.com/engine/installation/linux/debian/
[6] https://docs.docker.com/engine/installation/linux/centos/
[7] https://docs.docker.com/engine/installation/linux/ubuntulinux/
Feito!

terça-feira, 22 de novembro de 2016

Criando ambiente de desenvolvimento com Vagrant

O que é Vagrant ?

O Vagrant é um projeto que permite virtualizar o ambiente de desenvolvimento de forma simples. Com o Vagrant você pode executar máquinas virtuais utilizando o VirtualBox ou VMware, dentre muitas outras opções. Estas máquinas virtuais podem ter qualquer configuração e programas instalados e você pode, inclusive, criar a sua própria configuração com muita facilidade. Isso ajuda bastante quando um novo funcionário é contratado, por exemplo. Se todo o seu ambiente de desenvolvimento for baseado em boxes (box é o nome que o Vagrant utilizada para definir cada máquina virtual) personalizados, tudo o que ele precisa fazer é instalar o Vagrant e executar um único comando.

Depois de conhecer o Vagrant e pra que serve, podemos seguir os procedimentos de instalação e configuração do Vagrant em seu computador com SO Windows ou Linux.

Instalação do Vagrant

Como o Vagrant depende do VirtualBox ou VMWare, é necessário instalar um ou outro, nesse caso optei por instalar o VirtualBox.

Faça o download do VirtualBox conforme o SO que tem no seu PC no site:
https://www.virtualbox.org/wiki/Downloads e a instalação posteriormente.
Em seguida, faça o download do Vagrant conforme o SO que tem no seu PC no site: https://www.vagrantup.com/downloads.html e a instalação posteriormente.

Recomendo criar uma variável de ambiente VBox e Vagrant apontando para o caminho onde foi instalado o VirtualBox e Vagrant, depois aplicar essas variáveis de ambiente no PATH do SO.
Por que? Para poder executar de qualquer lugar no CMD ou terminal.

Vagrant na prática
Agora pesquise um ambiente pronto Vagrant (box) no site: https://atlas.hashicorp.com/boxes/search e depois execute conforme abaixo:
vagrant box add nome-box
Após o download do ambiente (box), inicie com o comando
vagrant init nome-box
Acesso ao ambiente (box) via SSH
vagrant@127.0.0.1 -p 2222 OU
vagrant ssh

Comandos Vagrant
  • vagrant ssh:
  • faz login na máquina virtual, não precisa de login ou senha
  • vagrant up:
  • faz o boot na máquina virtual e executa os provisioners definidos
  • vagrant reload:
  • reinicia a máquina virtual. Útil principalmente quando há mudanças no Vagrantfile
  • vagrant provision:
  • executa apenas os provisioners, sem reiniciar a máquina. Útil após fazer pequenas modificações no provisionamento
  • vagrant destroy:
  • destrói a máquina virtual. Use quando quiser começar do zero com um vagrant up vagrant halt - "desliga" a máquina, equivalente a um shutdown
  • vagrant suspend:
  • suspende a execução da máquina virtual salvando seu estado (ideal para o dia-a-dia quando desenvolvendo)
  • vagrant resume:
  • retoma uma máquina virtual previamente suspensa

Convertendo .OVA to .BOX

Na seção anterior você aprendeu a usar um ambiente Vagrant (box) já pronto do repositório, nessa seção aprenderá como gerar o arquivo box para usar no Vagrant.

Bom, primeiramente cria uma máquina virtual no VirtualBox, instale uma distro e configure todo o ambiente necessário, depois exporte essa máquina virtual para o formato .ova.

Importando VM com formato .ova no VirtualBox

.OVA é a VM exportada do VirtualBox
.BOX é a VM convertida do .OVA to .BOX para usar no Vagrant
Primeiro lista as VMs
$VBoxManage list vms
copia o serial da vm
$vagrant package --base < serial-copiado-vm > --output NOME.box
Transfira essa NOME.box para um servidor da rede. E de outra máquina com o VirtualBox e Vagrant instalados.
$vagrant box add NOME.box --name NOME
Cria o arquivo Vagrantfile
$vagrant init NOME

Vagrant.configure("2") do |config|
config.vm.box = "NOME"
# ...
end
Liga a VM: $vagrant up
Desliga a VM: $vagrant halt
Destroi a VM: $vagrant destroy

Referências:
http://blog.wfsneto.com.br/2014/08/22/como-criar-e-costumizar-box-vagrant-cloud
https://nandovieira.com.br/usando-o-vagrant-como-ambiente-de-desenvolvimento-no-windows
http://www.erikaheidi.com/pt_br/blog/vagrant-101-montando-seu-ambiente-de-desenvolvimento-portatil
Feito!

sábado, 19 de novembro de 2016

Instalando o ambiente gráfico MATE no Linux

O ambiente gráfico MATE é o fork do Gnome 2, então para aqueles que não curtiram o Gnome 3 e querem usar o Gnome 2, pode usar o MATE que lembrará muito a versão antecessor do Gnome 3. O presente Howto é destinado para as distribuições Linux Slackware 14.2, Debian 8, RHEL 7/CentOS 7/Fedora, Arch Linux, openSUSE 13.2/Leap 42.1/Tumbleweed e Ubuntu 16.04.1 LTS até a data de publicação deste post.

Slackware 14.2 (32 bits)
$ mkdir mate-desktop && cd mate-desktop/
$ lftp -c "open http://slackware.org.uk/msb/14.2/1.16/; mirror x86"
$ cd x86/
$ su
# upgradepkg --install-new deps/*.t?z
# upgradepkg --install-new base/*.t?z
# upgradepkg --install-new extra/*.t?z
# exit

Para selecionar o ambiente gráfico MATE por default no boot
# xwmconfig

Slackware 14.2 (64 bits)
$mkdir mate-desktop && cd mate-desktop/
$ lftp -c "open http://slackware.org.uk/msb/14.2/1.16/; mirror x86_64"
$ cd x86_64/
$ su
# upgradepkg --install-new deps/*.t?z
# upgradepkg --install-new base/*.t?z
# upgradepkg --install-new extra/*.t?z
# exit

Para selecionar o ambiente gráfico MATE por default no boot
# xwmconfig

Debian 8
Estando com o arquivo /etc/apt/sources.list conforme o arquivo sources.list segue:
#apt-get update
#apt-get install mate-desktop-environment
#apt-get install mate-desktop-environment-extras


RHEL 7 / CentOS 7 / Fedora
#yum groupinstall mate-desktop

Arch Linux
#pacman -Syy mate mate-extra

openSUSE 13.2
#zypper ar -r http://download.opensuse.org/repositories/X11:/MATE:/Current/openSUSE_13.2/X11:MATE:Current.repo
openSUSE Leap 42.1
#zypper ar -r http://download.opensuse.org/repositories/X11:/MATE:/Current/openSUSE_Leap_42.1/X11:MATE:Current.repo
openSUSE Tumbleweed
#zypper ar -r http://download.opensuse.org/repositories/X11:/MATE:/Current/openSUSE_Tumbleweed/X11:MATE:Current.repo

Ubuntu 16.04.1 LTS
sudo apt-add-repository ppa:ubuntu-mate-dev/ppa
sudo apt-add-repository ppa:ubuntu-mate-dev/trusty-mate
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mate-desktop-environment-extras

Feito!