
Docker
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.
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.
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.