Docker
Apostila de Docker
História dos containers - Como surgiu
O que é docker - Visão Geral
- Links docker.com
Docker overview
O Docker é uma plataforma aberta para desenvolvimento, envio e execução de aplicativos. O Docker permite que você separe seus aplicativos de sua infraestrutura para que você possa entregar software rapidamente. Com o Docker, você pode gerenciar sua infraestrutura da mesma maneira que gerencia seus aplicativos. Aproveitando as metodologias do Docker para envio, teste e implantação de código rapidamente, você pode reduzir significativamente o atraso entre a gravação do código e sua execução na produção.
A plataforma Docker
O Docker fornece a capacidade de empacotar e executar um aplicativo em um ambiente isolado vagamente, chamado de contêiner. O isolamento e a segurança permitem que você execute muitos contêineres simultaneamente em um determinado host. Os contêineres são leves porque não precisam da carga extra de um hipervisor, mas são executados diretamente no kernel - Ansible & jenkins: ./devops/Ansible_jenkins.mdda máquina host. Isso significa que você pode executar mais contêineres em uma determinada combinação de hardware do que se estivesse usando máquinas virtuais. Você pode até mesmo executar contêineres do Docker em máquinas host que são, na verdade, máquinas virtuais! O Docker fornece ferramentas e uma plataforma para gerenciar o ciclo de vida de seus contêineres:
- Desenvolva seu aplicativo e seus componentes de suporte usando contêineres.
- O contêiner torna-se a unidade para distribuir e testar seu aplicativo.
- Quando estiver pronto, implante seu aplicativo em seu ambiente de produção, como um contêiner ou um serviço orquestrado. Isso funciona da mesma forma, independentemente do seu ambiente de produção ser um data center local, um provedor de nuvem ou um híbrido dos dois.
Docker Engine
O Docker Engine é uma aplicação cliente-servidor com esses componentes principais:
- Um servidor que é um tipo de programa de longa duração chamado de processo daemon (o comando dockerd).
- Uma API REST que especifica interfaces que os programas podem usar para conversar com o daemon e instruir o que fazer.
- Um cliente da interface da linha de comandos (CLI) (o comando docker).
A CLI usa a API REST do Docker para controlar ou interagir com o daemon do Docker por meio de scripts ou comandos diretos da CLI. Muitos outros aplicativos do Docker usam a API e a CLI subjacentes. O daemon cria e gerencia objetos do Docker, como imagens, contêineres, redes e volumes. Nota: O Docker está licenciado sob a licença Apache 2.0 de software livre.
Para que posso usar o Docker?
Entrega rápida e consistente de seus aplicativos
O Docker simplifica o ciclo de vida de desenvolvimento, permitindo que os desenvolvedores trabalhem em ambientes padronizados usando contêineres locais que fornecem seus aplicativos e serviços. Os contêineres são ótimos para fluxos de trabalho de integração contínua e entrega contínua (CI / CD).
Considere o seguinte cenário de exemplo:
- Seus desenvolvedores escrevem código localmente e compartilham seu trabalho com seus colegas usando contêineres do Docker.
- Eles usam o Docker para empurrar seus aplicativos para um ambiente de teste e executar testes automatizados e manuais.
- Quando os desenvolvedores encontram bugs, eles podem corrigi-los no ambiente de desenvolvimento e reimplementá-los no ambiente de teste para teste e validação.
- Quando o teste é concluído, obter a correção para o cliente é tão simples quanto empurrar a imagem atualizada para o ambiente de produção.
Implantação e dimensionamento responsivos A plataforma baseada em contêineres do Docker permite cargas de trabalho altamente portáteis. Os containers Docker podem ser executados no laptop local de um desenvolvedor, em máquinas físicas ou virtuais em um data center, em provedores de nuvem ou em uma mistura de ambientes. A portabilidade e a natureza leve do Docker também facilitam o gerenciamento dinâmico de cargas de trabalho, ampliando ou derrubando aplicativos e serviços conforme as necessidades de negócios exigem, quase em tempo real.
Executando mais cargas de trabalho no mesmo hardware O Docker é leve e rápido. Ele fornece uma alternativa viável e econômica para as máquinas virtuais baseadas em hipervisor, para que você possa usar mais sua capacidade de computação para atingir suas metas de negócios. O Docker é perfeito para ambientes de alta densidade e para implementações pequenas e médias em que você precisa fazer mais com menos recursos.
Arquitetura Docker
O Docker usa uma arquitetura cliente-servidor. O cliente do Docker fala com o daemon do Docker, que faz o trabalho pesado de construir, executar e distribuir contêineres do Docker. O cliente e o daemon do Docker podem ser executados no mesmo sistema ou você pode conectar um cliente do Docker a um daemon do Docker remoto. O cliente e o daemon do Docker se comunicam usando uma API REST, sobre soquetes UNIX ou uma interface de rede.
O Docker daemon
O daemon do Docker (dockerd) ouve as solicitações da API do Docker e gerencia objetos do Docker, como imagens, contêineres, redes e volumes. Um daemon também pode se comunicar com outros daemons para gerenciar os serviços do Docker.
O cliente do Docker
O cliente do Docker (docker) é a principal maneira de muitos usuários do Docker interagirem com o Docker. Quando você usa comandos como o docker run, o cliente envia esses comandos para o dockerd, que os executa. O comando docker usa a API do Docker. O cliente do Docker pode se comunicar com mais de um daemon.
Registros do Docker Um registro do Docker armazena imagens do Docker. O Docker Hub e o Docker Cloud são registros públicos que qualquer pessoa pode usar, e o Docker é configurado para procurar imagens no Docker Hub por padrão. Você pode até mesmo executar o seu próprio registro privado. Se você usar o Docker Datacenter (DDC), ele inclui o DTR (Registro Confiável do Docker). Quando você usa os comandos de execução do docker pull ou docker run, as imagens necessárias são extraídas do registro configurado. Quando você usa o comando docker push, sua imagem é enviada para o registro configurado. A Docker Store permite que você compre e venda imagens do Docker ou distribua-as gratuitamente. Por exemplo, você pode comprar uma imagem do Docker contendo um aplicativo ou serviço de um fornecedor de software e usar a imagem para implantar o aplicativo em seus ambientes de teste, preparação e produção. Você pode atualizar o aplicativo puxando a nova versão da imagem e reimplantando os contêineres.
Objetos Docker
Ao usar o Docker, você está criando e usando imagens, contêineres, redes, volumes, plug-ins e outros objetos. Esta seção é uma breve visão geral de alguns desses objetos.
IMAGENS
Uma imagem é um modelo somente leitura com instruções para criar um contêiner do Docker. Muitas vezes, uma imagem é baseada em outra imagem, com alguma personalização adicional. Por exemplo, você pode criar uma imagem baseada na imagem do Ubuntu, mas instala o servidor da Web Apache e seu aplicativo, bem como os detalhes de configuração necessários para executar seu aplicativo. Você pode criar suas próprias imagens ou usar somente aquelas criadas por outras pessoas e publicadas em um registro. Para criar sua própria imagem, crie um Dockerfile com uma sintaxe simples para definir as etapas necessárias para criar a imagem e executá-la. Cada instrução em um Dockerfile cria uma camada na imagem. Quando você altera o Dockerfile e recria a imagem, apenas as camadas que foram alteradas são recriadas. Isso faz parte do que torna as imagens tão leves, pequenas e rápidas, quando comparadas a outras tecnologias de virtualização.
CONTAINERS
Um contêiner é uma instância executável de uma imagem. Você pode criar, iniciar, parar, mover ou excluir um contêiner usando a API do Docker ou o CLI. Você pode conectar um contêiner a uma ou mais redes, anexar armazenamento a ele ou até mesmo criar uma nova imagem com base em seu estado atual. Por padrão, um contêiner é relativamente bem isolado de outros contêineres e de sua máquina host. Você pode controlar o quão isolada a rede, o armazenamento ou outros subsistemas subjacentes de um contêiner são de outros contêineres ou da máquina host. Um contêiner é definido por sua imagem e por todas as opções de configuração que você fornece quando cria ou inicia. Quando um contêiner é removido, quaisquer alterações em seu estado que não são armazenadas no armazenamento persistente desaparecem.
Exemplo de comando do docker run
O comando a seguir executa um contêiner ubuntu, conecta-se interativamente à sua sessão de linha de comando local e executa /bin/bash.
docker run -it ubuntu bash
- Se não exitir o container será feito um download do repositório (Registry ou Docker Hub)
- Com CTRL+d mata o container corrente
Quando você executa esse comando, acontece o seguinte (supondo que você esteja usando a configuração de registro padrão):
- Se você não tem a imagem do Ubuntu localmente, o Docker a extrai do seu registro configurado, como se você tivesse executado o docker pull ubuntu manualmente.
- O Docker cria um novo contêiner, como se você tivesse executado manualmente um comando docker container create.
- O Docker aloca um sistema de arquivos de leitura / gravação ao contêiner, como sua camada final. Isso permite que um contêiner em execução crie ou modifique arquivos e diretórios em seu sistema de arquivos local.
- O Docker cria uma interface de rede para conectar o contêiner à rede padrão, pois você não especificou nenhuma opção de rede. Isso inclui atribuir um endereço IP ao contêiner. Por padrão, os contêineres podem se conectar a redes externas usando a conexão de rede da máquina host.
- O Docker inicia o contêiner e executa /bin/bash. Como o contêiner é executado interativamente e conectado ao seu terminal (devido aos sinalizadores -i e -t), você pode fornecer entrada usando o teclado e a saída é registrada no seu terminal.
- Quando você digita exit para finalizar o comando /bin/bash, o contêiner é interrompido, mas não é removido. Você pode iniciá-lo novamente ou removê-lo.
SERVICES
Os services permitem dimensionar contêineres em vários daemons do Docker, que trabalham juntos como um swarm com vários managers e workers. Cada membro de um swarm é um daemon do Docker e todos os daemons se comunicam usando a API do Docker. Um service permite que você defina o estado desejado, como o número de réplicas do service que devem estar disponíveis a qualquer momento. Por padrão, o service é balanceado por carga em todos os workers. Para o usuário, o service Docker parece ser um único aplicativo. O Docker Engine suporta o modo swarm na versão Docker 1.12 e superior.
A tecnologia subjacente
O Docker é escrito em Go e aproveita vários recursos do kernel do Linux para fornecer sua funcionalidade.
Namespaces
O Docker usa uma tecnologia chamada namespaces para fornecer o espaço de trabalho isolado chamado contêiner. Quando você executa um contêiner, o Docker cria um conjunto de namespaces para esse contêiner. Esses namespaces fornecem uma camada de isolamento. Cada aspecto de um contêiner é executado em um namespace separado e seu acesso é limitado a esse namespace. O Docker Engine usa namespaces como os seguintes no Linux:container format O namespace pid: Isolamento do processo (PID: ID do processo). O namespace net: Gerenciando interfaces de rede (NET: Networking). O namespace ipc: Gerenciando o acesso aos recursos do IPC (IPC: InterProcess Communication). O namespace mnt: Gerenciando pontos de montagem do sistema de arquivos (MNT: Mount). O namespace uts: isolando o kernel e os identificadores de versão. (UTS: Unix Timesharing System).
Grupos de controle
O Docker Engine no Linux também depende de outra tecnologia chamada de grupos de controle (cgroups). Um cgroup limita um aplicativo a um conjunto específico de recursos. Grupos de controle permitem que o Docker Engine compartilhe recursos de hardware disponíveis para contêineres e, opcionalmente, imponha limites e restrições. Por exemplo, você pode limitar a memória disponível para um contêiner específico.
Sistemas de arquivos da União
Os sistemas de arquivos da União, ou UnionFS, são sistemas de arquivos que operam criando camadas, tornando-as muito leves e rápidas. O Docker Engine usa o UnionFS para fornecer os blocos de construção dos contêineres. O Docker Engine pode usar várias variantes do UnionFS, incluindo AUFS, btrfs, vfs e DeviceMapper.
Formato de contêiner
O Docker Engine combina os namespaces, os grupos de controle e o UnionFS em um wrapper (embrulho ou pacote) chamado de container format. O formato do contêiner padrão é libcontainer. No futuro, o Docker pode suportar outros formatos de contêiner, integrando-se a tecnologias como BSD Jails ou Solaris Zones.
Só tem docker?!
Não !!
Instalação no Linux
docker
curl -fsSL https://get.docker.com | bash
sudo useradd -g docker beny
docker-compose
base=https://github.com/docker/compose/releases/download/1.23.2 &&
sudo curl -L $base/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose &&
sudo chmod +x /usr/local/bin/docker-compose
docker-machine
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
sudo curl -L $base/docker-machine-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-machine &&
sudo chmod +x /usr/local/bin/docker-machine
Instalando no Windows
- Docker tools
- Windows 10 Professional Aniversáry Edition - Documentação
Instalando MacOS
- Docker MacOS - Documentação
Diretório dos containers
/var/lib/docker/containers/
Stats com nome do container
docker stats $(docker ps --format={{.Names}})
Para descobrir IP de um container
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
Para ver log de um container
docker logs --tail 50 --follow --timestamps postgres-geomk
Salvando imagem para transporte
sudo docker save -o /home/beny/geomk-port-ass-1.2 00ebe6b93ee0
Limite de memória (b, k, m, g)
--memory=1024m ou -m 1024m
--cpus=
Montando o serviço de rede
docker service create --network ingress --name mysql
Para criar uma rede bridge:
docker network create \
--driver=bridge \
--subnet=172.28.0.0/16 \
--ip-range=172.28.5.0/24 \
--gateway=172.28.5.254 \
br-geomk
Definindo rede que o docker utilizará
docker -d -b br-geomk
docker network create --subnet=172.16.8.0/24 geomk-lan
docker network create \
--driver=bridge \
--ip-range=172.16.8.0/24 \
--gateway=172.16.8.254 \
geomk-lan
Definindo rede que o docker utilizará
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.2.11,rw \
--opt device=:/data \
geomk-db-persist
Docker-compose
Docker Machine comandos
Comandos
active Print which machine is active (Imprimir qual máquina está ativa)
config Print the connection config for machine
create Create a machine
env Display the commands to set up the environment for the Docker client
inspect Inspect information about a machine
ip Get the IP address of a machine
kill Kill a machine
ls List machines
provision Re-provision existing machines
regenerate-certs Regenerate TLS Certificates for a machine
restart Restart a machine
rm Remove a machine
ssh Log into or run a command on a machine with SSH.
scp Copy files between machines
mount Mount or unmount a directory from a machine with SSHFS.
start Start a machine
status Get the status of a machine
stop Stop a machine
upgrade Upgrade a machine to the latest version of Docker
url Get the URL of a machine
version Show the Docker Machine version or a machine docker version
help Shows a list of commands or help for one command
Criando VMs no VirtualBox:
for N in 1 2 3; do \
docker-machine create --driver virtualbox \
--virtualbox-cpu-count "2" \
--virtualbox-memory "1024" \
--virtualbox-disk-size "20000" \
node0$N; done;
Usando o SWARM:
Montando cluster:
docker swarm init --advertise-addr 192.16.8.71
Leaving --listen-addr at it's default 0.0.0.0:2377 tells it to listen on all interfaces for requests. You can use this to limit Swarm to only listen on specific interfaces if you have something like a management network that's separate from a public network on your nodes.
The --advertise-addr is the address given out to other nodes in the Swarm for establishing connections and needs to be an address everyone can resolve and reach.
Note that early RC's of 1.12 didn't have --advertise-addr so you may find some instructions indicating --listen-addr should be used. I'd disregard those and use --advertise-addr only unless you have a specific use case.
You are correct, also listen addr is the address which the daemon will be accepting connections, ie. 0.0.0.0:
Criando VMs no Git Bash como administrador para cluster Swarm:
swarm-master:
docker-machine create \
-d hyperv \
--swarm \
--swarm-master \
--swarm-discovery \
token://8b292982d0cef6a3adfc5d4aa0217653 \
--hyperv-virtual-switch Externo \
--hyperv-disk-size 20000 \
--hyperv-memory 2048 \
--hyperv-cpu-count 2 \
swarm-master
swarm-node01:
docker-machine create \
-d hyperv \
--swarm \
--swarm-discovery \
token://8b292982d0cef6a3adfc5d4aa0217653 \
--hyperv-virtual-switch Externo \
--hyperv-disk-size 20000 \
--hyperv-memory 2048 \
--hyperv-cpu-count 2 \
swarm-node01
Usando os parêmetros de saída no demais nós:
docker swarm join --token SWMTKN-1-095e3t4mhsflonb4ozw6m6the8syojifv4r1dkm0tkvjug8c76-bvptlik776ulkt1bakoicbfbk 192.168.99.101:2377
Removendo nomes duplicados na rede do Docker:
docker network inspect geomk_default | grep Name
docker network disconnect -f geomk_default prd-websiac-1.2.3-2