Skip to content

Instantly share code, notes, and snippets.

@geocarvalho
Last active August 11, 2021 13:31
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save geocarvalho/cf534c107c65e28831fe373acde25e80 to your computer and use it in GitHub Desktop.
Save geocarvalho/cf534c107c65e28831fe373acde25e80 to your computer and use it in GitHub Desktop.
Material de docker do "descomplicando docker 2016"

Descomplicando Docker 2016


O que é Docker

  • Docker é uma plataforma Open Source escrito em Go, que é uma linguagem de programação de alto desempenho desenvolvida dentro do Google, que facilita a criação e administração de ambientes isolados.

Containers vs VMs

Mas por que que o Docker é tão legal?

  • O Docker possibilita o empacotamento de uma aplicação ou ambiente inteiro dentro de um container, e a partir desse momento o ambiente inteiro torna-se portável para qualquer outro Host que contenha o Docker instalado.
  • Isso reduz drasticamente o tempo de deploy de alguma infraestrutura ou até mesmo aplicação, pois não há necessidade de ajustes de ambiente para o correto funcionamento do serviço, o ambiente é sempre o mesmo, configure-o uma vez e replique-o quantas vezes quiser.
  • Outra facilidade do Docker é poder criar suas imagens (containers prontos para deploy) a partir de arquivos de definição chamados Dockerfiles.
  • Não podemos nos esquecer também de que o Docker utiliza como backend default o LXC, com isso é possível definir limitações de recursos por container (memória, cpu, I/O, etc.).

Instalando Docker

  • Veja a versão do seu kernel, já que o Docker só funciona em kernels acima de 3.8
$ uname -r
  • Com o kernel > 3.8, instale o docker
$ curl -fsSL https://get.docker.com/ | sh
  • Finalizado o download, confira a versão usando:
$ docker --version
  • Para visualizar os containers ativos (em execução) use:
$ docker ps

Obs.: Para usar o docker sem sudo use o comando abaixo, após isso deslogue e logue novamente (explicação)

$ sudo usermod -aG docker $USER

Administrando containers Docker

  • Start o primeirio container
$ docker run hello-world

Obs.: Sempre que uma imagem não estiver no seu pc o Docker irá fazer o download no DockerHub

  • Para saber quais imagens você já fez download use:
$ docker images
  • Para visualizar todos os containers da sua máquina use:
$ docker ps -a
  • Startando o primeiro container, real
$ docker run -ti ubuntu /bin/bash

Obs.: -ti indica terminal interativo, ubuntu é a imagem a ser utilizada e /bin/bash é o comando a ser utilizado; Obs2.: Utilizando o -d o container rodará em background; Obs3.: Com --name você pode dar um nome ao seu container; Obs4.: É possível especificar a versão da imagem a ser utilizada:

$ docker run -ti ubuntu:16.04 /bin/bash
  • Para sair do container e finalizar o processo use Ctrl+D;
  • Para sair do container sem finalizar o processo use Ctrl+P+Q;
  • Para voltar para o container ativo pegue o CONTAINER ID usando:
$ docker ps
  • E utilize no lugar do CONTAINER_ID/NAMES o id ou o nome abaixo:
$ docker attach CONTAINER_ID/NAMES
  • Para criar um container sem deixá-lo ativo:
$ docker create --name new_cont ubuntu
  • Para parar um container em execução sem entrar nele, use:
$ docker stop CONTAINER_ID
  • Se arrependeu de parar um container? Ou quer entrar num container inativo? Use:
$ docker start CONTAINER_ID
  • Para pausar um container:
$ docker pause CONTAINER_ID
  • Para despausar um container:
$ docker unpause CONTAINER_ID
  • Para saber quanto seu container esta consumindo:
$ docker stats CONTAINER_ID
  • Para saber como os processos estão consumindo os recursos do seu container:
$ docker top CONTAINER_ID

Retorna os processos dentro do container

  • Para ver os logs do container:
$ docker logs CONTAINER_ID
  • Para remover um container:
$ docker rm CONTAINER_ID
$ docker rm -f CONTAINER_ID

Use -f para remover forçadamente containers que estão em execução. Para containers parados, basta usar o primeiro comando. As imagens continuam intactas.

  • Para remover uma imagem:
$ docker rmi IMAGEM_ID

É possível utilizar o -f para forçar uma remoção.


Limitando CPU e MEM dos containers e como usar Docker Update

  • Se é um container é criado sem especificações ele ficará limitado ao uso total da máquina (host), podendo comprometer outros containers;
  • Com docker inspect você consegue visualizar detalhes do seu container em execução;
$ docker inspect CONTAINER_ID
  • Para saber o máximo de memória que seu container pode utilizar (0 indica sem limite):
$ docker inspect CONTAINER_ID | grep -i mem
  • Para limitar a memória a ser utilizada:
$ docker run -ti --memory 512m --name novo ubuntu

ou -m

  • Para limitar a memória do container em execução:
$ docker update -m 256m CONTAINER_ID 

Em vez de CONTAINER_ID pode usar o name

  • Para limitar o uso de CPU do meu container:
$ docker run -ti --cpu-shares 1024 --name container1 ubuntu

Para verificar se foi atribuido corretamente:

