Docker
O que é o Docker?
[editar | editar código-fonte]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 | editar código-fonte]Uma máquina virtual. Existe apenas um sistema operacional rodando, esse SO é apenas esculpido em pequenos espaços isolados.
Instalando Docker
[editar | editar código-fonte]Visão Geral
[editar | editar código-fonte]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.
Linux
[editar | editar código-fonte]- Logue no sistema com privilégios de sudo ou root
- 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
- 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
- Abra o arquivo /etc/apt/sources.list.d/docker.list
sudo nano /etc/apt/sources.list.d/docker.list
- Caso não exista crie-o
- 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
- Salve o arquivo e atualize os pacotes
$ sudo apt-get update
- Instale o Docker
$ sudo apt-get install docker-engine
- Inicialize e teste o Docker
$ sudo service docker start
- 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
- Agora podemos usar o comando docker normalmente
Mac OSX
[editar | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]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
Como utilizar?
[editar | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]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
Próximas etapas
[editar | editar código-fonte]Integração contínua
[editar | editar código-fonte]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 | editar código-fonte]Docker Hub
[editar | editar código-fonte]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.
Documentação Docker
[editar | editar código-fonte]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.
Referências
[editar | editar código-fonte]Documentação Docker <https://docs.docker.com> Acesso em 3 Setembro, 2016