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:
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:
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/