Docker
Docker funciona como processos (containers) dentro do nosso sistema operacional.
É mais leve que uma máquina virtual justamente por se comportar como processos.
No Docker termos diversos tipos de isolamento (NAMESPACES):
PID – Provê isolamento dos processos rodando dentro do container.
NET – Provê isolamento das interfaces de rede.
IPC – Provê isolamento da comunicação entre processos e memória compartilhada.
MNT – Provê isolamento do sistema de arquivos / pontos de montagem
UTS – Provê isolamento do kernel. Age como se o container fosse outro host.
Os CGROUPS servem para indicar como vamos fazer o gerenciamento e o compartilhamento
dos recursos entre os containers.
docker ps (docker container ls ) – lista todos os containers em execução
docker ps -a (Docker container ls -a) – lista todos os containers mesmo os que não estiverem
em execução
Para um container ficar em execução é necessário que exista pelo menos um processo em
execução rodando dentro dele.
Quando utilizamos o docker run buscamos a imagem localmente, caso não encontre é feito o
download do Docker hub em seguida é feita a validação desta imagem entregue pelo
dockerhub (via sha) e em seguida é executado o container.
Para pararmos um container em execução utilizamos o docker stop +CONTAINER_ID ou
docker stop +NAME.
Para re-executar um container que está parado utilizamos o docker start +CONTAINER_ID. Só
conseguimos utilizar o Docker start se o container que estamos tentando iniciar está no estado
parado e vice-versa.
Para interagir com o container podemos utilizar o comando docker exec -it +CONTAINER_ID
+comando.
Ao utilizar o docker stop +CONTAINER_ID todos os processos que estão sendo executados no
container são reiniciados novamente(kill).
Se utilizarmos o docker pause +CONTAINER_ID os processos existentes dentro do container
ficam apenas pausado. Não conseguimos acessar um container pausado.
Para despausar um container utilizamos o docker unpause +CONTAINER_ID.
CTRL + D sai do container.
Docker run -it ubuntu bash
Docker rm +CONTAINER_ID – deleta o container
docker run -d ubuntu sleep 1d – a tag -d (detached) faz com que o terminal não fique travado
Para o container em execução e o remove:
docker run -d -P dockersamples/static-site: a tag -P habilita o mapeamento de portas do
container com o host
docker port +CONTAINER_ID : mostra quais foram as portas mapeadas correspondentes no
host com as portas do container
Utilizando o -p 8080:80 estou definindo que a porta 8080 do host vai corresponder a porta 80
do container.
Imagens nada mais são do que camadas agrupadas onde cada uma possui um id específico.
docker images pode ser usado para verificar as imagens que possuímos.
docker pull baixa apenas a imagem e não executa ela.
docker history para ver quantas camadas minha imagem possui.
docker inspect para
O docker é inteligente o suficiente para que quando tivermos parte da imagem no container
ele baixa apenas a parte faltando da mesma. Reutilizando as camadas em outras imagens.
Quando temos uma imagem ela se torna ready-only, não podemos alterar ela.
Um container nada mais é do que uma imagem com uma camada adicional de Read and
Write.
Podemos criar as nossas imagens, não é necessário utilizar apenas imagens existentes no
dockerhub. Para isso temos que criar um documento DOCKERFILE como o exemplo a seguir:
Neste documento estou especificando que vou utilizar como imagem base para a criação da
minha imagem o node:14 do dockerhub.
Para criar nossa imagem a partir do dockerfile que criamos utilizamos o comando docker build
-t NOME_DA_IMAGEM .
. serve para demonstrar o contexto atual, na pasta onde está localizado meu dockerfile
dockerfile reference: documentação pra criar uma imagem
Para parar vários containers ao mesmo tempo posso utilizar o comando docker stop $(docker
container ls -q)
No docker file posso explicitar as portas ou qualquer outro tipo de informação para o usuário
utilizando as tags
ARG é utilizando no em tempo de build
ENV é utilizado para ler dentro do container
EXPOSE é utilizado para deixar claro pro usuário o que quisermos
Docker login – u +USUARIO
docker tag é utilizado para renomear uma imagem
Neste caso estou renomeando a imagem felipe1.1 para felipec47/felipe1.0 pois deu acesso
negado ao fazer o docker push no dockerhub.
Ao fazer o push de uma imagem com versão superior (que usa as mesmas camadas) o docker
hub identifica que as camadas já estão no repositor e so faz o push do que é novo.
Eu removo todos os meus containers inclusive os que estão parados. Ao passar $(docker
container ls) estou buscando todos os containers listados, a tag aq serve para pegar os inativos
também (a) e o (q) serve para pegar somente o id.
Comando utilizado para excluir as imagens existentes (TODAS, inclusive inativas [aq]).
Docker ps -s mostra o size do container
PERSISTENCIA NO DOCKER
Com a tag -v estou indicando um volume.
Passando o caminho do meu host /home/Daniel/volume-docker estou informando que este
diretório será o responsável por persistir os dados. E ele corresponderá ao /app no container.
É recomendado utilizar o - - mount para volumes segundo o docker como sendo uma boa
pratica pois ele é mais verboso.
CTRL + D sai do container.
O método mais indicado para utilizar a persistência dos dados é utilizando VOLUMES.
Podemos criar volumes com os comandos abaixo:
Os volumes são gerenciados pelo Docker e independem de estrutura de pastas do sistema,
posso encontrar os meus volumes criados na pasta /var/lib/docker como exemplo acima.
Comando acima cria um volume chamado: meu-volume utilizando o --mount
O TMPFS é utilizado para dados sensíveis, é armazenado na memória do host, quando eu paro
o container o dado some. O tmpfs não escreve na camada de read-write do docker. Só
funciona no host Linux.
Utilizando o docker inspect +id_container eu consigo identificar qual a rede do meu container
Utilizando o docker network ls eu listo todas as conexões de rede que possue meu docker
Podemos conectar containers na mesma rede.
Para nomear um container utilizo o comando passando a tag --name, ex:
docker run -it --name ubuntu1 bash
Para criar uma network com o intuito de conectar dois containers na mesma rede eu posso
utilizar o comando:
Onde o --driver é o tipo de network suportada pelo container e minha-bridge é o nome da
network que estou criando.
Com a network criada podemos então criar o container utilizando o comando:
Onde o --network eu informo a network que eu criei para a conexão entre containers.
Existem 3 tipos de networks no docker BRIDGE, NONE E HOST.
NONE: Ao escolher essa network você dizendo que ela vai ser isolada de comunicação de rede,
nesta configuração não é possível realizar uma conexão de rede.
HOST: Ao escolher essa network é retirado completamento o isolamento entre host e
container, o container irá utilizar a mesma network que o host.
DOCKER COMPOSE
O Docker Compose irá resolver o problema de executar múltiplos containers de uma só vez e
de maneira coordenada, evitando executar cada comando de execução individualmente.
Docker compose up
O docker compose é feito a partir de um arquivo yml similar ao dockerfile, onde setamos quais
containers irão para execução, sua ordem e suas particularidades necessárias.
No docker compose podemos definir a ordem que iremos subir os containers utilizando a tag
depends_on. Com essa tag o container 2 por exemplo, só vai ser executado quando o
container 1 estiver subido. Mas não necessariamente ele espera a aplicação que está dentro
do container 1 ficar pronta para subir o container 2, este controle é a nível de container
apenas e não de aplicações.
docker compose down remove os containers e as redes criadas a partir do arquivo yml
docker compose ps lista os containers
docker compose up -d inicia o compose em modo detached