O que é o Docker?

editar
 
Logo Docker

  Docker esculpe um sistema em pequenos conteiners, cada um com seu próprio mundo, contendo seus programas e tudo necessário para que funcione, isolado de todo o resto. Um container é uma unidade de software auto-contida isolada. Esses containers foram criados para serem portáteis, para que possam ser enviados de um canto ao outro, e o Docker faz esse trabalho de enviar esses containers do e para seu sistema. Docker ainda cria builds desses containers para você e é uma plataforma que ajuda a compartilhar containers com outros usuários.

Em um container você tem tudo que necessita para aquele código especifico rodar. Todo o código, configurações, processos, uma rede que permite a conversa entre containers, dependências e até a quantidade necessária de sistema operacional que seu código necessita para rodar. Docker faz uma cópia de tudo necessário do SO e coloca no container, para que assim cada container tenha seu próprio mundo isolado para que não possa ver fora dele e outros containers não possam ver dentro.

Docker também é um client program, é um comando que você pode digitar no terminal. Também é um servidor que monitora mensagens desse comando e gerência um sistema ativo. Docker tem um programa, no qual cria containers a partir de código. Ainda é um serviço que distribui esses containers através da internet e faz com que outros possam achar seus trabalhos e vice-versa.

Docker garante que o software vai sempre rodar de forma igual, independente do ambiente onde se encontra, ou seja, uma solução de containerização para isolamento de aplicações. Sendo assim, Docker lhe da a habilidade de criar a virtualização no nível de aplicação, em vez do nível de sistema operacional. De um ponto de vista mais prático, ele permite que exista mais instâncias de uma aplicação, portanto, mais websites, mais databases, etc, sem necessitar da instalação de um sistema operacional, sendo ele Linux, Windows ou qualquer outro, várias vezes seguidas.

O que Docker não é?

editar

Uma máquina virtual. Existe apenas um sistema operacional rodando, esse SO é apenas esculpido em pequenos espaços isolados.

 
Arquitetura Docker
Imagem explicativa da arquitetura do Docker

Instalando Docker

editar

Visão Geral

editar

Começando pelo computador pessoal. Nele, Docker Toolbox vai instalar um programa chamado Docker, que permite que você gerencie máquinas virtuais e faça todo o resto que Docker faz. Ele também irá instalar um programa chamado VirtualBox, para gerenciar máquinas virtuais. No evento de já existir uma versão antiga do VirtualBox instalada, talvez seja necessário desinstalar e tentar novamente a instalação. Docker Toolbox vai instalar um programa chamado Docker Machine, que gerencia uma maquina virtual Linux no seu computador. Dentro dessa máquina virtual existe o servidor do programa Docker. Assim, quando digitado docker no prompt de comando, ele vai enviar esse comando para a máquina virtual através da rede e para o servidor Docker ativo.

 
Visão geral da instalação
Visão geral da instalação do Docker
  1. Logue no sistema com privilégios de sudo ou root
  2. Atualize as informações de pacotes e se assegurar que APT funciona com o método https e que os certificados CA estão instalados
     $ sudo apt-get update
     $ sudo apt-get install apt-transport-https ca-certificates
  3. Configure o APT a confiar em pacotes assinados pelo Docker
    $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
  4. Abra o arquivo /etc/apt/sources.list.d/docker.list
    sudo nano /etc/apt/sources.list.d/docker.list
    1. Caso não exista crie-o
  5. Na página de tutorial do Docker, escolha a sua versão linux e cole o comando referente a sua versão
     Ubuntu Xenial 16.04 [LTS]
     $ deb https://apt.dockerproject.org/repo ubuntu-xenial main
  6. Salve o arquivo e atualize os pacotes
     $ sudo apt-get update
  7. Instale o Docker
     $ sudo apt-get install docker-engine
  8. Inicialize e teste o Docker
     $ sudo service docker start
  9. Para não ter que digitar sudo toda vez que for usar o comando docker, vamos adicionar o usuário ao grupo Docker
     $ sudo groupadd docker
     $ sudo usermod -aG docker nome-do-usuario
  10. Agora podemos usar o comando docker normalmente

