DEV Community

Alex Reis
Alex Reis

Posted on

1 1 1 1 1

Docker para iniciantes

Este guia na verdade são minhas anotações durante meus estudos sobre Docker. Utilizei da documentação oficial para por em prática, todo o passo a passo com exemplos pode ser encontrado em Docker Workshop (inglês).

O que é Container

Um Container é um agrupamento de uma aplicação com suas dependências, que compartilham o kernel do sistema operacional da máquina (física ou virtual) onde está rodando.

Na maioria dos casos, a imagem de um container é bastante enxuta, havendo somente o necessário para o funcionamento da aplicação, que, quando em execução, possui um pequeno overhead se comparada à mesma aplicação rodando nativamente no sistema operacional, grande parte disso por conta do compartilhamento dos recursos com a máquina host.

Containers são similares à máquinas virtuias, porém são mais leves e mais integrados aos sistema operacional. Quando utilizamos uma máquina virtual nós emulamos um novo sistema operacional dentro do sistemal operacional do host. Já o container emula somente as aplicações e suas depedências.

Um container criado no seu ambiente, irá rodar em qualquer outro (Linux, MacOS, Windows), que tenha o Docker instalado.

O que é o Docker

Emm 2013, a empresa dotCloud especializada em PaaS (Plataform-as-a-Service) decidiu tornar open source o core da sua plataforma, assim surgiu o Docker. Com o rápido crescimento do projeto, a dotCloud decidiu se chamar Docker e a versão 1.0 foi lançada após 15 meses da sua versão 0.1.

Assim Docker é uma tecnologia de conteinerização, a principal ferramenta para implantar aplicativos dentro de containers virtuais.

Copy-On-Writer

Significa que um novo recuros, seja um bloco no disco ou uma área em memória, só é alocado quando for modificado.

O docker usa um esquema de camadas (ou layers) e para monatr essas cmaadas são usadas técnicas de Copy-On-Writer. Um container é basicamente uma pilha de N camadas read-only e uma, superior, read-write.

O que é Imagem de Container

Um container é uma imagem de container em execução. É uma imagem que foi criada utilizando um Dockerfile, por exemplo, com as instruções para configurar sua aplicação no container. Quando ela é posta em execução temos então um container.

Funciona em camadas, exemplo:

Imagem
(read-write)
copy app
install nginx
debain

Dados importantes não podem estar dentro do container.

Alteração em coisas existentes do container, na verdade são cópias na camada read-write.

O que são namespaces e cgroup

Namespace servem para limitar ou isolar recursos de uma máquina. Cgroup servem para isolar cpu e memória. A tecnologia Docker os utilliza para segregar processos, assim eles podem ser executados de maneira independente.

Instalando Docker no Linux

Instalar:

$ sudo apt install docker.io
Enter fullscreen mode Exit fullscreen mode

Criar um grupo docker e adicionar o seu usuário para usar comandos Docker sem sudo:

$ sudo usermod -aG docker seu_usuario
Enter fullscreen mode Exit fullscreen mode

Primeiros passos

Rodar um container:

$ docker run -d -p 80:80 docker/getting-started
Enter fullscreen mode Exit fullscreen mode
  • docker -> comando para interagir com o docker
  • run -> comando para executar uma imagem de container
  • -d -> (daemon) container executa em background
  • -p 80:80 -> atrelar a porta 80 do container a porta 80 do host
  • docker/getting-started -> nome completo da imagem > Neste exemplo estamos carregando a imagem de getting started do docker

Ver containers em execução:

$ docker container ls
Enter fullscreen mode Exit fullscreen mode

Ver todos os containers já criados:

$ docker container ls -a
Enter fullscreen mode Exit fullscreen mode

Ver os logs do container:

$ docker logs -f <id do container>
Enter fullscreen mode Exit fullscreen mode

Remover container:

$ docker rm <id do container>
Enter fullscreen mode Exit fullscreen mode

Parar executação do container:

$ docker stop <id do container>
Enter fullscreen mode Exit fullscreen mode

Iniciar container:

$ docker start <id do container>
Enter fullscreen mode Exit fullscreen mode

Executar um comando dentro do container:

$ docker container exec -it <id do container> bash
Enter fullscreen mode Exit fullscreen mode
  • docker container exec -> Executa algo em um container
  • -it -> indica que quer um terminal
  • bash( ou sh) -> o que será executado (precisa existir dentro do container)

CRTL+D (ou CRTL+C) para sair do container

Imagem de container

Dockerfile

Arquivo com instruções para o que o container deve fazer. Exemplo de um Dockerfile e suas instruções:

`FROM debian`(em que a imagem será baseada)
`RUN apt-get update && apt-get install ...` (execute alguma coisa na criação da imagem)
`WORKDIR /app` (diretório padrão ao iniciar o container)
`COPY /app/src /app` (copia aplicacao da sua máquina para o container)
`EXPOSED 80` (se é webserver vai ter a porta http exposta)
`CMD projeto --start` (comando para executar algo no container)
Enter fullscreen mode Exit fullscreen mode

Rodando um app

Criado o arquivo Dockerfile é preciso fazer o build:

$ docker build -t <nome-do-app> <caminho/do/diretorio/do/Dockerfile>
Enter fullscreen mode Exit fullscreen mode

Caso o Dockerfile esteja no mesmo diretorio do build apenas usa-se um ponto .

Mostrar as imagens:

$ docker images
Enter fullscreen mode Exit fullscreen mode

Ver detalhas da imagem (a versão padrão é latest):

$ docker image inspect nome-do-container:versao
Enter fullscreen mode Exit fullscreen mode

Dados escritos dentro do container são perdidos quando o container é apagado.

Editar a versão (tag) de um container:

$ docker image tag nome-container:tag nome-container:nova-tag
Enter fullscreen mode Exit fullscreen mode

Atualizar um app

Fazer o build da versão atualizada da imagem:

$ docker build -t nome-do-container caminho/do/diretorio/do/Dockerfile
Enter fullscreen mode Exit fullscreen mode

Pare e remova o container antigo, pode fazer isso rapidamente com:

$ docker rm --force id-do-container
Enter fullscreen mode Exit fullscreen mode

Inicie o novo container:

$ docker run -dp portaDocker:portaHost nome-do-container
Enter fullscreen mode Exit fullscreen mode

Compartilhando imagem no Docker Hub

Atualize o nome da imagem adicionando seu usuario a ele:

docker image tag nome-da-imagem:versao seu-usuario/nome-da-imagem:versao
Enter fullscreen mode Exit fullscreen mode

Crie conta no Docker Hub e faça login no terminal:

$ docker login -u seu-usuario
Enter fullscreen mode Exit fullscreen mode

Fazer o push (enviar) da imagem

$ docker push seu-usuario/nome-da-imagem:versao
Enter fullscreen mode Exit fullscreen mode

Qualquer pessoa poderá baixar a imagem

$ docker pull nome-da-imagem:tag
Enter fullscreen mode Exit fullscreen mode

Volumes

Volumes fornecem a habilidade para conectar caminhos especificos do filesystem do container com o host. Mudanças feitas em um diretório do container vão ser vistas também no diretório do host.

O Docker gerencia totalmente o volume, incluindo a localização do armazenamento no disco. Você só precisa lembrar do nome do volume.

Criando um volume

Criar um volume:

$ docker volume create nome-volume
Enter fullscreen mode Exit fullscreen mode

Pare e remova o container que está executando sem o volume:

$ docker rm -f id-container
Enter fullscreen mode Exit fullscreen mode

Iniciar o container:

$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=nome-volume,target=/etc/todos nome-do-container
Enter fullscreen mode Exit fullscreen mode
  • --mount > indica que é o tipo de volume
  • type=volume > para indicar que é um volume
  • src > nome-do-volume
  • target > onde o volume será montado

Para inspecionar o volume:

$ docker inspect volume nome-volume
Enter fullscreen mode Exit fullscreen mode
  • No output, Mountpoint é a localização dos dados no disco

Container Network

Containers, por padrão, executam isolados e não sabem nada sobre outros processos ou containers na mesma máquina. Colocando containers na mesma rede (network) eles podem conversar um com o outro.

Há duas formas de por um container em uma network:

  • Atribuir a network quando o container iniciar
  • Conectar um container já em execução em uma network

A seguir vamos criar uma network e conectar um container MySQL a ela.

Iniciar um container MySQL

Criar uma network:

$ docker network create nome-da-network
Enter fullscreen mode Exit fullscreen mode

Iniciar um container MySQL e conectar à network:

docker run -d --network nome-da-network --network-alias mysql -v mysql-todo-db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=todos mysql:8.0
Enter fullscreen mode Exit fullscreen mode

Verificar se o banco de dados está rodando:

$ docker exec -it <mysql-container-id> mysql -u root -p
Enter fullscreen mode Exit fullscreen mode

A senha para entrar é secret.

Para ver o banco de dados:

mysql> SHOW DATABASES;
Enter fullscreen mode Exit fullscreen mode

Sair do MySQL mysql> exit.

Conectar ao MySQL

Especifique as variavéis de ambiente, bem como conecte o container network da aplicação, exemplo:

$ docker run -dp 127.0.0.1:3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:18-alpine \
  sh -c "yarn install && yarn run dev"
Enter fullscreen mode Exit fullscreen mode

Assim neste exemplo temos dois containers dentro de uma mesma rede e contectados entre si.

Referências

Docker Workshop

Livro: Descomplicando Docker

Image of Datadog

Create and maintain end-to-end frontend tests

Learn best practices on creating frontend tests, testing on-premise apps, integrating tests into your CI/CD pipeline, and using Datadog’s testing tunnel.

Download The Guide

Top comments (0)

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

👋 Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay