# 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.