Mac OSX

editar

Na página do Docker Toolbox irá aparecer um botão com o link para download, escolha a opção Mac OSX e siga os passos.

Windows

editar

Para Windows é necessária a verificação de alguns passos extras. Esses passos estão descritos na página de tutorial do Docker para instalação no Windows.

Docker Images & Containers

editar

Uma imagem é todo arquivo que compõe apenas o necessário de um sistema operacional para realizar o que precisa fazer. Tradicionalmente seria instalado um sistema operacional completo com tudo presente para cada aplicação. Com Docker isso é escalonado para um pequeno container com apenas o necessário e se pode ter vários e vários desses com eficiência em um computador pessoal. Pode-se pensar na imagem como sendo o ponto de partida de um container, onde cada container que for criado a partir da queda imagem, vai ter acesso a tudo que está na imagem original. Porém, a partir do ponto de criação do container os novos arquivos e alterações não são salvos na imagem mãe. Sendo assim, cada container tem seu próprio ambiente e a imagem apenas dá um ponto de começo para isso.

Para verificar as imagens em um computador podemos executar o comando:

 $ docker images

Após rodar esse comando algumas propriedades de uma imagem serão apresentadas.

  • REPOSITORY - É o endereço da onde a imagem veio
  • TAG - A versão da imagem, muitos dos casos vai estar como "latest"
  • ID - É a representação interna do Docker para imagens
  • CREATED - Data de criação da imagem
  • SIZE - Tamanho ocupado pela imagem

Obs: Quando se obtém muitas imagens de uma fonte em comum, quando for listadas as imagens apareceram vários tamanhos diferentes para as imagens de origem comum, que quando somadas ocupam um espaço enorme. Porém, docker é inteligente e a parte do sistema operacional que é comum a todas essas imagens é compartilhada, sendo assim a soma dos tamanhos não reflete no tamanho real ocupado pelas imagens, que é significantemente menor.

O comando docker run pega uma imagem e torna ela em um container ativo com um processo dentro que está sendo executado.

 % docker run -ti image-name:tag command
 % A tag é opcional, se não especificado vai ser usado a latest
 
 % Abrir uma instancia do bash no ubuntu
 $ docker run -ti ubuntu:latest bash
 
 % exit ou Ctrl+D Para sair do container

Obs2: A flag -ti no comando docker run, significa terminal interactive, que causa com que tenha um terminal completo dentro da imagem, para que possa rodar o shell e ter coisas como formatação e tab completion.

Containers

editar

Para verificar os containers que estão usando as imagens e estão sendo executados no momento usa-se o comando

 $ docker ps

Nesse comando conseguimos ver algumas propriedades novas:

  • ID - Identificador do container, que é diferente da imagem usada
  • IMAGE - Nome e versão da imagem usada no container
  • COMMAND - Comando que está sendo executado no momento
  • CREATED - Data da criação do container
  • STATUS - Tempo de execução ou a partir de quando foi parado
  • PORTS - Portas abertas para a rede e a rede virtual do Docker
  • NAMES - Nome do container, se não especificado o Docker cria um nome criativo.

Obs3: Para formatar a saída do comando docker ps, pode-se utilizar a flag --format, especificando o estilo do formato.

%Print vertical
$FORMAT 
\nID\t{{.ID}}\nIMAGE\t{{.Image}}\nCOMMAND\t{{.Command}}\nCREATED\t
    {{.RunningFor}}\nSTATUS\t{{.Status}}\nPORTS\t{{.Ports}}\nNAMES\t{{.Names}}\n
 
 $ docker ps --format $FORMAT

Para visualizar todos os containers usa-se o comando:

 % -l para ver o ultimo container
 $ docker ps -a

Onde lista todos on containers, até mesmo os containers parados. Para criar imagens a partir de um container parado se utiliza o comando:

 $ docker commit container-id

Pronto temos uma imagem, porém com sem nenhum identificador legível para humanos normais. Para criar um nome para imagem usamos o comando:

 % sha-256code sendo o código que foi impresso na tela após o comando docker commit
 $ docker tag sha-256code minha-imagem
 
 % Outra opção é usar o comando docker commit com a entrada do nome do container
 $ docker commit meu-container minha-imagem
 
