iniciando rápido com Docker [BR]

iniciando rápido com Docker [BR]

Motivo

Muitas pessoas tem dificuldades para iniciar com docker, mas na verdade se elas tem domínio das ferramentas que já trabalham no seu dia dia, docker vai ser mais um detalhe, bom acho que todos já estão cansados de saber quão bom é trabalhar com docker e quão flexível isso pode se tornar, alem do mais é amplamente utilizado em muitas empresas e acaba se tornando indispensável para o currículo de um desenvolvedor, então deixemos de lado a introdução e vamos direto aos pontos.

Comandos úteis para seu dia dia

Rodando

// quer trazer uma imagem para sua máquina e já sair rodando? esse é o comando
docker run ubuntu

// faz o download de uma imagem mas não excuta
docker pull nome_usuario/nome_image

Containers

// listando todos os containers que estiverem ativos
docker ps

// listando todos os ids dos containers, ativos
docker ps -q

// listando todos os ids dos containers, ativos
docker ps -aq

// iniciando um container
docker start name_container

// para todos os containers ativos de uma só vez
docker stop $(docker ps -aq)

// rodando um container atrelado ao seu terminal
docker run -it name_image

// para parar um container
docker stop (name or id)

// removendo um container de forma forçada
docker rm (id or name) -f

// removendo todos os containers parados
docker container prune

// rodando um container com uma porta e nome e de forma desatrelada ao terminal
docker run -d -p 80:8080 --name server nginx:latest

// parando um container e removendo e o removendo
docker-compose down --rmi all

// acessando seu container
docker exec -it name-container sh

Imagens

//lista todas as imagens
docker image ls

//lista todas as imagens
docker image

// remove todas as imagens
docker rmi $(docker images -q)

// remove uma imagem
docker rmi name_image

// limpando tudo
docker system prune

Network

// Adicionando rede
docker network create --driver bridge local

// removendo todas as redes
docker network prune

Outros

// Copiando excema de uma base mysql
docker exec container_mysql_name /usr/bin/mysqldump -u root --password=root schema > backup.sql

// Rodando um postgresql sem dockerfile
docker run --name postgres11 -e POSTGRES_PASSWORD=docker -p 5432:5432 -d postgres:11

// rodando um mongo sem dockerfile
docker run --name mongo -p 27017:27017 -d -t mongo

// rodando um mysql sem dockerfile
docker run --detach --name=mysql8 -p 3306:3306  --env="MYSQL_ROOT_PASSWORD=docker" mysql:8.0.22

Docker Register

Imagine o cenário, precisamos configurar uma imagem pessoal para subir em um container em determinado servidor, com o doker hub podemos facilmente ter images pessoais privadas(plano não gratuito no docker hub), assim podemos usa-las quando e onde quisermos, grandes datacenter como, gcp, amazon e azure também vão ter seus próprios registers, basta termos nosso register privado lá e conseguiremos ter nossas imagens privadas para subir em nosso servdor remoto.

Binds e mounts/volumes

Muitas vezes removemos os containers após o uso.

É muito comum usar o container e apagá-lo após o uso, dessa forma os dados desses container são perdidos e nesse ponto que os volumes ou mounts permitem salvar dados fora de um container.

Volumes são usados para os dados não serem removidos ao paramos nosso container, trata-se de um mapeamento entre seu host (computador de trabalho) e container, na maioria dos projetos que trabalhamos em ambiente de dev costumamos fazer um apontamento entre nossa maquina e algum container.

docker run -d --name nginx -v ~/ti/testdocker/html:/usr/share/nginx/html -p 8080:80 nginx

No exemplo acima apontamos um volume de nossa maquina local por meio da tag -v para dentro da pasta do nginx, dessa forma se perdemos nossa imagem o conteúdo está salvo em nosso host.

A forma mais atual de se trabalhar com volumes é utilizando mounts, um exemplo de diferença entre volumes e mouts é que volumes criam pastas em nosso host mesmo que essas não existam, mounts não.

docker run -d --name nginx --mount type=bind, source=/Users/andremartds/ti/testdocker/html,target=/usr/share/nginx/html -p 8080:80 nginx

docker run -d --name nginx --mount type=bind, source="$(pwd)",target=/usr/share/nginx/html -p 8080:80 nginx

Caso você utilize $(pwd) isso vai conseguir pegar o diretório absoluto de onde você está no momento.

Volumes

Pode ser que precisemos ter um volume centralizado em nosso host e queremos apontar esses dados para um ou mais containers, nesse caso tudo que for criado em um container será apontado para os outros que compartilham desse type.

requer estar na mesma rede*

// comandos
docker volume

// criando nosso volume
docker volume create myvolume

// lista todos os volumes existentes
docker volume ls

// removendo um volume
docker volume prune (hash volume)

// inspecionando um volume
docker volume inspect myvolume

Criando e utilizando volumes

// cria um volume
docker volume create myvolue

// rodando uma imagem e atrelando nosso novo volume com -v
docker run -d -p 8082:80 --name nginx24 -v myvolume:/app nginx
// ou
docker run -d -p 8080:80 --name nginx1 --mount type=volume,source=myvolume,target=/app nginx
//e
docker run -d -p 8081:80 --name nginx2 --mount type=volume,source=myvolume,target=/app nginx

Acessando e alterando arquivos de um container

 //lista os diretorios da pasta root do container
docker exec nginx ls

 // acessa o container com nosso bash local
docker exec nginx -it bash

Agora que acessamos nosso container vamos alterar o arquivo index do nginx, caminho: cd /usr/share/nginx/html

sudo nano index.html

Perceba o conceito images, elas são IMUTÁVEIS ou seja, caso nosso container seja removido ao reutilzarmos a imagem que temos em nossa máquina a mesma virá sem as alterações que acabamos de fazer

Dicas adicionais

caso você esteja trabalhando no linux ou mac você poderá adicionar em seu .bashrc ou zshrc alguns atalhos para executar seus comandos

alias d="docker"
alias dcu="docker-compose up"
alias dd="docker-compose up -d"

agora é só sair utilizando as abreviações na hora de rodar seus comandos docker.