###Introdução
Os casos de uso apresentados são ilimitados e a necessidade sempre esteve lá. O Docker está aqui para oferecer a você uma eficiente e rápida maneira de portar aplicações entre sistemas e máquinas. Ele é leve e enxuto, permitindo a você rapidamente conter aplicações e as executar dentro de seus próprios ambientes seguros (via Contêineres Linux: LXC).
Neste artigo da DigitalOcean, pretendemos apresentá-lo minuciosamente ao Docker: um dos mais interessantes e poderosos projetos open-source a ganhar vida nos últimos anos. Docker pode ajudá-lo em tantas coisas que é injusto tentar resumir as suas capacidades em uma frase.
###Glossário
###1. Docker ###2. O Projeto Docker e suas partes principais ###3. Elementos do Docker
###4. Como instalar o Docker ###5. Como utilizar o Docker
#Docker
Quer seja da sua máquina de desenvolvimento para um servidor de produção remoto, ou empacotando qualquer coisa para uso em outro lugar, é sempre um desafio quando se trata de portar sua pilha de aplicação juntamente com suas dependências e fazê-las funcionar sem tropeços. Na verdade, o desafio é imenso e as soluções até agora realmente não tem sido bem sucedidas para as massas.
Em poucas palavras, docker como um projeto oferece a você um conjunto completo de ferramentas de alto nível para transportar tudo que constitui uma aplicação entre sistemas e máquinas - virtual ou física - e trás consigo grandes benefícios agregados.
Docker alcança sua robustez de conter a aplicação (e, portanto, de processos e recursos) via Contêineres Linux (por exemplo, namespaces e outras características do kernel). Seus novos recursos vêm de componentes e partes próprias do projeto, que extraem toda a complexidade de trabalhar com ferramentas/APIs Linux de baixo nível usadas para o sistema e para gerenciamento de aplicação, no que diz respeito a conter os processos com segurança.
#O projeto Docker e suas partes principais
O projeto Docker (que teve o código aberto pela dotCloud em Março de 2013), consiste de várias partes principais (aplicações) e elementos (utilizados por essas partes), as quais são todas (a maior parte) construídas em cima de funcionalidades já existentes, bibliotecas e frameworks oferecidos pelo kernel do Linux e por terceiros ( por exemplo LXC, device-mapper, aufs, etc.).
###Partes principais do Docker
###Elementos principais do Docker
#Elementos do Docker
Os seguintes elementos são usados pelas aplicações que formam o projeto docker.
###Contêineres Docker
Todo o processo de portar aplicações usando docker depende, exclusivamente, do envio de contêineres.
Os contêineres docker são basicamente, diretórios que podem ser empacotados (agrupados com tar por exemplo) como qualquer outro, e então, compartilhados e executados entre várias máquinas e plataformas (hosts). A única dependência é ter os hosts ajustados para executar os contêineres (ou seja, ter o docker instalado). A contenção aqui é obtida através de Contêineres Linux (LXC).
###LXC (Contêineres Linux)
Contêineres Linux podem ser definidos como uma combinação de várias funcionalidades de kernel (ou seja, coisas que o kernel pode fazer), que permitem o gerenciamento de aplicações (e recursos que elas utilizam) contidas dentro de seus próprios ambientes. Fazendo o uso de algumas funcionalidades (por exemplo namespaces, chroots, cgroups e perfis SELinux), o LXC contém os processos das aplicações e auxilia com seu gerenciamento, através da limitação de recursos, não permitindo que alcance além do seu próprio sistema de arquivos (acesso ao espaço de nomes - namespace - do pai), etc.
Docker, com seus contêineres, faz uso do LXC, contudo, também traz consigo muito mais.
###Contêineres Docker
Os contêineres docker possuem várias características principais.
Eles permitem;
e mais, requerendo muito menos recursos do que máquinas virtuais tradicionais usadas para a implantação de aplicações isoladas.
Eles não permitem;
e (também) mais.
Sendo baseado e dependendo do LXC, a partir de um aspecto técnico, estes contêineres são como um diretório (moldado e formatado). Isso permite portabilidade e construção gradual de contêineres.
Cada contêiner possui camadas como uma cebola e cada ação tomada dentro de um contêiner consiste em colocar outro bloco (que na verdade se traduz em uma simples mudança no sistema de arquivos) em cima do bloco anterior. E várias ferramentas e configurações fazem este trabalho de forma completamente harmoniosa (por exemplo o union file-system).
O que esta forma de ter contêineres permite é o imenso benefício de facilmente lançar e criar novos contêineres e imagens, que se mantém leves (graças a forma gradual e em camadas como elas são construídas). Como tudo é baseado em sistema de arquivos, tirar instantâneos (snapshots) e realizar reversões no tempo são processos baratos ( ou seja, realizado facilmente / não pesado em recursos), muito parecido com sistemas de controle de versão (VCS).
Cada contêiner docker inicia de uma imagem docker que forma a base para outras aplicações e camadas que virão.
###Imagens Docker
As imagens docker constituem a base para os contêineres docker de onde tudo começa a se formar. Elas são muito similares às imagens de disco padrão de sistema operacional que são utilizadas para executar aplicações em servidores e computadores de mesa.
Tendo essas imagens (por exemplo uma base Ubuntu) permite-se a portabilidade perfeita entre sistemas. Eles constituem uma base sólida, consistente e confiável com tudo o que é necessário para executar as aplicações. Quando tudo é auto suficiente e o risco de atualizações ou modificações em nível de sistema é eliminado, o contêiner torna-se imune a riscos externos que poderiam colocá-lo fora de ordem - evitando o “inferno de dependências”.
Quanto mais camadas (ferramentas, aplicações, etc) são adicionadas em cima da base, novas imagens podem ser formadas aplicando-se estas alterações. Quando um novo contêiner é criado a partir de uma imagem salva (ou seja, com as alterações aplicadas), as coisas continuam de onde pararam. E o sistema de arquivos union, traz todas as camadas juntas como uma entidade única quando você trabalha com um contêiner.
Essas imagens de base podem ser explicitamente declaradas quando se trabalha com o docker CLI para criar diretamente um novo contêiner ou, elas podem ser especificadas dentro de um Dockerfile para construção de imagem automatizada.
###Dockerfiles
Dockerfiles são scripts contendo uma série sucessiva de instruções, orientações e comandos que devem ser executados para formar uma nova imagem docker. Cada comando executado traduz-se para uma nova camada da cebola, formando o produto final. Elas basicamente substituem o processo de se fazer tudo manualmente e repetidamente. Quando um Dockerfile conclui a execução, você acaba tendo formado uma imagem, que então, você utiliza para iniciar ( ou seja, criar) um novo contêiner.
#Como instalar o Docker
No início, o docker estava disponível apenas no Ubuntu. Atualmente, com sua versão mais recente (0.7.1. de 5 de Dezembro), é possível implantar o docker em sistemas baseados no RHEL (por exemplo, CentOS) bem como outros.
Lembre-se de que você pode iniciar rapidamente utilizando a imagem da Digital Ocean, pronta para usar, construída sobre um Ubuntu 13.04.
Vamos passar rapidamente às instruções de instalação para Ubuntu
###Instruções de instalação para Ubuntu
A maneira mais simples de obter o docker, além de usar a imagem da aplicação pré construída, é ir com um VPS (Virtual Private Server) Ubuntu de 64 Bits, versão 13.04.
The simplest way to get docker, other than using the pre-built application image, is to go with a 64-bit Ubuntu 13.04 VPS
Atualize seu droplet:
sudo aptitude update
sudo aptitude -y upgrade
Certifique-se de que o suporte ao aufs está disponível:
sudo aptitude install linux-image-extra-`uname -r`
Adicione a chave do repositório do docker ao apt-key para verificação de pacotes:
sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
Adicione o repositório do docker ao sources do aptitude:
sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
Atualize o repositório com o novo acréscimo:
sudo aptitude update
Finalmente, baixe e instale o docker:
sudo aptitude install lxc-docker
O firewall padrão do Ubuntu (UFW: Uncomplicated Firewall) bloqueia todo o encaminhamento de pacotes por padrão, o qual é necessário para o docker.
Habilite o encaminhamento com UFW:
Edite a configuração do UFW utilizando o editor de texto nano.
sudo nano /etc/default/ufw
Desça no arquivo e procure a linha iniciando com DEFAULTFORWARDPOLICY.
Substitua:
DEFAULT_FORWARD_POLICY="DROP"
Por:
DEFAULT_FORWARD_POLICY="ACCEPT"
Pressione CTRL+X e confirme com Y para salvar e sair.
Finalmente, recarregue o UFW:
sudo ufw reload
Para um conjunto completo de instruções, verifique a documentação de instalação do docker aqui.
#Como usar o Docker
Uma vez que tiver o docker instalado, sua experiência de uso intuitiva o torna muito fácil de trabalhar. Neste momento, você deve ter o daemon do docker executando em segundo plano. Se não, utilize o seguinte comando para executar o daemon do docker.
Para executar o daemon do docker:
sudo docker -d &
Sintaxe de uso:
Usar o docker (via CLI) consiste em passar a ele uma cadeia de opções e comandos seguidos por argumentos. Por favor, observe que o docker necessita de privilégios sudo para funcionar.
sudo docker [option] [command] [arguments]
Nota: As instruções e explicações abaixo são fornecidas para serem utilizadas com um guia e para dar a você uma ideia geral de usar e trabalhar com o docker. O melhor caminho para tornar-se familiar com ele é praticando em um novo VPS. Não tenha medo de quebrar algo - de fato, faça coisas que quebrem! Com o docker, você pode salvar seu progresso e continuar a partir de lá muito facilmente.
###Iniciando
Vamos começar vendo todos os comandos disponíveis que o docker tem.
Pergunte ao docker por uma lista de todos os comandos disponíveis:
sudo docker
Todos os comandos disponíveis atualmente (na versão 0.7.1):
attach Attach to a running container
build Build a container from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders from the containers filesystem to the host path
diff Inspect changes on a container's filesystem
events Get real time events from the server
export Stream the contents of a container as a tar archive
history Show the history of an image
images List images
import Create a new filesystem image from the contents of a tarball
info Display system-wide information
insert Insert a file in an image
inspect Return low-level information on a container
kill Kill a running container
load Load an image from a tar archive
login Register or Login to the docker registry server
logs Fetch the logs of a container
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
ps List containers
pull Pull an image or a repository from the docker registry server
push Push an image or a repository to the docker registry server
restart Restart a running container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save an image to a tar archive
search Search for an image in the docker index
start Start a stopped container
stop Stop a running container
tag Tag an image into a repository
top Lookup the running processes of a container
version Show the docker version information
wait Block until a container stops, then print its exit code
Verifique informações de sistema e versão do docker:
# Para informações gerais de sistema no docker:
sudo docker info
# Para versão do docker:
sudo docker version
###Trabalhando com imagens
Como discutimos extensamente, a chave para começar a trabalhar com qualquer contêiner docker é utilizando imagens. Existem muitas imagens disponíveis gratuitamente através do docker image index e o CLI permite acesso simplificado para consultar o repositório de imagens e para baixar novas.
Quando estiver pronto, você pode também compartilhar sua imagem lá da mesma forma. Veja a seção sobre “push” mais abaixo para mais detalhes.
Procurando uma imagem docker:
# Uso: sudo docker search [nome da imagem]
sudo docker search ubuntu
Isto irá lhe fornecer uma lista muito longa de todas a imagens disponíveis que correspondem à consulta Ubuntu.
###Baixando (PULLing) uma imagem:
Esteja você construindo / criando um contêiner ou antes de fazê-lo, você precisará ter uma imagem presente na máquina host onde os contêineres existirão. De forma a baixar as imagens (talvez após o “search”) você pode executar pull para obter uma.
# Uso: sudo docker pull [nome da imagem]
sudo docker pull ubuntu
###Listando imagens:
Todas as imagens em seu sistema, incluindo aquelas que você criou através de commit ou salvamento (veja abaixo para detalhes), podem ser listadas utilizando “images”. Isto lhe fornece uma lista completa de todas as imagens disponíveis.
# Examplo: sudo docker images
sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
my_img latest 72461793563e 36 seconds ago 128 MB
ubuntu 12.04 8dbd9e392a96 8 months ago 128 MB
ubuntu latest 8dbd9e392a96 8 months ago 128 MB
ubuntu precise 8dbd9e392a96 8 months ago 128 MB
ubuntu 12.10 b750fe79269d 8 months ago 175.3 MB
ubuntu quantal b750fe79269d 8 months ago 175.3 MB
###Salvando alterações em uma imagem
À medida que você trabalha com o contêiner e continua a realizar ações nele (por exemplo, baixar e instalar software, configurar arquivos, etc), para ter seu estado mantido, você precisa fazer “commit” ou salvar as alterações. O salvamento garante que tudo continua de onde estava na próxima vez que você usar a imagem.
# Uso: sudo docker commit [ID do contêiner] [nome da imagem]
sudo docker commit 8dbd9e392a96 my_img
###Compartilhando (PUSHing) imagens:
Embora isso seja uma pouco cedo neste momento - em nosso artigo, quando você tiver criado seu próprio contêiner, o qual você vai querer compartilhar com o resto do mundo, você pode usar push para ter a sua imagem listada no índice, onde todos poderão baixar e utilizar.
Por favor, lembre-se de fazer o “commit” ou salvar todas as suas alterações
# Uso: sudo docker push [usuário/nome da imagem]
sudo docker push my_username/my_first_image
Nota: Você precisa registrar-se em index.docker.io para fazer o upload ou push de imagens no índice do docker.
##Trabalhando com Contêineres
Quando você executa (run) qualquer processo utilizando uma imagem, em retorno, você terá um contêiner. Quando o processo não está executando ativamente, este contêiner será um contêiner non-running. No entanto, todos eles residem em seu sistema até que você remova-os através do comando rm.
###Listando todos os contêineres atuais:
Por padrão, você poderá usar o seguinte comando para listar todos os contêineres em execução (running):
sudo docker ps
Para obter uma lista de ambos, os que estão executando (running) e os que estão como non-running, utilize:
sudo docker ps -l
##Criando um novo Contêiner
Não é possível criar um contêiner sem executar nada (ou seja, comandos). Para criar uma novo contêiner, você precisa usar uma imagem base e especificar um comando para executar:
# Uso: sudo docker run [nome da imagem] [comando a executar]
sudo docker run my_img echo "hello"
# Para nomear um contêiner em vez de ter longos IDs
# Uso: sudo docker run -name [nome] [nome da imagem] [comando]
sudo docker run -name my_cont_1 my_img echo "hello"
Isto irá imprimir “hello” e você vai estar de volta onde você estava. (ou seja, no shell do seu host)
Como você não pode alterar o comando que você executou depois de ter criado um contêiner (daí, especificando um durante a “criação”), é uma pratica comum utilizar gerenciadores de processos e mesmo scripts de inicialização customizados para ser capaz de executar diferentes comandos.
###Executando um contêiner:
Quando você criou um contêiner e ele parou (seja devido à finalização de seu processo ou por você pará-lo explicitamente), você pode usar “run” para ter o contêiner trabalhando novamente com o mesmo comando utilizado para criá-lo.
# Uso: sudo docker run [ID do contêiner]
sudo docker run c629b7d70666
Lembra-se de como localizar um contêiner? Veja a seção acima para listá-los.
###Parando um contêiner:
Para parar um processo de contêiner em execução:
# Uso: sudo docker stop [ID do contêiner]
sudo docker stop c629b7d70666
###Salvando (committing) um contêiner:
Se você quiser salvar o progresso e as alterações que você fez com o contêiner, você pode usar “commit” como explicado acima, para salvá-lo como uma “imagem”.
Este comando transforma seu contêiner em uma imagem.
Lembre-se de que com o docker, salvamentos são fáceis e econômicos. Não hesite em criar imagens para salvar seu progresso com um contêiner ou para restaurá-lo quando você precisar (por exemplo, como instantâneos - snapshots - no tempo).
###Removendo / Deletando um contêiner
Utilizando o ID de um contêiner, você pode deletá-lo com o rm.
# Uso: sudo docker rm [ID do contêiner]
sudo docker rm c629b7d70666
Você pode aprender mais sobre o Docker lendo sua documentação oficial
Lembre-se: As coisas estão progredindo muito rapidamente com o Docker. O impulso alimentado pela comunidade é incrível e várias grandes empresas estão tentando juntar-se para oferecer suporte. Contudo, o produto não está rotulado como pronto para produção ou production ready, portanto, não recomendado para ser 100% confiável em implantações de missão crítica - ainda. Certifique-se de verificar as versões à medida que elas são disponibilizadas e continue mantendo-se por dentro de tudo que acontece no docker.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Muito bom o artigo Fernando, deu uma boa clareada no que é o Docker e como começar a utilizá-lo. Pelo que li aqui, esta ferramenta não tem volta no meu desenvolvimento, bora aprender mais…
Fernando, parabéns pelo artigo. Recentemente iniciei um projeto para virtualizar alguns servidores da empresa. O grande porém vem sendo o custo e o fato de alguns servidores rodarem aplicações simples ou complexas demais no cenário que eu havia desenhado para virtualização. Você mencionou no começo do artigo que com o Docker eu teria um meio mais eficaz do que vitualizar. Eu consigo com o Docker criar um conteiner para rodar aplicações Windows, por exemplo?
Na minha versão do Docker a opção para listar todos containers é
-a
: