# Passo-a-Passo Rápido

Caso não tenha trabalhando anteriormente com o Docker, comece por esta sessão! Os passos descritos, aqui, tem algumas dicas contidas no livro Learning Docker (opens new window) e diversas outras fontes da WEB.

# Obtendo informações sobre o Docker

Antes de iniciar, verifique como está o ambiente Docker com o comando:

sudo docker info

[marcos@localhost mozilla_marcos0]$ sudo docker info
Containers: 8
 Running: 1
 Paused: 0
 Stopped: 7
Images: 12
Server Version: 18.09.9
...

# Baixando uma imagem no Docker

Depois do docker instalado (links na página inicial, comece baixando uma imagem. O comando para tal é:

sudo docker pull nome-imagem

Vamos criar um contêiner a partir de uma imagem de uma distribuição Linux sem qualquer aplicação específica associada. Para baixar digite:

sudo docker pull busybox ou

sudo docker pull alpine

[docker_usr@localhost ~]$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
7c9d20b9b6cd: Pull complete 
Digest: sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e
Status: Downloaded newer image for busybox:latest

TIP

  • A imagem BusyBox (opens new window) é conhecida como canivete suíço, pois com um tamanho entre 1 e 5 Mb é excelente para criar distribuições com economia de espaço, além de possuir utilitários muito pequenos que substituem os tradicionais.
  • Outra imagem ótima é a Alpine (opens new window), uma distribuição construída com _(musl libc)[https://www.musl-libc.org/] e BusyBox.Ela é muito pequena e otimizada para ser executada na RAM pois utiliza no máximo 8MB. Também pode ser um bom controlador para vários contêineres de docker com RAM suficiente.
  • Para baixar aplicações completas o processo é o mesmo. No Docker Hub (opens new window) imagens para a maioria dos bancos de dados como postgres, redis, mysql, mongo, etc.

# Verificando as imagens disponíveis em seu repositório

sudo docker images

[docker_usr@localhost ~]$ sudo docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
busybox               latest              19485c79a9bb        5 weeks ago         1.22MB
alpine                3.9                 cdf98d1859c1        6 months ago        5.53MB

# Comandos básicos para Contêiners

Uma vez baixada a imagem desejada, pode-se começar a trabalhar com os contêiners, para tal é suficiente conhecer alguns poucos comandos. Certifique-se de que tenha instalado uma versão mais recente do Docker.

Comando Descrição
create Cria um contêiner a partir de uma imagem
inspect Lista as informações sobre um contêiner
kill Pára instantaneamente o processo principam dentro do contêiner
logs Imprimi os logs
ls Lista os contêiners que estão em execução
rm Apaga um contêiner com parado
run Cria um contêiner e o inicializa
start Inicializa um containder criado/parado anteriormente
stop Pára a execução de um contêiner, finalizando a execução dos processos

Os comandos acima são utilizados com a sintaxe:

docker container nome-comando

# Criando contêiner com CREATE

São varias as formas de se criar um contêiner à partir de uma imagem. Uma das formas mais simples é criar um contêiner com o comando create:

sudo docker container create alpine /bin/ash

[marcos@localhost ~]$ sudo docker container create alpine /bin/ash
941b12c14898360536aebcde99a7fdcd669880667f033978599b1f9f3b61c383
[marcos@localhost ~]$ 
[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                       PORTS                    NAMES
941b12c14898        alpine                "/bin/ash"               9 seconds ago       Created                                               romantic_kalam
[marcos@localhost ~]$

# Rodando o primeiro contêiner

Outra maneira comum de criar um contêiner é através do comando run:

sudo docker run busybox echo "Leia o Manual!"

[marcos@localhost ~]$ $sudo docker run busybox echo "Leia o Manual!"
Leia o Manual!

# Verificando o contêiner criado

O contêiner criado após a execução do comando run pode ser visto através do comando container ls -a

sudo docker container ls -a

marcos@localhost mozilla_marcos0]$ sudo docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                    NAMES
941b12c14898        alpine                "/bin/ash"               9 minutes ago       Created                                               romantic_kalam
f2c66d7ce322        busybox               "echo 'Leia o Manual…"   10 seconds ago      Exited (0) 10 minutes ago                            kind_stonebraker

A saída acima, mostra que o contêiner kind_stonebraker foi criado, inicializado, executou sua tarefa e foi encerrado. O status "Exited" permite essa conclusão. O valor entre parenteses, nesse caso o 0 (zero), informa que o processo foi concluído sem erros.

# Status de um Contêiner

Além de "Exited", os contêineres podem estar em seu ambiente com qualquer uma das seguintes situações:

Status Descrição
Created O contêiner foi criado, mas não foi inicializado
Restarting O contêiner que está em processo de inicialização
Running O contêiner está em execução no momento da verificação do status
Paused O contêiner está pausado
Exited O contêiner que foi processado e concluiu sua atividade.
Dead O contêiner que o "daemon" tentou parar mas não conseguiu. Ocorre em momentos de uso intenso de recursos

# Nomeando um Contêiner

Ao criar um contêiner o docker associa ao mesmo um nome e uma UUID (código identificador unico) de maneira a identificá-lo. No exemplo anterior, o Docker, aleatóriamente nomeou o contêiner de "kind_stonebraker" e atribuiu o UUID f2c66d7ce322. Para um gerenciamento adequado será preciso atribuir nomes mais significativos.

# Nomeando um Contêiner

Para atribuir un nome a um contêiner, utilizar o parâmetro --name=nome-container

sudo docker run --name=diga_lom busybox echo "Leia o Manual!"

[marcos@localhost ~]$ sudo docker run --name=diga_lom busybox echo "Leia o Manual!"
Leia o Manual!
[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                    NAMES
118e04914d8e        busybox               "echo 'Leia o Manual…"   12 seconds ago      Exited (0) 11 seconds ago                            diga_lom

# Trabalhando interativamente com o contêiner

Ao trabalhar com dados, em várias situações é necessário trabalhar na linha de comando do contêiner que está em execução. O subcomando run possui is parâmetros t e i que inicializam o contêiner de forma interativa

sudo docker run --name=alpine_sandbox -it alpine /bin/ash

[marcos@localhost mozilla_marcos0]$ sudo docker run  --name=alpine_sandbox -it alpine /bin/ash
/ # 
  • O parâmetro i é o responsável pela inicialização interativa, capturando a entrada padrão (STDIN) do contêiner.
  • O parâmetro -t aloca um emulador de terminal e o atribui ao contêiner.

TIP

Usaremos o contêiner criado alpine_sandbox nos exemplos seguintes. Lembre-de de Trocar pelo nome do seu contêiner!

# Desconectando de um contêiner em execução

Em diversos momentos, trabalhando interativamente em um contêiner, se faz necessário desconectar do mesmo para fazer uma outra atividade no sistema operacional da máquina host, retornando em seguida. Para desconectar de um contêiner basta teclar a sequencia de comandos "Ctrl P" e "Ctrl Q".

Desconectando com "Ctrl P" e "Ctrl Q":

sudo docker run --name=alpine_sandbox -it alpine /bin/ash

[marcos@localhost ~]$ sudo docker run  --name=alpine_sandbox -it alpine /bin/ash
/ # ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
/ # [marcos@localhost ~]$ 
[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                    NAMES
229e10a256d5        alpine                "/bin/ash"               23 seconds ago      Up 21 seconds                                        alpine_sandbox
[marcos@localhost ~]$ 

# Conectando a um contêiner em execução

Para retornar ao contêiner que está em execução usa-se o subcomando attach

sudo docker attach alpine_sandbox

[marcos@localhost ~]$ sudo docker attach alpine_sandbox
/ # ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
/ # 

# Parando a um contêiner em execução

Para interromper um contêiner que está em execução usa-se o subcomando stop

sudo docker container stop alpine_sandbox

[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                    NAMES
8d24146968be        alpine                "/bin/ash"               14 seconds ago      Up 12 seconds                                        alpine_sandbox

[marcos@localhost ~]$ sudo docker container stop alpine_sandbox
alpine_sandbox

[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                       PORTS                    NAMES
8d24146968be        alpine                "/bin/ash"               45 seconds ago      Exited (137) 6 seconds ago                            alpine_sandbox

# Excluindo a um contêiner

Para excluir um contêiner o subcomando rm. O contêiner deve estar parado para que o comando seja executado com sucesso

sudo docker container rm alpine_sandbox

[marcos@localhost ~]$ sudo docker container rm alpine_sandbox
alpine_sandbox

# Controlando a execução de um contêiner

Além dos comandos apresentados anteriormente, existem alguns outros bastante úteis. mas para utilizá-los será nessária uma imagem que contenha, por exemplo, um servico em execução.

Por exemplo, as imagens utilizadas até aqui são iniciadas com o processador de comandos /bin/ash ou /bin/sh. Ao inicializar estes contêineres e desconectar, o mesmo passa para o status Exited.

Baixaremos um servidor web mínimo (opens new window) para os passos seguintes

sudo docker pull tobilg/mini-webserver

[marcos@localhost ~]$ sudo docker pull tobilg/mini-webserver
Using default tag: latest
latest: Pulling from tobilg/mini-webserver
2aecc7e1714b: Pull complete 
e8bfe4fc6199: Pull complete 
b234f264abbe: Pull complete 
684e340e448a: Pull complete 
67f83b1979d1: Pull complete 
00c829ba9035: Pull complete 
Digest: sha256:773954565f17198c1f4e68a2684171d3dd8d3434b9ffefd082c2901b0d7c3bc5
Status: Downloaded newer image for tobilg/mini-webserver:latest
[marcos@localhost ~]$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
tobilg/mini-webserver   latest              cd885ea73da2        2 years ago         64.5MB

# Contêiner executando em "background"

Em boa parte das aplicações deseja-se criar o contêiner e deixá-lo rodando em "background". O parâmetro -d informa ao "deamon" que o contêiner será executado desta forma:

sudo docker run -d nome_imagem

sudo docker run --name=mini-web -d tobilg/mini-webserver

[marcos@localhost ~]$ sudo docker run --name=mini-web -d tobilg/mini-webserver e202a158a4290ddb7911c87defcb67caa2f4ed9b89f9e5c03ebdf79e3046894f [marcos@localhost ~]$ sudo docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e202a158a429 tobilg/mini-webserver "node /app/mini-webs…" 6 seconds ago Up 5 seconds 3000/tcp mini-web

TIP

Por se tratar de um servidor WEB, são necessários parametros adicionais na inicializaçao. Para fins de exemplificação, estes parâmetos foram deixados de lado.☻

# Pausando um contêiner

O comando pause interrompe a execução em um ou mais contêineres pausando todos os processos, mantendo-os integros.

sudo docker pause mini-web

[marcos@localhost ~]$ sudo docker pause mini-web
mini-web
[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS                    NAMES
e202a158a429        tobilg/mini-webserver   "node /app/mini-webs…"   6 minutes ago       Up 6 minutes (Paused)       3000/tcp                 mini-web

# Restaura um contêiner "pausado"

O comando unpause restaura a execução em um ou mais contêineres pausados.

sudo docker unpause mini-web

[marcos@localhost ~]$ sudo docker unpause mini-web
mini-web
[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS                    NAMES
e202a158a429        tobilg/mini-webserver   "node /app/mini-webs…"   8 minutes ago       Up 8 minutes                3000/tcp                 mini-web

# Reinicializando um contêiner

Com o comando restart - Reinicializa um ou mais contêineres.Este é uma combinação dos comandos stop e start.

sudo docker restart mini-web

[marcos@localhost ~]$ sudo docker restart mini-web
mini-web
[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS                    NAMES
e202a158a429        tobilg/mini-webserver   "node /app/mini-webs…"   12 minutes ago      Up 5 seconds                3000/tcp                 mini-web

# Criando uma imagem a partir do Contêiner

Uma vez que as imagens são baixadas, os contêineres são criados e modificados para atender à demandas específicas como a criação de um ambiente de desenvolvimento, por exemplo. Para ser funcional este contêiner precisa ser adequadamente configurado, deve "apontar" para pastas locais na máquina hospedeira, de maneira que haja persistência de dados, terá diferentes programas instalados, bem como serviços configurados. Todo este esforço é preservado com a criação de uma nova imagem à partir do contêiner "pronto para uso".

Para criar uma imagem à partir de um contêiner que foi configurado, recebeu alterações, utilitários e programas, use o comando commit.

sudo docker commit alpine_sandbox img_alpine_sandbox

[marcos@localhost ~]$ sudo docker commit alpine_sandbox  img_alpine_sandbox
sha256:414544c5b9bb8f429d5fbb9ae837a83654eee20c2722ace93a5f4d0e7d832532
[marcos@localhost ~]$ sudo docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
img_alpine_sandbox      latest              414544c5b9bb        16 seconds ago      5.55MB

# Observações

# Contêiners devem ser descartáveis

O contêiner deve ser descartável, sem que ocorra prejuízo à atividade que ele dá suporte. Ou seja, ao finalizar sua execução, o mesmo deve ser apagado, evitando o consumo de recursos desnecessariamente.

Para criar um contêiner que será removido automaticamente após encerrado, utilize o argumento --rm.

sudo docker run --rm --name=diga-lom busybox echo "Leia o Manual!"

[marcos@localhost ~]$ sudo docker run --rm --name=diga-lom busybox echo "Leia o Manual!"
Leia o Manual!
[marcos@localhost ~]$ sudo docker container ls -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                      PORTS                    NAMES
[marcos@localhost ~]$ 

Preservando os dados

Todos os dados utilizados pelo contêiner serão EXCLUÍDOS também. Para preservar dados das aplicações ou dos trabalhos, os mesmos devem gravados em pastas locais do "host" que deverão se mapeadas como volume durante a criação do contêiner. Consulte "Usando volumes" para persistir os dados gerados em suas atividades.

# Trabalhando com Dockfile

A criação do contêiner é somente o primeiro passo na construção de um ambiente de desenvolvimento, criação de um servidor para testes, uma aplicação ou mesmo um microserviço.

Para que se tenha um contêiner pronto para o uso, invariavelmente, serão necessários passos adicionais tais como:

  • Atualizar as bibliotecas do SO, (apt-get update, etc..);
  • Instalar as bibliotecas da aplicação o contêiner; e
  • Aplicar configurações do ambiente como portas e volumes, entre outras atividades;

Para não ter que refazer todos estes passos todas as vezes que precisarmos de um contêiner, geramos uma imagem e a partir daí, basta criar os contêiners desejados.

O uso de arquivos "dockerfile" é a melhor forma de gerenciar as imagens. Consulte "Usando Dockfiles" para conhecer e começar a utilizar esse ótimo recurso.