fluxograma container para imagem
Fluxograma do Docker

Como utilizar?

editar

Primeiramente deve-se abrir o Docker QuickStart terminal. Isso irá fazer com que abra uma janela de terminal com o docker machine ativo, já configurado para conectar a máquina virtual. Após abrir o terminal Docker, podemos entrar com comandos docker

Para verificar que tudo está instalado corretamente podemos rodar o hello world padrão.

 $ docker run hello-world 

Exibindo todos os containers em execução:

 $  docker ps 


Exibindo todas as imagens em execução:

 $  docker images 


Removendo a imagem X:

 $  docker rmi X 


Gerando a imagem do DockerFile do mediawiki:1.27

 $ docker build -t mediawiki:1.27  . 


Gerando um container da imagem mediawiki

 $ docker run --name wikiFGA -p 0.0.0.0:9090:80 -d mediawiki:1.27 

Docker Machine

editar

Com a instalação do Docker também temos o "docker-machine" que contém diversos comandos para gerenciar a máquina virtual. Os mais importantes sendo:

 $ docker-machine start
 $ docker-machine stop

Sendo o start o comando que inicializa a máquina virtual e stop o que termina. Além disso, o docker-machine nos permite visualizar qual o endereço ip da máquina ativa e também nos permite conectar a ela através dos comandos:

 % Imprime o endereço ip da máquina ativa
 $ docker-machine ip
 
 % Conecta e abre o prompt da máquina ativa
 $ docker-machine ssh

Exemplo de utilização: Rodando uma aplicação web com Docker

editar

Para nosso exemplo de aplicação web iremos rodar o python Flask. Comece com o comando docker run

$ docker run -d -P training/v python app.py

-d Diz ao docker para rodar o container em background.

-P Diz ao docker para mapear qualquer requisição de internet.

Agora podemos ver os containers em execução com o comando docker ps

$ docker ps -l

CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse
 
Aplicação web em docker
Resultado do container da aplicação web

Próximas etapas

editar

Integração contínua

editar

Além de tudo isso apresentado, docker oferece a possibilidade de ser usado com uma ferramenta de integração contínua para deixar o desenvolvimento ainda mais eficaz e seguro. Exemplo de um arquivo .travis.yml

sudo: required

language: ruby

services:
  - docker

before_install:
- docker pull carlad/sinatra
- docker run -d -p 127.0.0.1:80:4567 carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec foreman start;"
- docker ps -a
- docker run carlad/sinatra /bin/sh -c "cd /root/sinatra; bundle exec rake test"

script:
- bundle exec rake test

Para mais informações <https://docs.travis-ci.com/user/docker/>

Docker Hub & Documentação Docker

editar

Docker Hub

editar

Docker Hub é um repositório público de imagens, para que usuários tenham fácil acesso a imagens necessárias para seu trabalho. Esse repositório é composto tanto de imagens oficiais do Docker quanto de imagens enviadas por usuários. O Docker Hub disponibiliza as seguintes funcionalidades:

  • Repositório de Imagens: Você pode gerenciar, achar, dar push e pull de imagens da comunidade, oficiais e bibliotecas privadas.
  • Builds Automáticas: Docker deixa você criar automaticamente novas imagens quando é realizado mudanças em um repositório de código fonte.
  • Webhooks: Uma funcionalidade de builds automáticas, que permite que você ative ações depois de um push válido para um repositório.
  • Organizações: Você tem a possibilidade de criar times para gerenciar e acessar repositórios.
  • Integração com Github e Bitbucket: Você pode adicionar suas imagens para seu workflow ativo.
 
Lista de imagens públicas do DockerHub
Lista de imagens públicas do DockerHub

Documentação Docker

editar

A documentação do Docker é muito extensa e bem completa, você pode tirar dúvidas e aprender como utilizar mais a fundo apenas lendo a documentação. Para mais informações consulte o site da documentação oficial.

 
Documentação oficial Docker
Documentação oficial Docker

Referências

editar

Documentação Docker <https://docs.docker.com> Acesso em 3 Setembro, 2016