Primeiros passos com Docker

Docker é um sistema de virtualização, porém, não tradicional. Enquanto em um ambiente de virtualização tradicional nós temos um S.O. completo e isolado (Virtualbox, Xen etc), dentro do Docker nós temos recursos isolados que utilizam bibliotecas de kernel em comum (entre host e container), isso é possível pois o Docker utiliza como backend o nosso conhecido LXC. (conhecido de quem????)

O Docker possibilita o empacotamento de uma aplicação ou ambiente inteiro dentro de um container, e a partir desse momento o ambiente inteiro torna-se portável para qualquer outro Host que contenha o Docker instalado.

Isso reduz drasticamente o tempo de deploy de alguma infraestrutura ou até mesmo aplicação, pois não há necessidade de ajustes de ambiente para o correto funcionamento do serviço, o ambiente é sempre o mesmo, configure-o uma vez e replique-o quantas vezes quiser.

Para desenvolvedores, a criação de uma imagem para a aplicação, garante que o resultado obtido no ambiente de desenvolvimento será o mesmo nos ambientes de homologação e de produção.

O Docker agiliza o processo de levantar ambientes de testes. Basta um comando e uma aplicação estará pronta para rodar em instantes, sem a necessidade de executar o velho passo a passo de instalação que consome algumas horas de trabalho.

Instalar Docker no Mint

Siga a instalação disponível neste link

https://www.simon-hardy.com/blog/post/install-docker-on-linux-mint-18

Por padrão, apenas o usuário root pode executar comandos da docker. Para permitir que seu usuário de trabalho possa executar comandos na Docker, siga os seguintes passos:

sudo usermod -aG docker seu_usuario

sudo setfacl -m user:seu_usuario:rw /var/run/docker.sock

Primeiros passos

Para entender como operar o Docker, vamos começar por algo simples. Vamos rodar uma aplicação como  o OTRS (sistema de help desk)

O comando básico é o seguinte:

docker run --name meu_otrs -d ligero/otrs_easy

Sobre o comando acima:

run: é comando utilizado para criar um container

–name, é importante para facilitar o trabalho de gestão dos containers. Se você não passa um nome, o Docker cria um por conta própria e pode ser difícil de lembrar do que se trata, depois de ter uma dezenas de containers criados

-d (detached), significa que o container vai rodar como um “serviço”, ou seja, você não terá acesso ao shell do mesmo durante o momento da criação, apenas depois se desejar

ligero/otrs_easy, nome da imagem que será executada como base do container.

O Docker verifica inicialmente se imagem existe na máquina local, caso contrário tenta encontrá-la no site hub.docker.com

Voltando aos nossos primeiros passos, você pode verificar como está o andamento da inicialização de sua docker, através do comando logs:

docker logs meu_otrs

O sistema irá exibir todo o log de inicialização do container. No exemplo do OTRS, quando você ver a linha abaixo, saberá que a aplicação já está pronta para ser acessada:

2018-02-16 17:51:07,501 INFO success: apache2 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

Cada imagem terá sua própria maneira de informar que está pronta para utilização

Neste exemplo estamos criando um container OTRS que responde na porta 80 do container. Cada Container recebe um IP dinâmico. Precisamos saber qual é o ip que foi concedido para o container, de tal forma que possamos acessá-lo através do navegador. Para isso podemos acessar o Shell do container, através do comando abaixo:

docker exec -ti meu_otrs /bin/bash

Explicando:

-ti de forma resumida, é necessário colocar esta opção para fazer com que o terminal de sua máquina se conecte no terminal do container

/bin/bash o shell que deseja executar

Dentro do shell do container, execute:

ip a

Para fechar o bash do container, pressione Crtl+P+Q

Você também pode executar um comando no container diretamente, sem abrir um terminal do mesmo. Veja como obter o ip diretamente:

docker exec meu_otrs ip a

Com o IP obtido, acesse então o navegador

http://ip_do_container/otrs/index.pl

Formas mais avançadas de se criar um container

Executando uma versão específica da imagem:

Por padrão, quando escolhemos uma imagem, tal como ligero/otrs_easy, o docker vai tentar obter a última versão da mesma, ou seja, neste caso, ligero/otrs_easy:latest.

Você pode sempre escolher qual versão deseja rodar de uma determinada imagem, por exemplo:

docker run --name meu_otrs -d ligero/otrs_easy:5.0.26

Você irá encontrar as versões disponíveis para execução de cada aplicação em sua documentação ou na aba “tags” de seu repositório no hub.docker.com.

Mapeando portas do container para sua máquina

Que tal executar esta aplicação acima e fazer com que ela responda em http://localhost/otrs/index.pl ao invés do http://ip_do_container/otrs/index.pl?

Isto é possível através do parâmetro -p:

docker run --name meu_otrs -p 80:80 -d ligero/otrs_easy:5.0.26

Do lado esquerdo, temos a porta do container (80), do lado direito, a porta na qual queremos fazer o mapeamento em nossa máquina.

Note que se houver algum outro serviço rodando na porta 80 de sua máquina, não será possível mapear a porta deste container. Neste caso você pode escolher outra porta local, por exemplo, 8080:

docker run --name meu_otrs -p 80:8080 -d ligero/otrs_easy:5.0.26

Variáveis de inicialização

Muitas imagens, permitem uma customização de paramêtros durante sua inicialização através das variáveis de ambiente.

O OTRS por exemplo, permite que seja definido o idioma padrão da aplicação, durante sua execução. Para isso, usamos a opção -e junto com o parâmetro que é indicado na documentação da imagem:

docker run --name meu_otrs -e OTRS_DEFAULT_LANGUAGE=pt_BR -p 80:80 -d ligero/otrs_easy:5.0.26

O conjunto de variáveis de inicialização que permitem parametrização dos containers está disponível na documentação de cada imagem.

Usando volumes persistentes

Um ponto importante sobre os containers Docker, é que seus dados, a princípio, são voláteis, ou seja, quando você remover um container com o comando “rm”, todos os arquivos deste container serão apagados.

No entanto, há uma forma de criar volumes ou pastas persistentes, ou seja, pastas que são armazenadas no seu computador e não são apagadas quando o container é apagado:

docker run -ti --name meu_otrs -v otrs_mysql:/var/lib/mysql -v otrs_app:/opt/otrs -p 80:80 -e OTRS_DEFAULT_LANGUAGE=pt_BR ligero/otrs_easy:5.0.26

Observe no comando acima, que criamos um volume de nome otrs_mysql, que será mapeado na pasta /var/lib/mysql da container e armazenará os arquivos do mysql, e um outro volume otrs_app que armazenará os dados da aplicação.

O Docker armazena estes volumes na pasta /var/lib/docker/volumes da máquina hospedeira.

Você também pode fazer o mapeamento de uma pasta já existente na máquina hospedeira para dentro do container. Neste caso, basta passar o caminho completo da mesma:

docker run -ti --name meu_otrs -v /opt/clientex/mysql:/var/lib/mysql -v /opt/clientex/otrs:/opt/otrs -p 80:80 -e OTRS_DEFAULT_LANGUAGE=pt_BR ligero/otrs_easy:5.0.26

Gerenciando os containers

Verificando os containers em execução

Para verificar quais containers estão em execução no momento, utilize o comando ps:

docker ps

Você terá acesso a uma tabela com as seguintes informações de cada container:

  • CONTAINER ID: Id gerado de forma automática. Quando você for realizar alguma operação no container como parar, apagar ou reiniciar, você poderá utilizar seu ID ou seu nome.
  • IMAGE: Imagem que deu origem ao container. No nosso exemplo, seria ligero/otrs_easy:5.0.26
  • COMMAND: o comando de inicialização do container. Um comando padrão é especificado pelo criador da imagem, mas também há a possibilidade de se rodar um container com um comando de inicialização persolinalizado.
  • CREATED: Tempo desde sua criação.
  • STATUS: Quando tempo desde a última vez que foi inicializado.
  • PORTS: Porta expostas do container.
  • NAMES: Nome do container.

Você pode ver também uma listagem de todos os containers, incluindo os que estão em pausa ou paralizados com o seguinte comando:

docker ps a

Parando e retomando a execução de um container

Sim! Você pode parar um container para retomar sua execução posteriormente. O ato de parar um container não implica na exclusão de seus arquivos

Para para um container, execute o comando:

docker stop nome_do_container

Para inicializá-lo:

docker start nome_do_container

Importante: Ao inicializar um container novamente, ele poderá pegar um IP diferente do que o que havia na execução anterior.

Removendo definitivamente um Container

Para remover um container, utilize o seguinte comando:

docker rm nome_do_container

O container precisa estar parado para que ação seja executada. Se quiser excluir um container em execução, utilize a opção -f:

docker rm -f nome_do_container

Criando uma imagem personalizada, a partir de um container em execução

Não é muito usual nem muito recomendado, mas você pode criar uma imagem local de seu container, com os arquivos que você modificou durante a execução do mesmo. Isto pode ser útil para estudos e replicações rápidas. Para isso, utilize o comando abaixo:

docker commit meu_container nomedaminhaimagem:1.2.3

Note que o “nomedaminhaimagem”, pode ser criado neste caso de forma livre, pois você está apenas criando uma imagem local. Você pode também especificar a versão desta imagem, como fizemos no comando acima.

Para criar um novo container a partir desta imagem modificada, basta utilizar o comando run apontando para ela:

docker run --name meu_container nomedaminhaimagem:1.2.3

Novamente, este recurso não é muito utilizado, visto que uma das coisas mais belas da utilização da Docker, são as receitas de criação das imagens (Dockerfile). Através da Dockerfile, qualquer pessoa sabe exatamente como aquela imagem foi gerada. Através do recurso de commit no entanto, não será possível saber quais modificações deram origem a uma determinada imagem.

Gerenciando Imagens

Verificando as imagens locais

Para verificar todas as imagens que estão em seu computador e o respectivo tamanho de cada uma delas, execute o comando abaixo:

docker images

Removendo uma imagem

Para remover uma imagem, execute:

docker rmi nome_da_imagem:versao

Se existirem containers criados com esta versão da imagem a ser apagado, você deverá utilizar a opção -f para forçar a exclusão:

docker rmi -f nome_da_imagem:versao

Este post foi publicado por mim também no Blog da Complemento:

Primeiros passos com Docker

Deixe uma resposta

This site uses Akismet to reduce spam. Learn how your comment data is processed.