Docker
  • Introdução a Containeres e Docker
    • Introdução
    • O que é um container e suas vantanges
    • VM versus Container
    • Como funcionam os containers
    • Linux
    • Container sem Docker
      • cgroup
      • cpu.max
    • LxC
    • LxD
    • Containers versus Imagens
    • Arquitetura do Docker
    • Arquitetura do Docker mais a fundo
    • Projetos Open Source
  • Instalação do Docker
    • Linux
    • Windows
      • Docker Desktop
      • Rancher Desktop
      • WSL
    • Mac
    • Visual Studio Code
  • Primeiros Passos com Docker
    • Criação e listagem básica de um container
    • Interagindo com o container
    • Executando containers continuamente
      • nginx
      • docker container run
      • docker container run nginx
      • docker container run -d nginx
      • docker container exec
    • Como usar publish de porta
      • docker container stop
      • docker container start
      • docker container rm
      • docker container rm -f $(docker container ls -qa)
    • Containers e variáveis de ambiente
      • docker container run -e
  • Desafio
    • Desafio 01 - Banco de Dados Postgresql
    • Desafio 02 - Banco de Dados MySQL
    • Desafio 03 - Banco de Dados MongoDB
  • Executando a sua primeira aplicação em containers
    • Introdução
    • Preparando o container para a aplicação
    • Executando a aplicação
      • docker container cp
  • Primeiros Passos com Docker Images
    • Introdução
    • OverlayFS na Prática
    • Copy-on-Write
    • Formas de criar uma imagem Docker
    • Como funciona o Docker Commit
    • Docker Commit na Prática
      • docker commit
    • Entendendo melhor a sua imagem
      • docker image history
      • docker image inspect
    • Entrando mais a fundo na imagem
    • Como usar a imagem Docker no modo raiz
  • Avançando em imagens Docker com Dockerfile
    • O que é Dockerfile
    • Primeira Imagem com Dockerfile
      • docker image build
    • Como funciona a construção com Dockerfile
    • Possibilidades com Dockerfile
    • FROM
    • RUN
    • WORKDIR
    • COPY
    • ADD
    • LABEL
    • ENV
    • VOLUME
    • ARG
    • EXPOSE
    • USER
    • ENTRYPOINT
    • CMD
    • ENTRYPOINT versus CMD
    • Principais comandos com imagem
    • Imagem da aplicação com Dockerfile
    • Comparando Docker Commit com Dockerfile
  • Docker Registry
    • Introdução
    • Docker Hub
    • Sua imagem com o nome certo
    • Renomear imagens com Docker Tag
      • docker image tag
    • Enviando a sua primeira imagem para o Docker Hub
      • docker image push
      • docker image pull
  • Algumas boas práticas para construção de imagem
    • Um processo por container
    • Usar imagens confiáveis
    • Otimizar sempre a sua imagem
    • Uso inteligente das camadas
    • Dockerignore
  • Multistage Build
    • Introdução
    • Multistage build na prática
    • Target para fazer o build
      • docker image build --target
    • Imagem externa no Multistage build
    • Usar um estágio de build como base
  • Docker Volume
    • Introdução
      • docker volume
    • Bind Mount
    • Particularidades do Bind Mount
    • Bind Mount no Windows
    • Exemplo com Bind Mount
    • Docker Volume
      • docker volume create
      • docker volume inspect
      • docker volume ls
      • docker volume prune
      • docker volume rm
    • Onde ficam os arquivos do Docker volume?
    • Usando o volume no Dockerfile
    • Como fazer backup de um Docker Volume
    • Exemplo com Docker Volume
    • Storage tmpfs
    • Como criar algo funcional com o que aprendemos
  • Network
    • Introdução
    • Componentes do Docker Network
    • Rede Bridge na prática
      • docker network
      • docker network create
      • docker network inspect
      • docker network ls
      • docker network prune
      • docker network rm
    • Criando a sua rede bridge
      • docker network connect
      • docker network disconnect
    • Como funciona a rede bridge por dentro
    • Rede Host na prática
    • Rede none da prática
    • Como adicionar domínios no seu container
  • Aplicação 100% no Docker
    • Introdução
    • Criação da Imagem e Envio para o Docker Hub
    • Criação do Docker Network
    • Container do PostgreSQL
    • Container da Aplicação Web
    • Atualização da aplicação
  • Docker Compose
    • Introdução
      • docker compose
    • A evolução do docker compose
    • Criação básica de um Docker Compose
      • docker compose attach
      • docker compose build
      • docker compose config
      • docker compose cp
      • docker compose create
      • docker compose down
      • docker compose events
      • docker compose exec
      • docker compose images
      • docker compose kill
      • docker compose logs
      • docker compose ls
      • docker compose pause
      • docker compose port
      • docker compose ps
      • docker compose pull
      • docker compose push
      • docker compose restart
      • docker compose rm
      • docker compose run
      • docker compose scale
      • docker compose start
      • docker compose stats
      • docker compose stop
      • docker compose top
      • docker compose unpause
      • docker compose up
      • docker compose version
      • docker compose wait
      • docker compose watch
    • Variáveis de Ambiente
    • Volume Bind Mount
    • Docker Volume
    • Docker Network - Bridge
    • Docker Network - Host Driver e Add Host
    • Ordenando a execução dos containers
    • Compose com build de imagem
    • Como Parametrizar o Compose com Variáveis de Ambiente
    • Múltiplos Composes
    • Extends
    • Merge
    • Include
    • Profiles
    • Comandos importantes do Docker Compose
  • Troubleshooting
    • Introdução
    • Docker Info
    • Docker Events
    • Docker Logs
    • Docker Inspect
    • Docker Top
    • Docker Stats
    • Docker Exec
  • Resiliência e Gerenciamento de Recursos
    • Introdução
    • Docker Restart
      • Introdução
      • on-failure
      • unless-stopped
      • always
      • Docker Compose
    • Healthcheck
      • Introdução
      • Linha de Comando
      • Docker Compose
      • Direto na Imagem
    • Gerenciamento de Recurso
      • CPU
        • Como Gerenciar CPU
        • Prática
      • Memória
        • Como Gerenciar Memória
        • Prática
      • Docker Compose
  • Fazendo um ambiente mais seguro
    • Introdução
    • Docker Scout
      • Introdução
      • Verificação Simples de Imagem
      • Como adicionar um repositório
      • Primeira melhoria na imagem
  • BUSCA RÁPIDA
    • Referências
    • Comandos
      • docker commit
      • docker compose
      • docker container
      • docker image
      • docker network
      • docker volume
    • Dockerfile
Powered by GitBook
On this page
  • Docker Compose
  • Facilidade de Orquestração
  • Reprodutibilidade
  • Configuração Simples de Rede
  • Eficiência no Desenvolvimento
  • Persistência de Dados e Volumes
  • Escalabilidade
  • Integração com Docker Swarm
  • Controle de Configuração
  • Conclusão
  • Dockerfile versus Docker Compose
  • Dockerfile
  • Docker Compose
  • Dockerfile vs Docker Compose: Como Eles se Complementam
  • Cenários Combinados
  • Conclusão
  1. Docker Compose

Introdução

  • Arquivo YAML com as especificações declarativas para a execução de uma solução com a criação de todos os containers, volumes, redes etc.;

  • Documentação do ambiente;

  • Catálogo de Docker Compose;

  • Não é igual ao Dockerfile e não tem o mesmo objetivo. O Dockerfile é a receita para criar imagem de container;

  • Docker Compose criar receitas de containers;

  • N ão são mutuamente excludentes. Eles se complementam.

Docker Compose

O Docker Compose oferece várias vantagens, especialmente para desenvolvedores e equipes que trabalham com aplicações multi-container. Aqui estão algumas das principais vantagens:

Facilidade de Orquestração

O Docker Compose permite definir e orquestrar múltiplos containers de forma simples, usando um único arquivo YAML (docker-compose.yml). Com isso, você pode:

  • Subir todos os serviços de uma aplicação com um único comando (docker-compose up).

  • Gerenciar dependências entre serviços, garantindo que containers sejam iniciados na ordem correta.

Reprodutibilidade

Com o Docker Compose, todo o ambiente de desenvolvimento, teste e produção pode ser reproduzido de forma idêntica em qualquer máquina ou servidor. Isso evita problemas de inconsistência de ambiente ("it works on my machine"):

  • Ambientes Consistentes: As mesmas configurações e versões de containers são usadas em todos os ambientes, desde o desenvolvimento até a produção.

  • Facilidade de Compartilhamento: Equipes podem compartilhar o arquivo docker-compose.yml e garantir que todos os membros tenham a mesma configuração.

Configuração Simples de Rede

O Docker Compose configura automaticamente redes Docker, permitindo que os containers se comuniquem entre si por meio de nomes de serviço definidos no arquivo YAML. Isso simplifica a configuração de rede em aplicações distribuídas:

  • Nomes de Serviço como DNS: Containers podem se comunicar usando os nomes dos serviços como DNS, facilitando a conexão entre eles.

Eficiência no Desenvolvimento

O Compose acelera o ciclo de desenvolvimento, permitindo que os desenvolvedores se concentrem no código e não na configuração de infraestrutura:

  • Hot-reloading e Debugging: É fácil reiniciar serviços individuais sem precisar parar toda a aplicação, o que é útil para desenvolvimento e debugging.

  • Integração com Ferramentas de CI/CD: Docker Compose é amplamente suportado por pipelines de integração contínua (CI) e entrega contínua (CD), facilitando o deploy automatizado.

Persistência de Dados e Volumes

O Compose facilita a configuração e o gerenciamento de volumes para persistência de dados entre reinicializações de containers:

  • Volumes Compartilhados: Diferentes serviços podem compartilhar volumes, tornando mais fácil o gerenciamento de dados persistentes.

  • Portabilidade de Dados: Com volumes, é possível mover dados entre ambientes sem complicações.

Escalabilidade

Embora o Docker Compose seja mais comumente usado em ambientes de desenvolvimento e testes, ele também permite escalar serviços em produção:

  • Escalabilidade Horizontal: Você pode facilmente aumentar o número de instâncias de um serviço (containers) para balancear carga ou melhorar a resiliência.

Integração com Docker Swarm

O Docker Compose pode ser usado com Docker Swarm para orquestração em ambientes de produção, facilitando o deploy de clusters e o gerenciamento de múltiplos nós:

  • Fácil Transição para Produção: O mesmo arquivo docker-compose.yml pode ser usado para implantar serviços em um cluster Docker Swarm, aproveitando o conhecimento existente.

Controle de Configuração

O Docker Compose permite o controle detalhado de configurações através de variáveis de ambiente e arquivos .env, facilitando a adaptação a diferentes ambientes (dev, staging, prod) sem modificar o código:

  • Configuração Centralizada: Todas as configurações de serviços estão em um único lugar, facilitando ajustes e versões.

Conclusão

O Docker Compose simplifica muito o gerenciamento de aplicações Docker multi-container, aumentando a eficiência no desenvolvimento, a reprodutibilidade dos ambientes, e facilitando a configuração e orquestração de serviços. Ele é uma ferramenta poderosa tanto para ambientes de desenvolvimento quanto para produção, ajudando a manter a consistência e a escalabilidade de aplicações complexas.

Dockerfile versus Docker Compose

O Dockerfile e o Docker Compose são duas ferramentas essenciais no ecossistema Docker, mas servem a propósitos diferentes. Abaixo, vamos explorar as diferenças, como eles se complementam, e quando usar cada um.

Dockerfile

Propósito

O Dockerfile é um script de configuração que contém uma série de instruções para montar uma imagem Docker. Ele define como construir uma imagem desde uma base (como uma distribuição Linux) até incluir todas as dependências, configurações, código, e comandos necessários para rodar um container.

Principais Componentes

  • FROM: Especifica a imagem base para iniciar a construção da nova imagem.

  • RUN: Executa comandos no processo de construção da imagem (ex: instalar pacotes).

  • COPY e ADD: Copiam arquivos e diretórios do host para o sistema de arquivos da imagem.

  • CMD e ENTRYPOINT: Definem o comando ou processo que será executado quando o container iniciar.

  • EXPOSE: Informa quais portas o container vai expor.

Quando Usar

  • Criação de Imagens: Use o Dockerfile para definir como construir uma imagem que contenha todas as dependências e configurações necessárias para rodar uma aplicação ou serviço específico.

  • Distribuição: Imagens criadas a partir de um Dockerfile podem ser compartilhadas via registries como Docker Hub, permitindo que outros utilizem a mesma imagem em diferentes ambientes.

Exemplo de Dockerfile

# Usar uma imagem base
FROM node:14

# Definir o diretório de trabalho no container
WORKDIR /app

# Copiar package.json e instalar dependências
COPY package*.json ./
RUN npm install

# Copiar o restante do código
COPY . .

# Expor a porta
EXPOSE 8080

# Comando para rodar a aplicação
CMD ["node", "app.js"]

Docker Compose

Propósito

O Docker Compose é uma ferramenta que permite orquestrar múltiplos containers que compõem uma aplicação, facilitando a definição e execução desses containers em conjunto. Ele utiliza um arquivo YAML (docker-compose.yml) para definir serviços, redes, volumes e outras configurações necessárias para a aplicação.

Principais Componentes

  • services: Define os containers a serem criados e suas configurações (imagem, portas, volumes, etc.).

  • networks: Configura redes Docker para permitir a comunicação entre containers.

  • volumes: Define volumes para persistência de dados entre reinicializações de containers.

Quando Usar

  • Orquestração de Múltiplos Containers: Use o Docker Compose quando sua aplicação depende de vários serviços (como uma aplicação web com um banco de dados).

  • Ambientes de Desenvolvimento e Teste: Docker Compose é especialmente útil para criar ambientes completos com um único comando (docker-compose up), facilitando o ciclo de desenvolvimento e testes.

  • Escalabilidade Local: Permite testar a escalabilidade horizontal de serviços rodando múltiplas instâncias do mesmo container.

Exemplo de Docker Compose

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - .:/app
    depends_on:
      - db

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

Dockerfile vs Docker Compose: Como Eles se Complementam

  • Dockerfile: É usado para definir como uma imagem Docker é construída. Você define o ambiente em que seu código irá rodar, instalando todas as dependências e configurando o ambiente adequado.

  • Docker Compose: Uma vez que você tenha suas imagens Docker (sejam criadas por você ou por terceiros), o Docker Compose orquestra essas imagens em serviços, define as redes para comunicação entre containers, gerencia volumes, e pode escalar serviços conforme necessário.

Cenários Combinados

  1. Criação e Orquestração: Você cria uma imagem para o seu serviço web usando um Dockerfile e, em seguida, usa o Docker Compose para orquestrar essa imagem com outras (como bancos de dados, caches, etc.).

  2. Ambientes Diferentes: Enquanto o Dockerfile foca em garantir que a imagem é consistente e inclui todas as dependências, o Docker Compose permite configurar como essas imagens serão conectadas e escaladas em diferentes ambientes (desenvolvimento, teste, produção).

Conclusão

  • Use Dockerfile para definir como sua aplicação será empacotada em uma imagem Docker.

  • Use Docker Compose para orquestrar e gerenciar a execução de múltiplos containers que compõem uma aplicação.

Eles são complementares e muitas vezes usados juntos para criar e gerenciar aplicações Docker de forma eficaz.

PreviousDocker ComposeNextdocker compose

Last updated 9 months ago