2
respostas

Docker: gostinho do seu funcionamento

Olá estudantes.
Vamos aprender um pouquinho sobre docker e com um pequeno projeto.
Então mãos a obra!
Vamos lá.
Optei por criar as maquinas virtuais no virtualbox.
Isso pode ser um pouco custoso se não tiver uma maquina potente.
Mas para o objetivo proposto vai servir bem.
Sinta-se a vontade para utilizar o serviço EC2 da AWS mas cuidado com as cobranças e não ultrapassar o limite free...
Preparando as máquinas virtuais
Primeiro, crie 3 máquinas virtuais no VirtualBox.
Aqui está uma sugestão de configuração para cada uma:

  • Servidor de Arquivos: Será usado para armazenar arquivos que podem ser acessados por outros microserviços.
  • Servidor Web: Este servidor hospedará um servidor web (como o Apache ou Nginx).
  • Servidor de Dados: Pode ser usado para um banco de dados como MySQL, PostgreSQL ou MongoDB.

Cada máquina vai ter o Ubuntu instalado.
Vamos usar a versão 22.04 LTS, que são estáveis e bem suportadas.
Instalando o Docker no Ubuntu
Em cada uma das máquinas virtuais (servidor de arquivos, web e dados), instale o Docker.
Aqui está o procedimento de instalação do Docker no Ubuntu.
Atualize o sistema:

sudo apt update && sudo apt upgrade -y

Instale pacotes necessários:

sudo apt install apt-transport-https ca-certificates curl software-properties-common -y

Adicione a chave GPG oficial do Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Adicione o repositório do Docker:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Atualize novamente os pacotes:

sudo apt update

Instale o Docker:

sudo apt install docker-ce -y

Verifique se o Docker foi instalado corretamente:

sudo systemctl start docker
sudo systemctl enable docker
docker --version

Agora, o Docker está instalado e funcionando em todas as suas máquinas virtuais.
Instalando o Docker Compose
O Docker Compose é uma ferramenta para definir e rodar aplicativos multi-containers.
Para usar o Docker Compose, siga os seguintes passos:
Baixe o Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Dê permissão de execução:

sudo chmod +x /usr/local/bin/docker-compose

Verifique a instalação:

docker-compose --version

Criando a estrutura de microserviços
Agora que você tem o Docker e o Docker Compose instalados, vamos criar a estrutura de microserviços.
Vamos usar um Docker Compose para orquestrar os contêineres entre os 3 servidores.
Primeiro, crie um diretório para o seu projeto em cada servidor.
Vamos supor que você esteja na máquina do Servidor Web.
Crie a estrutura do projeto e o arquivo docker-compose.yml
No servidor de arquivos (Servidor 1)
Crie um diretório para o projeto e o arquivo Docker Compose:

mkdir ~/servidor-arquivos
cd ~/servidor-arquivos
nano docker-compose.yml

Adicione o seguinte conteúdo ao arquivo docker-compose.yml para criar um contêiner de servidor de arquivos com o Samba (servidor de arquivos):

version: '3'

services:
  samba:
    image: dperson/samba
    container_name: servidor_arquivos
    environment:
      - USER=usuario
      - PASS=senha
      - SHARENAME=compartilhamento
    ports:
      - "139:139"
      - "445:445"
    volumes:
      - ./dados:/mnt/data
    restart: always

No servidor web (Servidor 2)
Crie um diretório para o servidor web e o arquivo Docker Compose:

mkdir ~/servidor-web
cd ~/servidor-web
nano docker-compose.yml

Adicione o conteúdo abaixo para criar um servidor web com Nginx:

version: '3'

services:
  nginx:
    image: nginx:latest
    container_name: servidor_web
    volumes:
      - ./site:/usr/share/nginx/html
    ports:
      - "80:80"
    depends_on:
      - servidor_arquivos
    restart: always

Aqui, o Nginx vai servir o conteúdo de um diretório site, mas você pode configurar para que ele também consuma dados do servidor de arquivos se necessário.
No servidor de dados (Servidor 3)
Crie um diretório para o servidor de dados e o arquivo Docker Compose:

mkdir ~/servidor-dados
cd ~/servidor-dados
nano docker-compose.yml

Adicione o seguinte conteúdo para criar um banco de dados MySQL:

version: '3'

services:
  db:
    image: mysql:5.7
    container_name: servidor_dados
    environment:
      MYSQL_ROOT_PASSWORD: senha
      MYSQL_DATABASE: banco_de_dados
    volumes:
      - ./data:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: always

continua...

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
2 respostas

Rodando os contêineres
Agora, com os arquivos docker-compose.yml configurados, você pode iniciar os contêineres em cada servidor:
No servidor de arquivos, rode:

docker-compose up -d

No servidor web, rode:

docker-compose up -d

No servidor de dados, rode:

docker-compose up -d

Interagindo entre os servidores
Com os servidores rodando, você pode fazer o seguinte:

  • O servidor web pode acessar o servidor de arquivos via rede (por exemplo, compartilhamento de arquivos via SMB).
  • O servidor web pode interagir com o servidor de dados via conexões MySQL.
  • A comunicação entre eles pode ser configurada através de redes internas do Docker ou ajustando as configurações de rede dos contêineres.

Passos para Configurar Redes Internas no Docker
Vamos modificar o arquivo docker-compose.yml de cada um dos seus servidores para usar redes internas, assim os contêineres poderão se comunicar.
O Docker cria uma rede padrão (bridge) automaticamente para contêineres, mas é uma boa prática criar redes dedicadas para cada conjunto de serviços que você deseja isolar.
No seu caso, podemos criar uma rede chamada microservices-network para que os contêineres de todos os três servidores possam se comunicar.
Aqui está um exemplo de como configurar a rede no docker-compose-yml:
No servidor de arquivos, vamos adicionar uma rede interna chamada microservices-network:

version: '3'

services:
  samba:
    image: dperson/samba
    container_name: servidor_arquivos
    environment:
      - USER=usuario
      - PASS=senha
      - SHARENAME=compartilhamento
    ports:
      - "139:139"
      - "445:445"
    volumes:
      - ./dados:/mnt/data
    networks:
      - microservices-network
    restart: always

networks:
  microservices-network:
    driver: bridge

Agora, vamos modificar o servidor web para que ele se conecte à mesma rede microservices-network:

version: '3'

services:
  nginx:
    image: nginx:latest
    container_name: servidor_web
    volumes:
      - ./site:/usr/share/nginx/html
    ports:
      - "80:80"
    depends_on:
      - servidor_arquivos
    networks:
      - microservices-network
    restart: always

networks:
  microservices-network:
    driver: bridge

Por fim, o servidor de dados também precisa se conectar à mesma rede:

version: '3'

services:
  db:
    image: mysql:5.7
    container_name: servidor_dados
    environment:
      MYSQL_ROOT_PASSWORD: senha
      MYSQL_DATABASE: banco_de_dados
    volumes:
      - ./data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - microservices-network
    restart: always

networks:
  microservices-network:
    driver: bridge

Após adicionar a configuração da rede interna nos três arquivos docker-compose.yml, você deve reiniciar os contêineres para aplicar as mudanças.
Para isso, use o comando:

docker-compose down
docker-compose up -d

O comando docker-compose down irá parar os contêineres, e o comando docker-compose up -d irá reiniciá-los com as novas configurações.
Agora que todos os contêineres estão na mesma rede interna, eles podem se comunicar entre si usando os nomes dos serviços definidos no docker-compose.yml.
Por exemplo:

  • O servidor web pode acessar o servidor de arquivos usando o nome servidor-arquivos (nome do serviço definido no docker-compose.yml).
  • O servidor web pode acessar o servidor de dados usando o nome servidor de dados.
    Vamos verificar se a comunicação está funcionando:
    Conectando no contêiner do Servidor Web:
docker exec -it servidor_web bash

Testando a conexão com o Servidor de Arquivos:
Dentro do contêiner do servidor web, execute o seguinte comando para testar a comunicação com o servidor de arquivos :

ping servidor_arquivos

Isso deve retornar um resultado indicando que o servidor web consegue se comunicar com o servidor de arquivos.
Testando a Conexão com o Banco de Dados:
Da mesma forma, você pode testar a comunicação entre o servidor web e o servidor de dados (MySQL) executando:

nc -zv servidor_dados 3306

Se a conexão for bem-sucedida, você verá uma mensagem indicando que a porta 3306 (MySQL) está aberta.
Você também pode personalizar a rede, ajustando as opções da rede interna.
Por exemplo, se você quiser criar uma rede com isolamento entre os serviços, pode usar algo assim:

networks:
  microservices-network:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: br-microservices
    ipam:
      config:
        - subnet: "172.28.0.0/16"

Neste exemplo, criamos uma rede com uma sub-rede personalizada (172.28.0.0/16).
Esse é apenas o pontapé inicial e precisamos analisar bem cada etapa para definir os proximos passos a seguir.

continua...

E só lembrando que podemos rodar os tres servidores acima dentro de uma maquina virtual ubuntu na virtualbox utilizando docker.
Apenas utilizei uma abordagem diferente.
Principios:
Ter um Ubuntu rodando dentro do VirtualBox (como sua máquina virtual).
Instalar o Docker nessa VM Ubuntu.
Criar e executar três containers Docker, cada um com um servidor diferente (por exemplo, Nginx, Apache, Node.js, etc.).
Requisitos básicos:
Recursos da VM:
RAM: idealmente 4 GB ou mais.
CPU: pelo menos 2 núcleos.
Espaço em disco: depende dos servidores, mas recomenda-se pelo menos 10–20 GB livres.
Sistema operacional da VM: Ubuntu (por exemplo, 20.04 ou 22.04).
Docker instalado: pode instalar com:

sudo apt update
sudo apt install docker.io
sudo systemctl enable --now docker

(Opcional) Docker Compose, se quiser orquestrar os três containers com um docker-compose.yml.
Exemplo prático:
Você pode rodar, por exemplo:

  • Container 1: Nginx na porta 8081
  • Container 2: Apache na porta 8082
  • Container 3: Node.js app na porta 8083
docker run -d --name nginx -p 8081:80 nginx
docker run -d --name apache -p 8082:80 httpd
docker run -d --name node -p 8083:3000 node-app-image

Se quiser acessar esses servidores de fora da VM, você pode configurar o NAT com Port Forwarding ou usar modo Bridge no VirtualBox, assim sua VM recebe um IP acessível na rede.
Para finalizar seguem alguns comandos docker:
Comandos para imagens:

  • docker build . -t nome:tag
  • docker pull nome:tag
  • docker push nome:tag
  • docker images
  • docker rmi nome:tag

Comandos para containers:

  • docker run imagem
  • docker run -d imagem
  • docker run -it imagem
  • docker start nome/id
  • docker stop nome/id
  • docker restart nome/id
  • docker rm nome/id
  • docker exec -it nome bash
  • docker logs nome

Status e inspeção:

  • docker ps
  • docker ps -a
  • docker inspect nome/id
  • docker stats

Outros úteis:

  • docker network ls
  • docker volume ls
  • docker-compose up
  • docker-compose down
  • docker system prune
    Testa ai e veja para que servem...
    Este é apenas o inicio mas já tem muito conteudo para digerir.
    Qualquer duvida comente.
    Bons estudos e muito sucesso a todos.
    Até...