Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Docker e Docker-compose: Simplificando a virtualização de ambientes!

close up photo of programming of codes

Olá leitores, hoje vamos descomplicar o Docker e Docker-compose! Antes de mergulharmos nas maravilhas dessas ferramentas, vamos garantir que você tenha tudo configurado corretamente em seu sistema operacional. Vamos abordar a instalação no Windows, macOS e Linux, de maneira prática e descontraída. Preparados? Então, vamos lá!

O que é Docker?

Antes de mergulharmos nas práticas, vamos entender o básico. O Docker é uma plataforma de virtualização de ambientes que permite empacotar aplicativos com suas dependências em um contêiner. Dessa forma, criamos um ambiente isolado, independente do sistema operacional hospedeiro, para garantir a consistência e a portabilidade do nosso aplicativo.

Por que eu devo aprender Docker?

Docker se tornou uma ferramenta essencial no mundo da computação moderna e é amplamente adotado por muitas empresas e desenvolvedores. Existem várias razões pelas quais aprender Docker é valioso:

  1. Facilidade de migração: Uma das principais vantagens do Docker é a capacidade de empacotar uma aplicação e suas dependências em um contêiner isolado. Isso permite que o contêiner seja executado em qualquer ambiente com Docker, independentemente do sistema operacional ou configurações específicas desse ambiente. Com o Docker, você pode migrar facilmente suas aplicações de um servidor para outro, seja localmente, em um data center ou em nuvem, mantendo a consistência e garantindo que sua aplicação funcione de forma confiável.
  2. Portabilidade: O Docker oferece portabilidade e consistência no desenvolvimento e implantação de aplicações. Com o Docker, você pode criar imagens de contêiner que contêm todas as dependências necessárias para executar sua aplicação, desde as bibliotecas até as configurações do ambiente. Essas imagens são independentes do sistema operacional e do ambiente subjacente, o que torna mais fácil compartilhar e implantar suas aplicações em diferentes cenários.
  3. Escalabilidade e autoescalamento: O Docker é altamente adequado para ambientes de computação em nuvem e infraestrutura moderna, como sistemas de autoescalamento. Com o Docker, você pode criar e implantar facilmente contêineres em clusters e aproveitar os recursos de dimensionamento automático oferecidos pelas plataformas de nuvem, como Google Cloud Run ou Amazon Elastic Container Service (ECS). Isso permite que suas aplicações sejam dimensionadas dinamicamente com base na demanda de tráfego, garantindo que você possa lidar com cargas de trabalho em constante mudança de maneira eficiente.
  4. Relevância no mercado: O Docker se tornou uma tecnologia extremamente popular e amplamente adotada na indústria. Muitas empresas estão adotando o Docker como parte de suas pilhas tecnológicas e procuram profissionais com conhecimento e experiência em Docker. Aprender Docker pode abrir portas para oportunidades de carreira e aumentar suas perspectivas profissionais.

Em resumo, aprender Docker oferece uma série de benefícios, incluindo a facilidade de migração para diferentes ambientes, a portabilidade de aplicações e a capacidade de aproveitar a escalabilidade e o autoescalamento em ambientes de nuvem. É uma ferramenta essencial e altamente relevante no mercado atualmente.

Instalando o Docker no Windows:

  1. Acesse o site oficial do Docker em https://www.docker.com/products/docker-desktop e faça o download do “Docker Desktop for Windows”.
  2. Execute o instalador e siga as instruções do assistente de instalação.
  3. Após a instalação, abra o “Docker Desktop” e aguarde a inicialização do serviço.
  4. Uma vez iniciado, você estará pronto para utilizar o Docker no Windows.

Instalando o Docker no macOS:

  1. Acesse o site oficial do Docker em https://www.docker.com/products/docker-desktop e faça o download do “Docker Desktop for Mac”.
  2. Execute o instalador (.dmg) e arraste o ícone do Docker para a pasta “Applications” para instalá-lo.
  3. Abra o “Docker Desktop” a partir da pasta “Applications” e aguarde a inicialização do serviço.
  4. Assim que o serviço estiver em execução, o Docker estará pronto para uso no macOS.

Instalando o Docker no Linux:

  1. O Docker possui diferentes pacotes para distribuições Linux específicas. Verifique a documentação oficial do Docker em https://docs.docker.com/engine/install/ e selecione a distribuição Linux que você está usando.
  2. Siga as instruções fornecidas na documentação para a sua distribuição específica e instale o Docker.
  3. Após a instalação, verifique se o serviço do Docker está em execução usando o comando sudo systemctl status docker. Caso não esteja em execução, inicie-o com sudo systemctl start docker.
  4. Agora você tem o Docker instalado e pronto para uso no seu sistema Linux.

Encontrando imagens no Docker Hub:

Para iniciar nosso aprendizado, vamos ao Docker Hub, o repositório de imagens do Docker. É como um paraíso para contêineres prontos para uso. Lá, você encontrará imagens oficiais de sistemas operacionais, bancos de dados, servidores web e muito mais. Vamos explorar esse supermercado de contêineres!

Antes de começarmos a utilizar as imagens, vamos aprender como baixá-las do Docker Hub. Utilizamos o comando docker pull seguido do nome da imagem que desejamos. Por exemplo:

docker pull nome_da_imagem

O Docker irá buscar a imagem no Docker Hub e fazer o download para o seu sistema. É como ir ao supermercado e pegar o que precisamos!

Listando as imagens disponíveis:

Agora que sabemos como baixar imagens, podemos listar as que estão disponíveis em nosso sistema usando o comando docker images. Ele mostrará todas as imagens que foram baixadas e estão armazenadas localmente. É uma forma de verificar as opções que temos para criar nossos contêineres.

docker images

Removendo uma imagem

Ao utilizar o Docker, pode ser necessário remover imagens que não são mais necessárias ou que não estão sendo utilizadas. O comando “docker rmi” (ou “docker image rm”) permite remover imagens do seu sistema. Vejamos como utilizá-lo:

  • Removendo uma única imagem: Para remover uma única imagem, você precisa especificar o seu nome ou ID. Utilize o seguinte comando:
docker rmi nome_da_imagem

ou

docker image rm nome_da_imagem

Por exemplo, para remover a imagem chamada “meu-app:1.0”, você pode executar:

docker rmi meu-app:1.0
  • Removendo múltiplas imagens: Caso você queira remover várias imagens de uma só vez, basta especificar os nomes ou IDs das imagens separados por espaço. Por exemplo:
docker rmi nome_da_imagem1 nome_da_imagem2 nome_da_imagem3

ou

docker image rm nome_da_imagem1 nome_da_imagem2 nome_da_imagem3

Tenha cuidado ao remover imagens, pois essa ação é irreversível e as imagens não poderão mais ser recuperadas. Certifique-se de que você realmente deseja remover as imagens antes de executar o comando.

Além disso, se a imagem que você está tentando remover estiver em uso por um contêiner em execução, você precisará parar e remover o contêiner antes de poder remover a imagem.

O comando “docker rmi” é uma maneira eficiente de liberar espaço em disco e manter apenas as imagens necessárias em seu sistema.

Executando um contêiner:

Vamos colocar nosso conhecimento em prática executando um contêiner. Utilizamos o comando docker run seguido do nome da imagem. Por exemplo:

docker run -d --restart always --name meu-mysql -p 3306:3306 -v /var/lib/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=minha-senha mysql:latest

Nesse comando, estamos executando um contêiner em segundo plano (-d), definindo o nome do contêiner como “meu-mysql” (--name), mapeando a porta 3306 do contêiner para a porta 3306 do host (-p 3306:3306) e definindo a senha do root do MySQL como “minha-senha” (-e MYSQL_ROOT_PASSWORD).

O mapeamento de volume é utilizado para persistir dados gerados ou utilizados pelo contêiner, mesmo que ele seja reiniciado ou substituído. Podemos utilizar a opção -v para vincular um diretório no host a um diretório no contêiner.

O Docker irá criar e executar um contêiner com base na imagem especificada. É como se estivéssemos iniciando uma nova instância do sistema contido na imagem.

Listando contêineres

Quando estamos trabalhando com contêineres Docker, é útil ter uma visão geral dos contêineres em execução no nosso ambiente. Para isso, utilizamos o comando “docker ps”. O “docker ps” é usado para listar os contêineres em execução no momento. Vejamos como usá-lo:

Listando todos os contêineres em execução:

Para listar todos os contêineres em execução, basta executar o seguinte comando:

docker ps

Esse comando exibirá uma tabela com informações sobre cada contêiner em execução, incluindo o ID do contêiner, a imagem utilizada, o status, a porta mapeada, entre outros detalhes relevantes.

Listando todos os contêineres, incluindo os parados:

Se você quiser ver todos os contêineres, independentemente de estarem em execução ou parados, utilize a flag “-a” ou “–all” junto com o comando “docker ps”:

docker ps -a

Iniciando, reiniciando, parando e removendo um contêiner:

Uma vez que você tenha um contêiner em execução, é importante saber como controlar o seu estado. O Docker fornece comandos simples para iniciar, reiniciar e parar contêineres. Aqui estão os comandos básicos:

  • Iniciando um contêiner: Para iniciar um contêiner que esteja parado, utilize o comando docker start seguido pelo nome ou ID do contêiner. Por exemplo:
docker start meu-container
  • Reiniciando um contêiner: Se você precisa reiniciar um contêiner em execução, utilize o comando docker restart seguido pelo nome ou ID do contêiner. Isso irá parar e iniciar novamente o contêiner. Por exemplo:
docker restart meu-container
  • Parando um contêiner: Para parar um contêiner em execução, utilize o comando docker stop seguido pelo nome ou ID do contêiner. Isso irá interromper o processo do contêiner. Por exemplo:
docker stop meu-container
  • Apagando um contêiner: Se você precisar apagar um contêiner em execução, certifique-se de para-lo primeiro com a etapa do docker stop, e depois utilize o comando docker rm seguido pelo nome ou ID do contêiner. Por exemplo:
docker rm meu-container

Monitorando o uso de recursos dos contêineres

Ao trabalhar com contêineres Docker, é importante monitorar o uso de recursos, como CPU, memória e tráfego de rede, para entender o desempenho e a eficiência dos seus contêineres. O Docker fornece o comando “docker stats” para visualizar em tempo real as estatísticas de uso de recursos dos contêineres em execução. Vejamos como usá-lo:

  • Visualizando estatísticas de todos os contêineres em execução: Para ver as estatísticas de todos os contêineres em execução, basta executar o seguinte comando:
docker stats

Esse comando exibirá uma tabela contínua com informações sobre cada contêiner, incluindo o uso de CPU, memória, uso de rede e outros detalhes relacionados aos recursos. As estatísticas são atualizadas em tempo real.

  • Visualizando estatísticas de contêineres específicos: Se você quiser visualizar as estatísticas de contêineres específicos, você pode fornecer os nomes ou IDs dos contêineres como argumentos para o comando “docker stats”. Por exemplo:
docker stats container1 container2

Isso exibirá as estatísticas apenas para os contêineres especificados.

Executando comandos dentro de um contêiner:

Às vezes, precisamos executar comandos específicos dentro de um contêiner em execução. Utilizamos o comando docker exec seguido das opções e do nome do contêiner. Por exemplo:

docker exec -ti nome_do_contêiner comando

Por exemplo, vamos aprender como executar um comando para acessar a shell (bash) dentro do contêiner “meu-mysql”. Isso nos permitirá interagir diretamente com o contêiner e realizar tarefas específicas.

Para isso, utilizamos o comando docker exec -ti meu-mysql bash. Vamos analisar o que cada parte significa:

docker exec -ti meu-mysql bash
  • docker exec: comando utilizado para executar comandos em um contêiner em execução.
  • -ti: opções que permitem interação (t para associar o terminal) e tty (para utilizar o terminal).
  • meu-mysql: nome do contêiner que queremos acessar.
  • bash: comando que será executado dentro do contêiner, nesse caso, estamos acessando a bash (shell) do contêiner.

Ao executar esse comando, seremos levados para a shell (bash) do contêiner “meu-mysql”, onde podemos interagir com ele como se estivéssemos dentro de um sistema independente. Isso é especialmente útil para realizar tarefas de administração, configuração e depuração dentro do contêiner.

Agora dentro do container você pode executar comandos SQL, como:

mysql -u root -p

Digite a senha que você definiu anteriormente (“minha-senha”) e voilà, você está dentro do MySQL dentro do contêiner!

Dockerfile – Personalizando suas Imagens:

Antes de explorarmos o Docker-compose, vamos entender o papel do Dockerfile na construção de imagens personalizadas. O Dockerfile é um arquivo de configuração que nos permite definir e criar nossas próprias imagens. Vamos analisar um exemplo para entender como funciona:

FROM python:3.10.2-alpine

ARG PORT

WORKDIR '/api'
COPY requirements.txt .

RUN apk update && \
    apk add --no-cache build-base && \
    apk add --no-cache man-pages

RUN pip install --upgrade pip && \
    pip install --trusted-host pypi.python.org -r requirements.txt

COPY . .

EXPOSE ${PORT}

CMD ["python3", "app.py"]

Neste exemplo, começamos com a instrução FROM, que define a imagem base que utilizaremos como ponto de partida. Aqui, estamos utilizando a imagem oficial do Python versão 3.10.2-alpine.

Em seguida, utilizamos a instrução ARG para definir uma variável de argumento chamada PORT. Isso permite que essa variável seja passada durante a construção da imagem.

As instruções WORKDIR e COPY definem o diretório de trabalho e copiam os arquivos do diretório local para o diretório de trabalho na imagem, respectivamente. Neste exemplo, copiamos o arquivo requirements.txt para o diretório /api.

As instruções RUN são utilizadas para executar comandos durante a construção da imagem. Aqui, atualizamos os pacotes, instalamos dependências e bibliotecas Python especificadas no arquivo requirements.txt.

Por fim, as instruções EXPOSE e CMD definem a porta em que o contêiner irá escutar e o comando padrão a ser executado quando o contêiner for iniciado.

Para construir a imagem usando esse Dockerfile, utilizamos o comando “docker build” seguido do caminho para o diretório contendo o Dockerfile. Por exemplo:

docker build -t meu-app:1.0 .

Nesse comando, “-t meu-app:1.0” define o nome e a tag da imagem que estamos criando. O “.” indica que o Dockerfile está localizado no diretório atual.

O Docker irá então executar as instruções definidas no Dockerfile e criar a imagem resultante com o nome “meu-app” e a tag “1.0”.

Agora que desvendamos os segredos do Dockerfile, estamos prontos para personalizar nossas próprias imagens e criar ambientes personalizados.

Docker-compose e o arquivo docker-compose.yml

O Docker-compose utiliza um arquivo chamado docker-compose.yml para definir os serviços e as configurações dos contêineres. É como um roteiro que o Docker-compose seguirá para criar e gerenciar os contêineres.

Dentro do arquivo docker-compose.yml, definimos os serviços, suas imagens, portas mapeadas, variáveis de ambiente, volumes, entre outras configurações. Podemos até mesmo definir redes virtuais para conectar os contêineres.

version: '3'
services:
  web:
    build: .
    ports:
      - 5000:5000
    depends_on:
      - db
  db:
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=minha-senha

No exemplo acima, temos dois serviços: “web” e “db”. Vamos entender o que cada parte significa:

  • A linha version: '3' indica a versão do formato do arquivo docker-compose.yml que estamos utilizando.
  • A seção “services” é onde definimos os serviços que serão criados a partir do arquivo.
  • O serviço “web” é definido da seguinte forma:
    • build: . indica que o serviço será construído a partir do Dockerfile localizado no diretório atual.
    • ports: - 5000:5000 mapeia a porta 5000 do contêiner para a porta 5000 do host, permitindo acessar a aplicação web na máquina local.
    • depends_on: - db indica que o serviço “web” depende do serviço “db” e, portanto, o serviço “db” será iniciado antes do serviço “web”.
  • O serviço “db” é definido assim:
    • image: mysql:latest indica que o serviço será baseado na imagem “mysql:latest” disponível no Docker Hub. Essa imagem contém o banco de dados MySQL.
    • restart: always garante que o serviço “db” será reiniciado automaticamente caso ocorra algum erro ou interrupção.
    • environment: - MYSQL_ROOT_PASSWORD=minha-senha define a variável de ambiente “MYSQL_ROOT_PASSWORD” com o valor “minha-senha”, que será a senha do usuário root do MySQL.

Ao utilizar o Docker-compose, podemos definir a estrutura e as dependências dos nossos serviços em um único arquivo, simplificando a configuração e o gerenciamento de ambientes complexos.

Combinando o Docker e o Docker-compose, temos o poder de construir, personalizar e orquestrar ambientes completos de desenvolvimento com facilidade e eficiência.

Espero que essa conversa descontraída tenha despertado sua curiosidade e interesse pelo Docker e Docker-compose. No próximo artigo, vamos explorar ainda mais essas ferramentas incríveis. Até lá, divirta-se experimentando e criando ambientes personalizados com o Docker e orquestrando serviços com o Docker-compose!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima