Skip to content

Instantly share code, notes, and snippets.

@renatoapcosta
Last active March 6, 2023 18:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save renatoapcosta/6eb53e52f0d1edfa1dd87beee2ba2689 to your computer and use it in GitHub Desktop.
Save renatoapcosta/6eb53e52f0d1edfa1dd87beee2ba2689 to your computer and use it in GitHub Desktop.
docker

Docker

Definição

O que é o Docker

Docker é uma plataforma para desenvolvimento, provisionamento e execução de aplicações usando tecnologia de containers. Exemplo: Servidor Web, Uma ferramenta de monitorização, um servidor de banco de dados e etc.

Infraestrutura sem uso de container

Virtualização baseada em container

A virtualização baseada em container usa o kernel do sistema operacional hospedeiro para executar varias aplicações que podem rodar em qualquer infra estrutura suportada.

Um container é um isolamente de recurso.

docker

docker_compoe

container_hipervisor

Por que usar Docker ?

Desenvolvedor       Sysadmin           Usuário
Desenvolve uma vez executa em qualquer lugar     Configura uma vez executa em qualquer lugar Tudo que é executado por linha de comando
Sem preocupação de dependências ou pacotes     Elimina inconsistências na entrega das aplicações ou serviços    Instala software em um ambiente isolado
Diversos ambientes de teste Ciclo de trabalho mais eficiente e ágil      Evita conflito de multiplas dependencias

porque_usar

Conceitos e Fundamentos

Arquitetura Docker

arquitetura_docker

  • Docker Engine ⇒ "daemon" que permite que os containers sejam construídos, enviados e executados
  • Docker Client ⇒ recebe as entradas do usuário (CLI) e as envia para a Engine
  • Docker Registry ⇒ software que gerencia o armazenamento das IMAGES
  • Images ⇒ Template usado para criar containers
  • Containers ⇒ Isolamento da aplicação e de recursos. Baseado nas IMAGES
IMAGES CONTAINERS
Template usado para criar containers; Isolamento da aplicaçnao e de recursos;
Pode ser construído pela comunidade ou outros; Contém o necessário para executar uma aplicação
Armazenado no Docker HUB ou Registry local Baseado nas Images

arquitetura_resumo

Imagens e Containers

Introdução ao uso de Imagens

Listando images baixadas

  docker images 
    
  docker images -a

As imagens são especificadas por TAGs

    repositorio:tag

TAG pode ser compreendida como VERSÃO Uma mesma imagem pode ter diversas TAGs. A ultima versão de uma images possui a TAG chamada latest. É aconselhado usar uma tag definitiva, diferente da latest.

Uma imagem possui um ID, que é um hash.

Docker Hub - Repositório de imagens

O Docker Hub é um repositório de imagens.

No Docker Hub, as empresas disponibiliza as versões dockernizada de suas aplicações.

As imagens oficiais possui um nome único. Exemplo: ubuntu, mysql, wordpress.

Outras pessoas da comunidade postas suas imagens com o seu nome_repositorio/nome_imagem.

O Docker Hub pertime que qualquer pessoa ou empresa tenha uma imagem privada, sem custo.

Toda imagem, pelo menos as oficiais, possui todos os detalhes de uso informado no Docker Hub.

Introdução ao uso de containers

Imagens não são containers, mas dão base consistente para que haja um container.

Não há container sem uma imagem.

Para baixar uma imagem hello-world fornecida pelo Docker Hub

  docker pull hello-world

Neste caso está imagem vai ser baixada a versão latest, pois não foi informada nenhuma versão.

Para criar um container dessa imagem

  docker run hello-word

Para executar um container em segundo plano ( use -d )

  docker run -d ubuntu:14.04 ping 127.0.0.1 -c 50

Para executar um container em primeiro plano e iniciar uma iteração com ele. ( use exit para sair )

  docker run -it ubuntu:14.04

Listar containers

    docker ps

    docker ps -a

Administração Básica de Containers e Imagens

Iniciando e parando um containers

docker start container_ID

docker stop container_ID

docker kill container_ID

Dando nome para um container

  docker run -it --name nomecontainer debian /bin/bash

Entrando em um containers em execução

Podemos iniciar outro processo do container para executar uma outra tarefa no container já iniciado.

    docker exec -it container_ID /bin/bash

    ps aux | wc-l

Capturando os logs de um container

A opção -f acompanhas as ultimas mensagens de forma iterativa.

    docker logs container_ID

  docker logs -f container_ID

Exibindo informações detalhadas

Retorna um JSON das informações do container

    docker inspect container_ID

Exibindo estatisticas de processamento do container

Quanto de memória, processos etc.

      docker stats container_ID

Copiar um arquivo do host para o container

Copiar do host para o a raiz do container

   docker cp arquivo_host.txt container_ID:/

Copiar do container para o host

  docker cp container_ID:/arquivo_container.txt .

Remover um containers

Um container só pode ser removido se o mesmo estiver parado.

    docker rm container_ID

    docker rm $(docker ps -qa)

    docker rm `docker ps -qa`

Remover images

    docker rmi hashimage|nomedaimage

Criando um container

    docker run

    -- name Nome do container
    -p 8888:8080  Onde ( porta externa : porta interna no container )        
    --link  Indica outro container

Containers como Microserviço

  • Containers: empacotados, leves e projetados para serem executados em qualquer lugar;

  • Multiplos containers: podem ser implantados em uma única VM;

Um microserviço é uma aplicação com uma única função.

  • Ambiente de execução mais enxutos;
  • Melhor isolamento de recursos;
  • Inicialização e execução mais rápidas;

Container Networking

Docker0 ( bridge )

  • "Ponte" entre o host e os containers;
  • Criada no momento da instalação da Engine Docker;
  • Aleatoriamente é criada uma subnet PRIVADA;

Quando criamos um container, é criado uma VIRTUAL ETHERNET ( VETH )

  • Camada que permite determinado container ter sua própria "eth";
  • Cada container recebe automaticamente um endereço IP do segmento da bridge0;
  • Interface virtual é criada no host;

Nenhum container é acessado diretamente pelo seu endereço de IP entregue pela bridge0.

network

  docker exec -it container_ID ip a

Acesso externo ao container através do mapeamento de portas

O serviço do container precisa ser acessado externamente. Usamos o mapeamento de portas para o acesso.

portas

O mapeamento de porta pode ser feito de forma manual ou automática.

1 porta do host : 1 porta do container

Parametros opcionais no docker run: -p (manual) -P (automatico)

Exemplo:

  docker run -d -p 8080:80 httpd
  
  docker run -d -P httpd

Criação de imagens personalizadas

Por padrão o docker não efetiva os comandos executados em um container.

Vamos personalizar uma imagem.

criacao_image

Vamos acessar o container e modifica - lo.

  docker run -d -p 8080:80 httpd
  
  docker exec -it container_ID bash
  
  cd /usr/local/apache2/htdocs

     echo "Hello Container Modificado" >> index.html

  exit

Vamos remover o container e verificar que as modificações serão perdidas.

  docker stop container_ID
  
  docker rm container_ID
  
  docker run -d -p 8080:80 httpd

Criando um container personalizado e persistindo em uma nova imagem

    docker run -it --name container_base ubuntu:14.04 bash

    # apt-get update && apt-get install -y apache2
    # echo "Hello Container Modificado" >> index.html
    # exit

    docker commit -m "Message" nomecontainer nomeimagem_novocontainer

    docker run -it nomeimagem_novocontainer

    Obs: nomeimagem_novocontainer pode ser ubuntu/apache especializando o nome atual

Criar um container test e remover quando finalizar

    docker run --rm -it ubuntu bash

    # apt-get update && apt-get install -y apache2

    # exit

Dockerfile

Um Dockerfile é um arquivo de configuração que contém instrução para a criação de uma imagem Docker.

Usa da instrução para automatizar o processo de criação de imagens.

dockerfile

Esse metodo é melhor que entrar em um container, modificar e comitar, pois o processo se torna mais robusto.

Dockerfile Instruções

   FROM - indica a imagem base
   MAINTAINER - informa o autor da imagem
   RUN - Indica o que será executado para a criaçnao da imagem
   EXPOSE - informa qual porta o container irá escutar
   CMD - define um comando padrão que será executado quando o container for criado
   ENTRYPOINT - Precede a instrução CMD
   ADD - Copia um arquivo do host, mesmo sendo uma URL, para dentro da imagem
   COPY - Copia um arquivo do host para dentro da imagem

      Para criar a imagem usamos docker build

  docker build -t renatoapcosta/nome_imagem_nova .

O ponto final indica onde se encontra o arquivo Dockerfile

Exemplo Dockerfile:

  FROM debian
  MAINTAINER Renato Costa<email@gmail.com>
  RUN apt-get update
  RUN apt-get install -y nginx
  ADD index.html /var/www/html/
  EXPOSE 80

     ENTRYPOINT ["/usr/sbin/nginx"]      CMD ["-g", "daemon off;"]

Na pasta que está o Dockerfile, colocar um arquivo index.html.

  docker build -t renatoapcosta/nginx:1.0 .

Volumes Docker

Um container é um elemento volatil.

Um volume é uma pasta do container que é designado (mapeado) para persistir seus dados, independente do ciclo de vida do container.

É fazer um canal de comunição entre o host e o container.

Volumes:

  • Permite manter os dados, mesmo quando o container é deletado;
  • É mapeado num diretório do host, em outro container ou em um volume;
  • Volumes são mapeados quando um container é criado;

Volume entre o Host e o Container

Uma pasta do host é mapeado como volume. O volume é salvo no proprio host. Mesmo quando se apagar o container, os dados fica no host. Ponto negativo dessa configuração é a escalabilidade.

  docker run -d -name web_pasta -v /home/user/site:/usr/local/apache2/htdocs -p 8080:80 httpd

Container como Volume

Nesse configuração criamos um container para receber os dados.

volume-container

Criamos o container de volume com base em uma imagem de sistema operacional.

  docker create -v /usr/local/apache2/htdocs --name datacontainer ubuntu:14.04
  
  docker run -d --name web_volumes --volumes-from datacontainer -p 8080:80 httpd

Shared Storage Volume

É um tipo mais recente.

volume-shared

Esse é o mais adequado e mais seguro de mapeamento de volumes.

  docker volume create --name datastore
  
  docker volume ls
  
 
  
  docker run -it --name cont_volume -v datastore:/tmp ubuntu:14.04

Para apagar o container

  docker volume rm datastore 

Comunicação entre containers

Estabelecer conexões entre containers para oferecer serviços mais completos.

Comunicação entre container é usado para, de maneira segura, transferir dados de um para outro.

Linking

Esse é um metódo obsoleto, mas o mais facíl.

Basta acrescentar um parametro no docker run, --link nomecontainer a ser linkado.

  • Container de origem tem acesso aos dados do container de destino;
  • Linking permite conexão entre containers através dos seus respectivos nomes;

Exemplo, configurar um mysql com

docker pull mysql:5.7

docker run -it --name mysql_db -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=root -e MYSQL_PASSWORD=root -p 3306:3306 -d mysql:5.7

docker run -d -p 8080:80 --name php --link mysql_db:db -v /home/user/site:/var/www/html php:5.6-apache

docker ps -l

docker exec php docker-php-ext-install mysqli

docker exec -it mysql_db bash

docker exec -it mysql_db mysql -uroot -p

mysql -h 127.0.0.1 -u root -p

Docker Network

Usando o docker network

docker_network

  • Sucessor do método "linking";

  • Usuários pode criar diversas redes próprias;

  • Permite a comunicação entre containers através dos seus respectivos nomes;

    docker network create redeA
    
    docker network ls
    
    docker run -itd --name ubuntu1 --network=redeA ubuntu:14.04
    
    docker run -itd --name ubuntu2 --network=redeA ubuntu:14.04
    
    docker exec -it ubuntu1 bash
    
    # ping ubuntu2
    
    docker network disconnect redeA ubuntu1
    
    docker network disconnect redeA ubuntu2
    
    docker network rm redeA
    
    docker network ls
    

Docker sem sudo

Adicionando o usuario corrente no grupo para usar o docker sem sudo.

sudo gpasswd -a $USER docker

Imagem para o Docker Hub

Crie uma conta no Docker Hub

Para fazer o login

  docker login

Para renomear uma imagem

  docker tag nomeold/imagemold nomelogin/imagem:versao
  
  docker push nomelogin/imagem:versao

Docker Compose

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment