Docker

Docker

2020, Jul 02    

Saber linguagens de programação e paradigmas é muito importante, mas no dia a dia muitas vezes temos que usar alguns serviços de infra que não damos muita importância em aprender. Então vamos começar falando pelo Docker. Para instalar o docker basta seguir este link.

Neste post vamos falar sobre:

  • Docker x VMs
  • Dockerfile
  • Docker Compose
  • Comandos básicos Docker

Docker x VMs

Máquinas virtuais (VMs)

Máquinas virtuais (VMs) são uma abstração de hardware físico que transforma um servidor em muitos servidores. O hypervisor permite que várias VMs sejam executadas em uma única máquina. Cada VM inclui uma cópia completa de um sistema operacional, aplicativo, binários e bibliotecas necessários  ocupando dezenas de GBs.

container-vm

Docker

Os contêineres são uma abstração na camada de aplicativo que agrupa código e dependências juntos. Vários contêineres podem ser executados na mesma máquina e compartilhar o kernel do sistema operacional com outros contêineres, cada um executando como processos isolados Os contêineres ocupam menos espaço que as VMs podem lidar com mais aplicativos e requerem menos VMs e sistemas operacionais.

dockercontainerized

Dockerfile

Um Dockerfile é um documento de texto que contém as instruções  para montar uma imagem.

Exemplo Dockerfile:

FROM ruby:2.7.1-alpine3.10

WORKDIR /app
EXPOSE 80

COPY . /app

RUN apk update && \
    apk add libxslt-dev build-base libxml2-dev curl jq tzdata sqlite-dev yarn && \
    bundle install && \
    yarn install 

O que faz cada instrução do exemplo acima:

  • FROM: imagem a ser utilizada, no exemplo estávamos usando uma imagem de Ubuntu alpine + Ruby 2.7
  • WORKDIR: pasta de trabalho normalmente ao acessar o container
  • EXPOSE: expõe a porta do container
  • COPY: copia o conteúdo da sua máquina e adiciona em uma pasta no container
  • RUN: executa comandos durante o build da imagem por exemplo instala algumas bibliotecas necessárias para o funcionamento do container

Docker Compose

O Docker Compose é uma ferramenta para orquestar contêineres, com ela podemos subir vários containers ao mesmo tempo por exemplo nosso mais um banco de dados. Para utiliza-lo é preciso um arquivo YAML para configurar os serviços do seu aplicativo.

version: "3.6"
services:
  web:
    image: api
    build:
      context: .
      volumes:
      - "/app/.bundle"
      - "/app/vendor"
      - ".:/app"
      - "bundle:/usr/local/bundle"
    container_name: api_app
    ports:
      - 80:3000
    depends_on:
      - mysql
      - redis
    env_file: .env.docker
    environment:
      RAILS_ENV: development
    links:
      - mysql
      - redis

  mysql:
    image: mysql:5.7
    ports:
      - '3306:3306'
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=true
      - MYSQL_USER=root
    container_name: api_mysql

  redis:
     image: redis:alpine
     container_name: api_redis
     ports:
       - 6379:6379
volumes:
  bundle:

Comandos básicos Docker

Criando uma imagem basta utilizar o comando build

docker build .

Podemos adicionar tag na nossa nova imagem usando -t:

docker build -t "minha-image" .
Acessando container

Para executar um comando dentro do container por exemplo executar um bundle install, caso não tenha especificado no Dockerfile usamos run e o comando:

docker run -it minha-imagem comando

Se o container estiver em pé e não queria subir outro container basta usar o comando exec:

docker exec -it minha-imagem comando

Listando imagens

O comando para listar todas as imagens baixadas em seu computador:

docker images

Podemos mesclar os comandos do Docker com do terminal, digamos que queremos localizar uma imagem em específico.

docker imagens | grep minha-imagem

Para verificar quais containers estão rodando no momento em sua máquina use o comando baixo:

docker ps

Na coluna status terão dois valores:

  • Up - funcionando
  • Exit - não funcionado

Apagando imagens

Para apagar uma image basta utilizar o comando rmi:

docker rmi hash-imagem

Apagando várias imagens

docker rmi $(docker images | grep minha-imagem)

Logs

Podemos verificar também os logs de um de nossos containers usando o comando logs:

docker logs minha-imagem

Volumes

O volume é o mecanismo preferido para persistir os dados gerados e usados ​​pelos contêineres do Docker, embora as montagens de ligação dependam da estrutura de diretórios da máquina host, os volumes são completamente gerenciados pelo Docker.

Podemos criar um volume usando o comando create como mostra o exemplo a seguir:

docker volume create <nome/hash>

Para listar todos os volumes basta usar ls:

docker volume ls

Apagando um volume:

docker volume rm <nome/hash>

Caso queria apagar todos os volumes de uma vez utilize o comando prune:

docker volume prune

Networks

Um dos motivos pelos quais os contêineres e serviços do Docker são tão poderosos é que você pode conectá-los ou conectá-los a cargas de trabalho que não são do Docker, para mais informações sobre networks no docker segue o link.

Os comandos para manipular um network são os mesmos mostrados nos volumes:

Criando volume:

docker network create <nome/hash>

Listando volume:

docker network ls

Delete volume:

docker network rm <nome/hash>

Por fim algumas dicas para finalizar esse post. Todos estes comandos podem ser usados com o docker-compose caso esteja usando o compose em seu projeto. Como existem vários comandos do docker e se tiver alguma dúvida em relação de algum deles basta adicionar –help:

docker build --help

ou consultar a documentação oficial do docker. E como uma última dica caso tenha um PC com HD/SSD pequeno sempre fique de olho no volume.

Por enquanto é só isso, nos vemos na próxima.