Este tutorial te guiará pelo mundo do Docker, desde seus fundamentos até as técnicas mais avançadas. Prepare-se para aprender sobre essa poderosa ferramenta e transformar a forma como você desenvolve, implanta e gerencia seus aplicativos!
O Docker é uma plataforma de containerização de aplicativos que permite empacotar seu software e suas dependências em unidades chamadas contêineres. Imagine contêineres como caixas que armazenam tudo que seu aplicativo precisa para funcionar, como código, bibliotecas, configurações e arquivos.
- Isolamento: Os contêineres são isolados uns dos outros, garantindo que seus aplicativos não interfiram entre si, aumentando a segurança e estabilidade.
- Portabilidade: Os contêineres podem ser executados em qualquer ambiente com Docker instalado, independentemente do sistema operacional, facilitando a implantação em diferentes ambientes.
- Agilidade: A criação e a implantação de contêineres são rápidas e fáceis, acelerando o desenvolvimento e o lançamento de aplicativos.
- Eficiência: Os contêineres são leves e compartilham recursos do sistema host, otimizando o uso de hardware e reduzindo custos.
- Repetibilidade: A natureza imutável dos contêineres garante que seu aplicativo seja executado da mesma maneira em diferentes ambientes, proporcionando confiabilidade.
- Desenvolvimento e testes: Crie ambientes de desenvolvimento isolados para cada desenvolvedor ou teste diferentes versões de um aplicativo sem afetar a produção.
- Implantação em produção: Implante e gerencie seus aplicativos em servidores de produção de forma rápida, eficiente e escalável.
- Microsserviços: Arquitete seus aplicativos como microsserviços modulares e independentes, facilitando o gerenciamento e a escalabilidade.
- Nuvem: Execute seus aplicativos em plataformas de nuvem como AWS, Azure e Google Cloud Platform com facilidade e flexibilidade.
Se você ainda não instalou seguindo os passos que deixei no README pelo WSL, tente instalar seguindo a documentação.
- Acesse o site oficial do Docker: https://docs.docker.com/get-docker/
- Escolha o sistema operacional do seu computador e siga as instruções de instalação.
- Verifique se o Docker está instalado executando o comando
docker version
no terminal.
- Baixe uma imagem de contêiner do Docker Hub:
docker pull hello-world
- Execute o contêiner:
docker run hello-world
- Observe a saída do contêiner:
docker logs hello-world
- Imagens são modelos pré-construídos que contêm todo o código e as dependências necessárias para executar um aplicativo.
- As imagens são armazenadas localmente no seu computador ou podem ser baixadas do Docker Hub, um repositório público de imagens.
- Contêineres são instâncias executáveis de imagens.
- Cada contêiner possui seu próprio espaço de arquivos, processo e rede isolados, garantindo a independência dos aplicativos.
- O Docker fornece uma variedade de comandos para gerenciar imagens e contêineres, como
docker pull
,docker run
,docker ps
,docker stop
,docker rm
e muitos outros.
Comando | Descrição |
---|---|
docker pull <imagem> |
Baixa uma imagem do Docker Hub. |
docker run <imagem> |
Executa um contêiner a partir de uma imagem. |
docker ps |
Lista os contêineres em execução. |
docker stop <container-id> |
Para um contêiner em execução. |
docker rm <container-id> |
Remove um contêiner. |
docker images |
Lista as imagens armazenadas localmente. |
docker rmi <imagem-id> |
Remove uma imagem local. |
docker exec -it <container-id> <comando> |
Executa um comando dentro de um contêiner. |
docker logs <container-id> |
Visualiza os logs de um contêiner. |
docker build -t <imagem-nome> . |
Constrói uma imagem a partir do diretório atual. |
docker push <imagem-nome> |
Envia uma imagem para o Docker Hub. |
Vale lembrar que cada comando tem suas variações de acordo com argumentos adicionais (flags) que você pode passar. Um exemplo é o docker ps -a
que lista tanto os conteiners em execução quanto os parados.
Recomendo que consulte a documentação para saber mais dessas flegs
Para remover todos os conteiners, existem diversas formas e passos, como:
-
Listar Todos os Contêineres:
- Primeiro, você pode listar todos os contêineres (tanto em execução quanto parados) usando o comando
docker ps -a
- Primeiro, você pode listar todos os contêineres (tanto em execução quanto parados) usando o comando
-
Parar Todos os Contêineres em Execução:
- Antes de remover, você precisa parar todos os contêineres que estão em execução. Você pode fazer isso com o comando:
docker stop $(docker ps -q)
- Antes de remover, você precisa parar todos os contêineres que estão em execução. Você pode fazer isso com o comando:
-
Remover Todos os Contêineres:
- Depois de parar os contêineres, você pode removê-los com o comando
docker rm $(docker ps -a -q)
- Depois de parar os contêineres, você pode removê-los com o comando
docker ps -a
: Lista todos os contêineres, incluindo os que estão parados.- docker ps -q: Retorna apenas os IDs dos contêineres em execução.
- docker stop $(docker ps -q): Para todos os contêineres em execução.
- $(docker ps -q) é uma substituição de comando que retorna a lista de IDs de contêineres.
- docker rm $(docker ps -a -q): Remove todos os contêineres.
- $(docker ps -a -q) é uma substituição de comando que retorna a lista de IDs de todos os contêineres (em execução e parados).
Existe também o "Comando Único" para parar e remover todos os contêineres, onde
você pode combinar os comandos acima em um único comando para parar e remover todos os contêineres: docker stop $(docker ps -q) && docker rm $(docker ps -a -q)
Se você está utilizando Docker Compose, pode remover todos os contêineres definidos no seu arquivo docker-compose.yml com o seguinte comando docker-compose down
.
Este comando irá parar e remover todos os contêineres, redes e volumes (opcionalmente) criados pelo Docker Compose.
Se você também deseja remover volumes e redes associados aos contêineres, use o comando docker-compose down
com as opções -v
para volumes e --remove-orphans
para redes órfãs:
docker-compose down -v --remove-orphans
E se desejar remover volumes de contêineres não utilizados, pode usar: docker volume prune
E para redes não utilizadas: docker network prune
`
Esses passos e comandos irão garantir que todos os seus contêineres sejam completamente removidos, junto com quaisquer volumes e redes associados, se necessário.
Quando você executa um contêiner a partir de uma imagem, todos os dados gerados pelo contêiner são armazenados em uma camada de escrita temporária. Essa camada é removida quando o contêiner é interrompido. Isso pode ser problemático para aplicativos que precisam persistir dados, como bancos de dados ou sistemas de arquivos.
O Docker volumes oferecem uma solução para dados persistentes. Um volume é um diretório no sistema host que é mapeado para um diretório dentro do contêiner. Isso permite que o contêiner armazene e acesse seus dados de forma persistente, independentemente do ciclo de vida do contêiner.
Para usar volumes, você pode especificar a opção -v durante a execução do contêiner:
docker run -v <host-diretorio>:<container-diretorio> <imagem>
Por exemplo, para persistir os dados de um banco de dados MySQL em contêiner, você pode executar/:
docker run -v mysql-data:/var/lib/mysql mysql:latest
Neste comando, o diretório mysql-data no sistema host é mapeado para o diretório /var/lib/mysql dentro do contêiner MySQL. Dessa forma, os dados do banco de dados serão persistidos no diretório do host e acessíveis mesmo após a reinicialização do contêiner.
Docker Compose é uma ferramenta que simplifica a definição e execução de aplicações multi-containers. Com Docker Compose, você usa um arquivo YAML para definir os serviços, redes e volumes necessários para sua aplicação. Em seguida, um único comando pode criar e iniciar todos os serviços definidos no arquivo.
-
Definição dos Serviços:
- Você cria um arquivo chamado docker-compose.yml onde define todos os serviços que compõem sua aplicação. Cada serviço é um container que será gerenciado pelo Docker Compose.
-
Configuração dos Serviços:
- No arquivo docker-compose.yml, você especifica a imagem Docker a ser usada para cada serviço, as portas a serem expostas, as variáveis de ambiente, volumes e redes.
-
Comandos do Docker Compose:
docker-compose up
: Cria e inicia todos os containers definidos no arquivo docker-compose.yml.docker-compose down:
Para e remove todos os containers, redes e volumes - criados pelo comando up.docker-compose ps
: Lista os containers em execução. -docker-compose logs
: Exibe os logs de todos os serviços.
O comando docker-compose up -d
é usado para iniciar todos os serviços definidos no arquivo docker-compose.yml
em modo destacado (detached), o que significa que os contêineres serão executados em segundo plano. No entanto, existem vários comandos e opções adicionais que você pode usar com docker-compose
para gerenciar seus serviços. Aqui estão alguns dos mais úteis:
-
Iniciar Serviços:
docker-compose up -d
- -d: Executa os contêineres em segundo plano (modo destacado).
-
Parar Serviços:
docker-compose stop
- Para os contêineres sem removê-los.
-
Parar e Remover Serviços e Recursos:
docker-compose down
- Para e remove contêineres, redes e volumes definidos no
docker-compose.yml
.
- Para e remove contêineres, redes e volumes definidos no
-
Forçar a Recriação dos Contêineres:
docker-compose up --force-recreate
- Recria os contêineres mesmo se não houver mudanças no
docker-compose.yml
.
- Recria os contêineres mesmo se não houver mudanças no
-
Recriar Apenas Contêineres com Mudanças:
docker-compose up --build
- Recompila as imagens e recria os contêineres se houver mudanças nos arquivos de configuração.
-
Remover Contêineres Órfãos:
docker-compose up --remove-orphans
- Remove contêineres que não estão mais definidos no
docker-compose.yml
.
- Remove contêineres que não estão mais definidos no
-
Listar Serviços em Execução:
docker-compose ps
- Lista todos os contêineres em execução gerenciados pelo
docker-compose
.
- Lista todos os contêineres em execução gerenciados pelo
-
Verificar Logs dos Serviços:
docker-compose logs
- Mostra os logs dos contêineres.
- Para seguir os logs em tempo real:
docker-compose logs -f
-
Executar Comandos em Contêineres em Execução:
docker-compose exec <service_name> <command>
- Executa um comando em um contêiner em execução. Por exemplo, para abrir um shell no contêiner do PostgreSQL:
docker-compose exec postgres bash
- Executa um comando em um contêiner em execução. Por exemplo, para abrir um shell no contêiner do PostgreSQL:
-
Verificar o Estado dos Contêineres e Dependências:
docker-compose top
- Exibe a árvore de processos dos contêineres.
-
Reiniciar Serviços:
docker-compose restart
- Reinicia todos os serviços ou um serviço específico:
docker-compose restart <service_name>
- Reinicia todos os serviços ou um serviço específico:
-
Remover Contêineres Parados e Volumes Não Utilizados:
docker-compose down --volumes
- Remove todos os volumes definidos e associados aos serviços.
-
Atualizar Imagens e Recriar Contêineres:
docker-compose pull
- Puxa as versões mais recentes das imagens definidas no
docker-compose.yml
.
- Puxa as versões mais recentes das imagens definidas no
-
Verificar Configuração:
docker-compose config
- Verifica e valida o arquivo de configuração
docker-compose.yml
.
- Verifica e valida o arquivo de configuração
-
Remover Contêineres Parados e Imagens Não Utilizadas:
docker-compose down --rmi all
- Remove contêineres, redes, volumes e também todas as imagens usadas pelos serviços.
Para ilustrar um fluxo de trabalho completo, considere os seguintes passos:
-
Inicializar Serviços em Segundo Plano:
docker-compose up -d
-
Verificar Serviços em Execução:
docker-compose ps
-
Seguir Logs em Tempo Real:
docker-compose logs -f
-
Executar um Comando no Serviço PostgreSQL:
docker-compose exec postgres psql -U postgres
-
Reiniciar um Serviço Específico:
docker-compose restart pgadmin
-
Parar e Remover Todos os Serviços e Recursos:
docker-compose down --volumes --remove-orphans
Um exemplo básico de um arquivo docker-compose.yml que define uma aplicação web com um serviço de banco de dados:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
database:
image: postgres:latest
environment:
POSTGRES_USER: example
POSTGRES_PASSWORD: example
POSTGRES_DB: exampledb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
-
Criar o Arquivo docker-compose.yml:
- No diretório do seu projeto, crie um arquivo chamado docker-compose.yml e adicione a configuração dos serviços.
-
Iniciar os Serviços:
- Navegue até o diretório do projeto no terminal e execute docker-compose up. Isso criará e iniciará todos os containers definidos no arquivo.
-
Gerenciar os Containers:
- Use comandos como
docker-compose ps
,docker-compose logs
edocker-compose down
para gerenciar seus containers.
- Use comandos como
- Automação: Facilita a automação da criação, configuração e execução de ambientes multi-containers.
- Reprodutibilidade: Garante que o ambiente de desenvolvimento seja consistente com o de produção.
- Isolamento: Cada serviço é executado em um container separado, permitindo isolamento de dependências e evitando conflitos.
- Facilidade de Uso: Um único arquivo YAML simplifica a gestão de configurações complexas.