Desenvolvimento

29 ago, 2014

As baleias na Nuvem: entenda como funciona o Docker

Publicidade

Este artigo tem como objetivo mostrar o básico de como funciona essa tecnologia que vem crescendo. Veremos desde os conceitos de processos Linux, passando pelo LXC Containers até o Docker.

Seja bem-vindo ao portável mundo Docker!

Introdução

Sabemos que, no Linux, todos os processos possuem um PID chamado de process identifier do tipo integer, e um atributo PPID nomeado parent process identifier, que identifica o processo pai que pediu ao Kernel para criar o processo. A permissão de usuários e feita através do user ID (UIDs) e group ID (GIDs).

O chroot

O comando chroot do sistema operacional Unix é uma operação que muda o diretório root do processo corrente e de seus processos filhos. Um programa que é re-rooted para um outro diretório não pode acessar arquivos fora daquele diretório, e o diretório é chamado de “prisão chroot”. O comando Chroot permite transformar um diretório no seu diretório raiz atual, num console.

Usando chroot <diretório> [comando] é possível ter acesso somente a seus próprios arquivos de configuração, bibliotecas etc. Desta forma, é possível proteger um pouco o sistema caso esse serviço seja comprometido. Mas, caso o ambiente dentro da jaula de chroot consiga acesso ao usuário root (quando seu effective user ID do processo for igual a zero, o que significa que ele é um superuser), é possível escapar de uma jaula chroot através de técnicas simples.

Chroot com bind mounts

Associado a bind mounts, ambientes chroot podem se tornar significativamente mais seguros. Um processo pode ter acesso a diretórios específicos, possivelmente com permissão somente para leitura (bind mounts podem ser read-only), e assim serem mais eficazmente enjaulados, além de poder, por exemplo, acessar dispositivos do /dev/ ou informações do /sys/.

Linux Containers (LXC)

O Kernel Linux possui o Cgroups, que é utilizado para isolar o uso de recursos (CPU, memória, disco, rede, etc) e também fazer o isolamento de namespace, que basicamente separa os grupos de processos:

lxc

Tipos de virtualização

Bare Metal: o software que proporciona a virtualização é instalado diretamente sobre o hardware (Xen, VMware, Hyper-V). Esse tipo proporciona um isolamento maior e, ao mesmo tempo, uma sobrecarga, pois cada máquina virtual que é criada irá executar seu próprio kernel e instância do sistema operacional.

Hosted: o software que proporciona a virtualização é executado sobre um sistema operacional (VirtualBox).

LXC: é uma virtualização em nível de sistema operacional através do qual se pode executar vários sistemas Linux isolados (containers) em um único host de controle.

A virtualização total da máquina oferece maior isolamento, ao custo de maior sobrecarga, já que cada máquina virtual executa seu próprio kernel e instância do sistema operacional. Containers, por outro lado, geralmente oferecem menos isoladamente, mas também menor sobrecarga através da partilha de certas partes do kernel do host e instância do sistema operacional.

A descrição do LXC segundo o site do projeto é: “LXC is a userspace interface for the Linux kernel containment features. Through a powerful API and simple tools, it lets Linux users easily create and manage system or application containers”.

Com ele podemos executar programas isoladamente, proporcionando múltiplos ambientes de usuário, cujos recursos podem ser rigidamente controlados, mas que não necessitam de virtualização completa de hardware, recipientes onde cada recipiente tenha seu próprio endereço IP.

Para instalarmos o LXC em distribuições Debian-based usamos:

sudo apt-get install lxc

Aqui você vê ainda uma outra forma de fazer a instalação, digamos, mais roots – https://github.com/lxc/lxc/blob/master/INSTALL

Apos instalado, usamos o seguinte comando para criarmos um contêiner LXC:

sudo lxc-create -t ubuntu -n my-container

Para usarmos ele basta utilizar:

sudo lxc-start -n my-container

Se você não é bom com terminal esperimente usar o LXC Web Panel

instalação do Web Panel:

sudo apt-get install lxc debootstrap bridge-utils -y
 sudo su
 wget http://lxc-webpanel.github.com/tools/install.sh -O - | bash

Para usar acesse http://seu-ip:5000/ e logue com usuário admin e senha admin.

Imagem de amostra do painel:

containers

O Docker

O back-end do Docker é feito com base no LXC, por isso mostrei como o LXC trabalha. O Docker é como um container em um navio (sua máquina), que pode conter vários serviços.

A instalação varia de sistema operacional, vou demonstrar como instalar em distros Debian-based, para demais distros verificar no site: https://docs.docker.com/installation/

Instalação no Ubuntu usando apt-get:

sudo apt-get install docker.io
 sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
 sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

Com tudo instalado e funcionando, é hora do famoso Hello world!

sudo docker run ubuntu:14.04 /bin/echo 'Hello World'

Ficou curioso e quer aprender mais? Acesse a documentação, que é muito bem detalhada: https://docs.docker.com/userguide/