$ docker inspect container1 | grep -i cpu
  • Para limitar o uso de CPU de um container em execução:
$ docker update --cpu-shares 512 container1

Volumes e container data-only

  • Volumes são compartilhamentos entre o container e o host
$ docker run -ti -v /volume ubuntu /bin/bash
  • Quando não espeficificado a pasta do volume, use inspect para detectar a pasta
$ docker inspect CONTAINER_NAME_OR_ID -f {{.Mounts}}
  • Para criar um container com volume mapeado:
$ docker run -ti -v /path/to/my/host/volume:/volume ubuntu
  • Container data-only possui apenas volumes para compartilhar com outros containers
$ docker create -v /data --name dbdados ubuntu
  • Para criar um container que importe os volumes de outro container (dbdados), use --volumes-from:
$ docker run -d -p 5433:5432 --name pgsql1 --volumes-from dbdados -e POSTGRESQL_USER=docker -e POSTGRESQL_PASS=docker -e POSTGRESQL_DB=docker kamui/postgresql

Obs.: -e passa uma variable de ambiente para o container; -p conecta a porta do hosta com uma porta do container.


Dockerfile, Dockerfile e mais Dockerfiles!

  • Parecido com Makefiles, então são arquivos com instruções para construir a sua imagem do docker.
  • FROM é a primeira linha obrigatoriamente porque indica a imagem que está sendo usada para buildar a sua imagem;
  • MAINTAINER indica a pessoa que escrever o Dockerfile;
  • ADD joga um arquivo da pasta host onde está o Dockerfile para o container;
  • CMD são os parâmetros para o ENTRYPOINT;

Se o ENTRYPOINTnão for passado ele se torna o bash, sendo o array do CMD relacionado ao bash.

  • Em LABEL se põe metadata, como versão, fabriacante, descrição, o que achar interessante (comentário);
  • COPY copia arquivos e diretórios do host para o container, não copía arquivos .tar (Quem faz isso é o ADD);
  • ENTRYPOINT indica o principal processo dentro do container, se ele parar o container cai também;
  • ENV determina variáveis de ambiente para o container;
  • EXPOSE mostra a porta do container disponível;
  • RUN é utilizado para rodar comandos, muito ultilizado para instalação de pacotes (Quanto menos RUN menos camadas no container, para diminuir a quantidade de comandos tente concatenar com o &&);
  • USER indica o usário default, que se não for dado será o root;
  • WORKDIR indica o diretório de trabalho que se entra assim que o container for aberto;
  • VOLUME indica a pasta que será compartilhada com o container.

Mais um pouco de Dockerfile e build

  • Para construir um container a partir de um Dockerfile, o primeiro comando se estiver na pasta do Dockerfile ou passar o caminho para a pasta onde está o Dockerfile:
$ docker build .
$ docker build /path/para/o/dir/onde/esta/o/dockerfile/
  • Para tagear uma imagem:
$ docker build -t image_name:1.0 .

. no final se estiver rodando da pasta onde está o Dockerfile

  • Para confirmar:
$ docker images
  • Para criar o container a partir da imagem criada:
$ docker run -ti image_name:1.0

Docker login, docker push, docker pull e o dockerhub

  • Para ver as camadas do container:
$ docker history image_name:1.0
  • Para renomear uma imagem:
$ docker tag IMAGE_ID new_name:1.0
  • Fazer login no Dockerhub
$ docker login
  • Subir uma imagem local para o seu Dockerhub
$ docker push new_name:1.0
  • Para confirmar e saber quais îmagens você possui em seu repositório:
$ docker search user_name
  • Para fazer pull de uma imagem:
$ docker pull user_name/image_name
  • Para utilizar a imagem do pull anterior:
$ docker run -ti user_name/image_name

Criando o seu Docker registry

  • Um distribution local
$ docker run -d -p 5000:5000 --restart=always --name new_name image_name

-d para rodar como um daemon; -p linkar a porta do docker host com a do container; --restart caso o container morra, assim que o docker voltar o container sobe; --name dar nome ao container

  • Para confirmar:
$ docker ps
$ docker images | grep new_name

Configurando opções de rede dos containers

YouTube

  • Passando um servidor de DNS para responder suas requisições
$ docker run -ti --dns 8.8.8.8 debian
$ cat /etc/resolv.conf
  • Dar hostname ao docker
$ docker run -ti --hostname catota debian
$ cat /etc/hostname
  • Como linkar um container a outro
$ docker run -ti --name container1 debian
$ docker run -ti --link container1 --name container2 debian
$ ping container1
$ cat /etc/resolv.conf
$ cat /etc/hosts
  • Como expor a porta do container
$ docker run -ti --expose 80 debian
  • Linkar IP do host com o IP do container
$ docker run -ti --publish 8080:80 debian
$ iptables -t nat -L -n

Mostra o redirect da 8080 para a porta 80 do docker que pode estar rodando o apache por exemplo.

  • Passando um mac adress específico para o container
$ docker run -ti --mac-adress 12:34:de:b0:6b:61 debian
$ ip addr
  • Mudando o conjunto de network (IP e outras infos de rede) do container para o host
$ docker run -ti --net=host debian
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment